Ansible 初体验

2017/7/25 posted in  坏笔记不如好记性

记得刚来上海的时候,叶神给了我一本奶牛书:《奔跑吧, 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