Ad-Hoc Commands
相对于 Ansible Playbook, Ad-Hoc Commands 通过手动执行 ansible CLI 用于快速执行简单的任务,且这些 Commands 不需要特别地保存下来。
ansible CLI 的基础格式为:
ansible <pattern_goes_here> -m <module_name> -a <arguments>
# <pattern_goes_here> 指示了在那些 Groups/Hosts 上执行任务。
# -m <module_name> 指示了使用哪些 Ansible 模块。
# -a <arguments> 指示了传递给 Ansible 模块的参数变量。
- 编辑 Ansible hosts 文件,加入托管节点。
$ vi /etc/ansible/hosts
...
192.168.1.46
192.168.1.227
- 设置免密登陆托管节点。
$ ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.1.46
$ ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.1.227
$ ssh-agent bash
$ ssh-add ~/.ssh/id_rsa
- 测试:
# 测试远程连通性。
$ ansible all -m ping --private-key ~/.ssh/id_rsa
192.168.1.46 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
192.168.1.227 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
# 测试远程执行指令。
$ ansible all -a "/bin/echo hello"
192.168.1.46 | CHANGED | rc=0 >>
hello
192.168.1.227 | CHANGED | rc=0 >>
hello
Hosts Patterns
在 Ansible CLI 种,Patterns 用于指示将被执行远程管理的托管主机或主机组。e.g.
ansible webservers -m service -a "name=httpd state=restarted"
Patterns 有多种表达形式,如下:
- 表示所有托管节点。
all
*
- 表示指定的 Hosts。
# hostname
one.example.com
one.example.com:two.example.com
*.example.com
*.com
# IP addr
192.168.1.50
192.168.1.*
# 应用正则表达式
~(web|db).*\.example\.com
- 表示指定的 Groups:
# 一个 Group
webservers
# 多个 Groups,使用 : 隔开
webservers:dbservers
# 选择 Group 中的第 n 个 Host
webservers[0]
# 选择 Group 中的第 n-m 个 Hosts
webservers[0-25]
# 排除某个 Group 中的成员
webservers:!phoenix
# 选择两个 Groups 中的交集
webservers:&staging
# 更复杂的组合
webservers:dbservers:&staging:!phoenix
指定 User 来执行任务
默认会使用管理主机当前的 User 来进行 SSH,也可以显式地指定 username:
# as bruce
$ ansible all -m ping -u bruce
# as bruce, sudoing to root
$ ansible all -m ping -u bruce --sudo
# as bruce, sudoing to batman
$ ansible all -m ping -u bruce --sudo --sudo-user batman
如果想通过 sudo 去执行命令:
ansible atlanta -a "/usr/bin/foo" -u username --sudo
也可以通过 sudo user(使用 sudo 切换到其它 User)去执行命令:
ansible atlanta -a "/usr/bin/foo" -u username --sudo-user <other-user>
并行的执行任务
ssh-agent 会 Fork 出 10 个子进程(bash),以 “每次重启 10 个” 的并行方式执行 reboot 命令:
$ ansible atlanta -a "/sbin/reboot" -f 10