Ansible 执行任务流程

Ansible 版本:2.8.1

1 . 读取 ansible.cfg 配置文件。

查找配置文件顺序(从上到下):

  • ANSIBLE_CONFIG (environment variable if set)
  • ansible.cfg (in the current directory)
  • ~/.ansible.cfg (in the home directory)
  • /etc/ansible/ansible.cfg

2 . 加载Inventory, 解析hosts文件, 获取远程主机。

3 . 运行收集所有远程主机信息的任务,即setup模块。如果远程主机比较多,会比较耗时间和资源,可以禁用这个功能

4 . 建立ssh连接,获取远程主机的当前用户家目录。

5 . 建立ssh连接,在远程主机建立临时任务文件目录(mkdir -p)。默认~/.ansible/tmp,可在配置文件修改。

6 . 建立ssh连接,获取远程主机Python解释器路径。

7 . 将任务先存放到本地临时目录下的一个.py文件,再通过sftp将任务文件上传到远程主机的临时目录下。

8 . 建立ssh连接,设置远程主机临时目录下任务文件可执行权限。(chmod u+x )

9 . 建立ssh连接,运行远程主机临时目录下的.py文件,执行任务,获取返回输出

10 . 建立ssh连接,删除远程主机临时目录下的Python文件。(rm -f -r )

11 . 如果有下一个任务,继续执行 4 ~ 10。

备注

1 . 每一个 play 包含了一个 task 列表。一个 task 在其所对应的所有主机上执行完毕之后, 下一个 task 才会执行。如果一个 host 执行 task 失败, 那么这个host在后面的task中将不会执行。

2 . pipeline也是openssh的一个特性。在ansible执行每个任务的流程中,有一个过程是将临时任务文件put到一个ansible端的一个临时文件中,然后sftp传输到远端,然后通过ssh连接过去远程执行这个任务。如果开启了pipelining,一个任务的所有动作都在一个ssh会话中完成,也会省去sftp到远端的过程,它会直接将要执行的任务在ssh会话中进行。

但是要注意,如果在ansible中使用了sudo命令的话(ssh user@host sudo cmd),需要在远程主机节点的/etc/sudoers中禁用”requiretty”。或者在ansible的ssh参数上加上”-tt”选项。

1
ssh_args = -C -o ControlMaster=auto -o ControlPersist=60s -tt

之所以要设置/etc/sudoers中的requiretty,是因为ssh远程执行命令时,它的环境是非登录式非交互式shell,默认不会分配tty,没有tty,ssh的sudo就无法关闭密码回显(使用”-tt”选项强制SSH分配tty)。所以出于安全考虑,/etc/sudoers中默认是开启requiretty的,它要求只有拥有tty的用户才能使用sudo,也就是说ssh连接过去不允许执行sudo。