ansble 常识 Ansible 是什么 Ansible能做什么 Ansible 主机 匹配列表 Ansible 的命令执行过程 执行结果状态

ansble 常识
Ansible 是什么
Ansible能做什么
Ansible 主机 匹配列表
Ansible 的命令执行过程
执行结果状态

运维岗位

ansble 常识
Ansible 是什么
Ansible能做什么
Ansible 主机 匹配列表
Ansible 的命令执行过程
执行结果状态

Ansible 简单的说是一个配置管理系统(configuration management system)。你只需要可以使用 ssh 访问你的服务器或设备就行。它也不同于其他工具,因为它使用推送的方式,而不是像 puppet 等 那样使用拉取安装agent的方式。你可以将代码部署到任意数量的服务器上!

Ansible能做什么

ansible可以帮助我们完成一些批量任务,或者完成一些需要经常重复的工作。
比如:同时在100台服务器上安装nginx服务,并在安装后启动它们。
比如:将某个文件一次性拷贝到100台服务器上。
比如:每当有新服务器加入工作环境时,你都要为新服务器部署某个服务,也就是说你需要经常重复的完成相同的工作。
这些场景中我们都可以使用到ansible
ansble 常识
Ansible 是什么
Ansible能做什么
Ansible 主机 匹配列表
Ansible 的命令执行过程
执行结果状态

注意事项

 执行ansible的主机一般称为主控端,中控,master或堡垒机
 主控端Python版本需要2.6或以上
 被控端Python版本小于2.4需要安装python-simplejson
 被控端如开启SELinux需要安装libselinux-python
 windows不能做为主控端

配置文件

配置文件或指令 描述
/etc/ansible/ansible.cfg 主配置文件,配置ansible工作特性
/etc/ansible/hosts 主机清单
/etc/ansible/roles/ 存放角色的目录
/usr/bin/ansible 主程序,临时命令执行工具
/usr/bin/ansible-doc 查看配置文档,模块功能查看工具
/usr/bin/ansible-galaxy 下载/上传优秀代码或Roles模块的官网平台
/usr/bin/ansible-playbook 定制自动化任务,编排剧本工具
/usr/bin/ansible-pull 远程执行命令的工具
/usr/bin/ansible-vault 文件加密工具
/usr/bin/ansible-console 基于Console界面与用户交互的执行工具




Ansible 配置文件

Ansible 配置文件/etc/ansible/ansible.cfg (一般保持默认)
 [defaults]
 #inventory = /etc/ansible/hosts # 主机列表配置文件
 #library = /usr/share/my_modules/ # 库文件存放目录
 #remote_tmp = $HOME/.ansible/tmp #临时py命令文件存放在远程主机目录
 #local_tmp = $HOME/.ansible/tmp # 本机的临时命令执行目录
 #forks = 5 # 默认并发数
 #sudo_user = root # 默认sudo 用户
 #ask_sudo_pass = True #每次执行ansible命令是否询问ssh密码
 #ask_pass = True      #连接时提示输入ssh密码
 #remote_port = 22     #远程主机的默认端口,生产中这个端口应该会不同
 #log_path = /var/log/ansible.log #日志
 #host_key_checking = False # 检查对应服务器的host_key,建议取消注释。也就是不会弹出
                                Are you sure you want to continue connecting (yes/no)? 

Ansible 主机 匹配列表

通配符

注意用单引号
*  匹配任意字符
#ansible '*' -m ping   等同于 #ansible all -m ping

#ansible '*dns*' -m ping
6-dns-1.hunk.tech | SUCCESS

? 匹配单个字符
#ansible '192.168.7.20?' -m ping
192.168.7.201 | SUCCESS
192.168.7.203 | SUCCESS
192.168.7.202 | SUCCESS
192.168.7.200 | SUCCESS

: 或者
#ansible '192.168.7.201:192.168.7.254' -m ping
192.168.7.201 | SUCCESS
192.168.7.254 | SUCCESS

:& 并且  (逻辑与)
#ansible 'test3:&test' --list

  hosts (1):
    192.168.7.254

:! 逻辑非。在test3组内,但是并不在test组内
#ansible 'test3:!test' --list       > 用到感叹号的时候,记得引号为单引号,否则会被bash解析为历史命令

  hosts (2):
    192.168.7.200
    192.168.7.203

使用正则表达式
~表示后面是正则匹配,注意~后面不能有空格
#ansible '~[67]-(db|dns).*.hunk.*' --list

  hosts (2):
    6-dns-1.hunk.tech
    7-db-3.hunk.tech

这里写一条正则的坑,我们在用bash脚本的时候,匹配数字可以使用[0-9]或[[:digit:]],在用Ansible的时候,我们来看下不同的效果吧

