Ansible 系列之 Ad-Hoc,ansible系列ad-hoc


通过上一篇,我们应该对 Ansible 有了一个初步的了解,Ansible 是可以批量管理远程主机的。

实际上,Ansible 提供了两种完成管理的方式的:一种是 Ad-Hoc,即 ansible 命令,上一篇中所使用的就是 Ad-Hoc;另外一种就是 Ansible-playbook,它是对 Ad-Hoc 进行的封装,可以进行任务编排。

Ad-Hoc 命令是一种可以快速输入的命令,而且不需要保存起来的命令,相当于 bash 中的一句话 shell。而 playbook 适合于解决更为复杂的任务,相当于 shell scripts。

本篇主要对 Ad-Hoc 命令进行讲解。

ansible 命令参数详解

ansible 命令用法如下:

ansible <host-pattern> [options]

使用 ansible -h 命令就可以列出所有的命令参数,下面列举了常用的一些参数。

  • -v--verbose:输出详细执行信息,-vvv 可以得到执行过程中的所有信息
  • -i INVENTORY--inventory=INVENTORY--inventory-file=INVENTORY:指定 inventory 文件,默认使用 /etc/ansible/hosts
  • -f FORKS--forks=FORKS:执行时并发的线程个数,默认为 5
  • -m MODULE_NAME:指定 module,默认为 command 模块
  • -a MODULE_ARGS:指定 module 的参数
  • -k:提示输入密码
  • -o:精简输出内容
  • -s--sudo:使用 sudo 执行
  • -t TREE:输出执行信息到 TREE 目录下
  • -T SECONDS:指定连接远程主机的超时时长,单位是秒
  • -l SUBSET--limit=SUBSET:指定运行的主机
  • --list-hosts:列出主机列表,并不会执行其他操作

Ad-Hoc 使用示例

在任意目录下新建 hosts 文件,并将主机信息写入:

[test]
10.10.91.[151:153]


[all:vars]
ansible_user=root
ansible_password=pass

-i –list-hosts 示例

# ansible -i hosts all --list-hosts
  hosts (3):
    10.10.91.151
    10.10.91.152
    10.10.91.153

-l 示例

# ansible -i hosts test -m ping -l 10.10.91.151
10.10.91.151 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

# ansible -i hosts test -m ping --limit=10.10.91.151
10.10.91.151 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

-m -o 示例

# ansible -i hosts test -m ping -o
10.10.91.151 | SUCCESS => {"changed": false, "ping": "pong"}
10.10.91.153 | SUCCESS => {"changed": false, "ping": "pong"}
10.10.91.152 | SUCCESS => {"changed": false, "ping": "pong"}

-o 参数简化了输出。

-k 示例

不指定 module,默认将使用 command模块。

# ansible -i hosts test -m ping -l 10.10.91.151 -k
SSH password: 
10.10.91.151 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

-k 参数会在运行时要求输入密码。

ansible 命令参数使用举例就先到这里,其他参数可以自己进行尝试,有问题可以留言讨论。

ansible 命令执行流程

可以通过 -vvv 参数打印出全部执行流程信息来进行分析。

# ansible -i hosts test -m command -a 'whoami' -l 10.10.91.151  -vvv
# 打印本机 Ansible 信息
ansible 2.5.3
  config file = /etc/ansible/ansible.cfg
  configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python2.7/site-packages/ansible
  executable location = /usr/bin/ansible
  python version = 2.7.5 (default, Nov  6 2016, 00:28:07) [GCC 4.8.5 20150623 (Red Hat 4.8.5-11)]
Using /etc/ansible/ansible.cfg as config file
Parsed /root/hosts inventory source with ini plugin
META: ran handlers
Using module file /usr/lib/python2.7/site-packages/ansible/modules/commands/command.py

# 建立连接
<10.10.91.151> ESTABLISH SSH CONNECTION FOR USER: root
<10.10.91.151> SSH: EXEC sshpass -d12 ssh -C -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no -o User=root -o ConnectTimeout=10 -o ControlPath=/root/.ansible/cp/631a9e2de7 10.10.91.151 '/bin/sh -c '"'"'echo ~root && sleep 0'"'"''
<10.10.91.151> (0, '/root\n', '')
<10.10.91.151> ESTABLISH SSH CONNECTION FOR USER: root

