Ansible 系列之 Ad-Hoc,ansible系列ad-hoc
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 时会更有这种感觉。
您的关注是我坚持写作的动力,如果觉得有用,欢迎关注我的微信,海量学习资源免费送!
评论暂时关闭