摘自:http://www.ansible.com.cn/docs/playbooks_intro.html


主机与用户

你可以为 playbook 中的每一个 play,个别地选择操作的目标机器是哪些,以哪个用户身份去完成要执行的步骤(called tasks).

osts 行的内容是一个或多个组或主机的 patterns,以逗号为分隔符.

remote_user 就是账户名:


---

- hosts: webservers

  remote_user: root

在每一个 task 中,可以定义自己的远程用户:

---

- hosts: webservers

  remote_user: root

  tasks:

    - name: test connection

      ping:

      remote_user: yourname

支持从 sudo 执行命令:

---

- hosts: webservers

  remote_user: yourname

  sudo: yes

可以仅在一个 task 中,使用 sudo 执行命令,而不是在整个 play 中使用 sudo:

---

- hosts: webservers

  remote_user: yourname

  tasks:

    - service: name=nginx state=started

      sudo: yes

可以登陆后,sudo 到不同的用户身份,而不是使用 root:

---

- hosts: webservers

  remote_user: yourname

  sudo: yes

  sudo_user: postgres

如果你需要在使用 sudo 时指定密码,可在运行 ansible-playbook 命令时加上选项 --ask-sudo-pass (-K). 如果使用 sudo 时,playbook 疑似被挂起,可能是在 sudo prompt 处被卡住,这时可执行 Control-C 杀死卡住的任务,再重新运行一次.

当使用 sudo_user 切换到 非root 用户时,模块的参数会暂时写入 /tmp 目录下的一个随机临时文件. 当命令执行结束后,临时文件立即删除.这种情况发生在普通用户的切换时,比如从 ‘bob’ 切换到 ‘timmy’, 切换到 root 账户时,不会发生,如从 ‘bob’ 切换到 ‘root’,直接以普通用户或root身份登录也不会发生. 如果你不希望这些数据在短暂的时间内可以被读取(不可写),请避免在 sudo_user 中传递未加密的密码. 其他情况下,’/tmp’ 目录不被使用,这种情况不会发生.Ansible 也有意识的在日志中不记录密码参数.


Tasks 列表

每一个 play 包含了一个 task 列表(任务列表).一个 task 在其所对应的所有主机上(通过 host pattern 匹配的所有主机)执行完毕之后,下一个 task 才会执行.

重要:

在一个 play 之中,所有 hosts 会获取相同的任务指令,这是 play 的一个目的所在,也就是将一组选出的 hosts 映射到 task.

在运行 playbook 时(从上到下执行),如果一个 host 执行 task 失败,这个 host 将会从整个 playbook 的 rotation 中移除. 如果发生执行失败的情况,请修正 playbook 中的错误,然后重新执行即可.

每个 task 的目标在于执行一个 moudle, 通常是带有特定的参数来执行.在参数中可以使用变量(variables).

modules 具有”幂等”性,意思是如果你再一次地执行 moudle(译者注:比如遇到远端系统被意外改动,需要恢复原状),moudle只会执行必要的改动,只会改变需要改变的地方.所以重复多次执行 playbook 也很安全.

每一个 task 必须有一个名称 name,这样在运行 playbook 时,从其输出的任务执行信息中可以很好的辨别出是属于哪一个 task 的. 如果没有定义 name,‘action’ 的值将会用作输出信息中标记特定的 task.

tasks:

  - name: make sure apache is running

    service: name=httpd state=running

特别的两个 modudle 是 command 和 shell ,它们不使用 key=value 格式的参数,而是这样:

tasks:

  - name: disable selinux

    command: /sbin/setenforce 0

使用 command module 和 shell module 时,我们需要关心返回码信息,如果有一条命令,它的成功执行的返回码不是0, 你或许希望这样做:

tasks:

  - name: run this command and ignore the result

    shell: /usr/bin/somecommand || /bin/true

或者是这样:

tasks:

  - name: run this command and ignore the result

    shell: /usr/bin/somecommand

    ignore_errors: True

在 action 行中可以使用变量.假设在 ‘vars’ 那里定义了一个变量 ‘vhost’ ,可以这样使用它:

tasks:

  - name: create a virtual host file for ` vhost `

    template: src=somefile.j2 dest=/etc/httpd/conf.d/` vhost `