# 新建临时目录,用于存放 Ansible 远程执行脚本
<10.10.91.151> SSH: EXEC sshpass -d12 ssh -C -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no -o User=root -o ConnectTimeout=10 -o ControlPath=/root/.ansible/cp/631a9e2de7 10.10.91.151 '/bin/sh -c '"'"'( umask 77 && mkdir -p "` echo /root/.ansible/tmp/ansible-tmp-1528870191.73-1778528026621 `" && echo ansible-tmp-1528870191.73-1778528026621="` echo /root/.ansible/tmp/ansible-tmp-1528870191.73-1778528026621 `" ) && sleep 0'"'"''
<10.10.91.151> (0, 'ansible-tmp-1528870191.73-1778528026621=/root/.ansible/tmp/ansible-tmp-1528870191.73-1778528026621\n', '')

# 将临时脚本重命名,并存放临时目录 /root/.ansible/tmp/
<10.10.91.151> PUT /root/.ansible/tmp/ansible-local-32530hX90rN/tmpzYOaBi TO /root/.ansible/tmp/ansible-tmp-1528870191.73-1778528026621/command.py
<10.10.91.151> SSH: EXEC sshpass -d12 sftp -o BatchMode=no -b - -C -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no -o User=root -o ConnectTimeout=10 -o ControlPath=/root/.ansible/cp/631a9e2de7 '[10.10.91.151]'
<10.10.91.151> (0, 'sftp> put /root/.ansible/tmp/ansible-local-32530hX90rN/tmpzYOaBi /root/.ansible/tmp/ansible-tmp-1528870191.73-1778528026621/command.py\n', '')

# 为临时脚本增加可执行权限
<10.10.91.151> ESTABLISH SSH CONNECTION FOR USER: root
<10.10.91.151> SSH: EXEC sshpass -d12 ssh -C -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no -o User=root -o ConnectTimeout=10 -o ControlPath=/root/.ansible/cp/631a9e2de7 10.10.91.151 '/bin/sh -c '"'"'chmod u+x /root/.ansible/tmp/ansible-tmp-1528870191.73-1778528026621/ /root/.ansible/tmp/ansible-tmp-1528870191.73-1778528026621/command.py && sleep 0'"'"''
<10.10.91.151> (0, '', '')

# 用 python 执行临时脚本
<10.10.91.151> ESTABLISH SSH CONNECTION FOR USER: root
<10.10.91.151> SSH: EXEC sshpass -d12 ssh -C -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no -o User=root -o ConnectTimeout=10 -o ControlPath=/root/.ansible/cp/631a9e2de7 -tt 10.10.91.151 '/bin/sh -c '"'"'/usr/bin/python /root/.ansible/tmp/ansible-tmp-1528870191.73-1778528026621/command.py && sleep 0'"'"''
<10.10.91.151> (0, '\r\n{"changed": true, "end": "2018-06-13 14:24:04.748427", "stdout": "root", "cmd": ["whoami"], "rc": 0, "start": "2018-06-13 14:24:04.746439", "stderr": "", "delta": "0:00:00.001988", "invocation": {"module_args": {"warn": true, "executable": null, "_uses_shell": false, "_raw_params": "whoami", "removes": null, "creates": null, "chdir": null, "stdin": null}}}\r\n', 'Shared connection to 10.10.91.151 closed.\r\n')

# 删除临时目录
<10.10.91.151> ESTABLISH SSH CONNECTION FOR USER: root
<10.10.91.151> SSH: EXEC sshpass -d12 ssh -C -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no -o User=root -o ConnectTimeout=10 -o ControlPath=/root/.ansible/cp/631a9e2de7 10.10.91.151 '/bin/sh -c '"'"'rm -f -r /root/.ansible/tmp/ansible-tmp-1528870191.73-1778528026621/ > /dev/null 2>&1 && sleep 0'"'"''
<10.10.91.151> (0, '', '')
10.10.91.151 | SUCCESS | rc=0 >>
root

META: ran handlers
META: ran handlers

从上面的分析可以看出,Ansible 无非是使用 SSH 与远程主机建立连接,并对命令进行封装。只不过 Ansible 更加优雅,后面使用 playbook 时会更有这种感觉。


您的关注是我坚持写作的动力,如果觉得有用,欢迎关注我的微信,海量学习资源免费送!

相关内容

    暂无相关文章