记得刚来上海的时候,叶神给了我一本奶牛书:《奔跑吧, Ansible》。时隔一年,我居然有了写 Ansible 脚本的需求。
安装
pip install ansible
配置主机
在安装完 ansible 之后,需要在 /etc 下创建一个 ansible 文件夹,并在里面添加一个 hosts 文件,因为 ansible 会默认在 /etc/ansible/hosts
中寻找主机的配置。
因为 macOS 下 etc 文件夹不能编辑或者因为其他原因,可以通过 -i 指定 hosts 的位置。
可以创建一个 hosts 文件:
[local]
10.8.0.164
[blog]
150.95.155.202 ansible_user=user ansible_port=2222
[]
内为 target, 可以通过 targets 来对主机进行分组管理。
每一行包含一个 ip 或者域名,host 好支持一些表达式。
在每个 ip 后面可以加一些特殊的参数,比如 SSH 用户名,SSH 端口,密钥等。
详细配置可见: http://docs.ansible.com/ansible/latest/intro_inventory.html
配置完 hosts 文件之后便可以进行 ping:
$ ansible -i hosts all -m ping
10.8.0.164 | SUCCESS => {
"changed": false,
"ping": "pong"
}
150.95.155.202 | SUCCESS => {
"changed": false,
"ping": "pong"
}
也可以对某一组的主机进行 ping:
$ ansible -i hosts blog -m ping
150.95.155.202 | SUCCESS => {
"changed": false,
"ping": "pong"
}
执行
当能够连接上主机之后,便能对某个或者某组主机执行命令了:
$ ansible -i hosts local -m service -a "name=docker state=restarted" --become --ask-sudo-pass
SUDO password:
10.8.0.164 | SUCCESS => {
"changed": true,
"name": "docker",
"state": "started"
}
其中 -m
是选择使用的模块, ansible 有大量的模块可以使用, 不同的模块负责管理不同的功能,对 ansible 的学习也就是对这些模块熟悉的过程。
--become
是作为某个用户来执行,如果添加整个参数,或默认尝试使用 root
, 如果需要密码的话,还需要输入密码相关的参数, 权限相关的参数见:
Privilege Escalation Options:
control how and which user you become as on target hosts
-s, --sudo run operations with sudo (nopasswd) (deprecated, use
become)
-U SUDO_USER, --sudo-user=SUDO_USER
desired sudo user (default=root) (deprecated, use
become)
-S, --su run operations with su (deprecated, use become)
-R SU_USER, --su-user=SU_USER
run operations with su as this user (default=root)
(deprecated, use become)
-b, --become run operations with become (does not imply password
prompting)
--become-method=BECOME_METHOD
privilege escalation method to use (default=sudo),
valid choices: [ sudo | su | pbrun | pfexec | doas |
dzdo | ksu | runas ]
--become-user=BECOME_USER
run operations as this user (default=root)
--ask-sudo-pass ask for sudo password (deprecated, use become)
--ask-su-pass ask for su password (deprecated, use become)
-K, --ask-become-pass
ask for privilege escalation password
使用 root 用户:
Hypo-MBP:~ hypo$ ansible -i hosts local -a "whoami"
10.8.0.164 | SUCCESS | rc=0 >>
hypo
Hypo-MBP:~ hypo$ ansible -i hosts local -a "whoami" --become --ask-su-pass
SUDO password:
10.8.0.164 | SUCCESS | rc=0 >>
root
Playbook
通过命令行总归不是优雅的姿势,还是需要能存储的固定的脚本,每次部署的时候运行这个脚本,在 ansible 里便是 playbook。
NEXT 见:Ansible Playbook