#cat /etc/ansible/hosts 

[web]
6web-1.hunk.tech
7web-0.hunk.tech
7web-2.hunk.tech

[group:children]
dns
db

[dns]
6-dns-1.hunk.tech

[db]
7-db-3.hunk.tech
[test2]
192.168.7.[200:203]
192.168.7.254
[test]
192.168.7.254

[test3]
192.168.7.200
192.168.7.254
192.168.7.203

DNS都是可以正确解析出来的,不要怀疑
6-dns-1.hunk.tech.  600 IN  A   192.168.7.254
6-web-1.hunk.tech.  600 IN  A   192.168.7.201
7-db-3.hunk.tech.   600 IN  A   192.168.7.203
7-web-0.hunk.tech.  600 IN  A   192.168.7.200
7-web-2.hunk.tech.  600 IN  A   192.168.7.202

#ansible '~^[[:digit:]]' --list     有人说这种写法会报错,可是主机都是centos7.4,版本都是一样
  hosts (7):                         这里匹配出7台主机
    192.168.7.200
    192.168.7.201
    192.168.7.202
    192.168.7.203
    192.168.7.254
    6-dns-1.hunk.tech
    7-db-3.hunk.tech

#ansible '~^[0-9]' --list
  hosts (10):                       这里匹配出10台主机
    6web-1.hunk.tech
    6-dns-1.hunk.tech
    7-db-3.hunk.tech
    7web-0.hunk.tech
    7web-2.hunk.tech
    192.168.7.254
    192.168.7.201
    192.168.7.200
    192.168.7.203
    192.168.7.202

#ansible '~^[[:digital:]]' --list
  hosts (10):                       这里匹配出10台主机
    6web-1.hunk.tech
    7web-0.hunk.tech
    7web-2.hunk.tech
    192.168.7.200
    192.168.7.201
    192.168.7.202
    192.168.7.203
    192.168.7.254
    6-dns-1.hunk.tech
    7-db-3.hunk.tech

不同软件对正则的表达都不一样,还是用那些通用性强的吧。

[0-9]纯数字
[a-zA-Z0-9]数字和字母

Ansible 的命令执行过程

以 ansible db -m command -a 'ls -l /' -vvv 这条命令为例,根据显示的信息时行解读

1. 加载自己的配置文件,默认/etc/ansible/ansible.cfg
    Using /etc/ansible/ansible.cfg as config file

2.匹配主机清单
    Parsed /etc/ansible/hosts inventory source with ini plugin

3. 加载指令对应的模块文件,如command,生成.py的文件到本机的临时目录,这个目录就是在/etc/ansible/ansible.cfg定义的
    Using module file /usr/lib/python2.7/site-packages/ansible/modules/commands/command.py
    PUT /tmp/tmp4JvsLH TO /root/.ansible/tmp/ansible-tmp-1517301292.6-155771303493861/command.py

4. 通过ansible将模块或命令生成对应的临时py文件,并将该文件传输至远程服务器的对应执行用户$HOME/.ansible/tmp/ansible-tmp-数字/XXX.PY文件,
    这个目录就是在/etc/ansible/ansible.cfg定义的
    ( umask 77 && mkdir -p "` echo /root/.ansible/tmp/ansible-tmp-1517301292.6-155771303493861 `" ....)
    sftp> put /tmp/tmp4JvsLH /root/.ansible/tmp/ansible-tmp-1517301292.6-155771303493861/command.py
'

5. 给文件+x 权限
    'chmod u+x /root/.ansible/tmp/ansible-tmp-1517301292.6-155771303493861/ /root/.ansible/tmp/ansible-tmp-1517301292.6-155771303493861/command.py && sleep 0'

6. 执行并返回结果
    '/usr/bin/python /root/.ansible/tmp/ansible-tmp-1517301292.6-155771303493861/command.py;

7. 删除临时py文件,sleep 0退出
    rm -rf "/root/.ansible/tmp/ansible-tmp-1517301292.6-155771303493861/" > /dev/null 2>&1 && sleep 0

8.断开远程主机连接
    'Shared connection to 7-db-3.hunk.tech closed.
')

执行结果状态

 绿色:执行成功并且不需要做改变的操作

 ×××:执行成功并且对目标主机做变更

 红色:执行失败

可以在配置文件中定义
[colors]
#highlight = white
#verbose = blue
#warn = bright purple
#error = red
#debug = dark gray
#deprecate = purple
#skip = cyan
#unreachable = red
#ok = green
#changed = yellow
#diff_add = green
#diff_remove = red
#diff_lines = cyan