目录
文章目录
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
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
Gathering Facts
Facts(现实状态)代表一个系统中已发现的变量(状态)。这些变量(状态)可以被用来作为是否执行某个任务的判断条件,也可以仅用于获取相关的系统信息。
查看所有的 Facts:
ansible all -m setup
user 模块 — 用户管理
使用 user 模块可以方便的创建账户、删除账户、或是管理现有的账户:
ansible all -m user -a "name=foo password=<crypted password here>"
ansible all -m user -a "name=foo state=absent"
copy/file 模块 — 文件传输
- 以并行的方式同时 SCP 大量的文件到多台 Hosts:
ansible atlanta -m copy -a "src=/etc/hosts dest=/tmp/hosts"
- 同时修改文件的属主和权限:
$ ansible webservers -m file -a "dest=/srv/foo/a.txt mode=600"
$ ansible webservers -m file -a "dest=/srv/foo/b.txt mode=600 owner=mdehaan group=mdehaan"
- 创建目录:
ansible webservers -m file -a "dest=/path/to/c mode=755 owner=mdehaan group=mdehaan state=directory"
- 删除目录/文件:
ansible webservers -m file -a "dest=/path/to/c state=absent"
yum/apt 模块 — 软件包管理
Ansible 提供了对 yum 和 apt 的支持。
- 确认一个软件包已经安装,但不去升级它:
ansible webservers -m yum -a "name=acme state=present"
- 确认一个软件包的安装版本:
ansible webservers -m yum -a "name=acme-1.5 state=present"
- 确认一个软件包还没有安装:
ansible webservers -m yum -a "name=acme state=absent"
service 模块 — 服务进程管理
- 确认某个服务在 webservers Group 上的 Hosts 中都已经启动了:
ansible webservers -m service -a "name=httpd state=started"
- 在 webservers Group 上的 Hosts 中重启某个服务:
ansible webservers -m service -a "name=httpd state=restarted"
- 确认某个服务已经停止了:
ansible webservers -m service -a "name=httpd state=stopped"
git 模块 — 源码部署
Ansible 模块可以接受到 repo change handlers,可以应用在当源码被更新时、Ansible 接受到这个通知后、并执行指定的任务的场景,例如:直接通过 git 部署 APP,然后在部署完成后重启 APP。
ansible webservers -m git -a "repo=git://foo.example.org/repo.git dest=/srv/myapp version=HEAD"
async_status — 后台异步执行
对于需要长时间执行的任务,可以放到后台中异步运行,并在运行过程中,我们也可以有选择的检查其运行的状态。
ansible all -B 3600 -P 0 -a "/usr/bin/long_running_operation --do-stuff"
# -B 1800 表示最多运行 30 分钟。
# -P 60 表示每隔 60s 获取一次状态信息。
检查运行的状态:传递上述指令返回的 Job id。
ansible web1.example.com -m async_status -a "jid=488359678239.2844"