ansible-playbook采用yaml语法格式:

主机与用户

---

- hosts: webservers                    #指定主机组或者具体的主机ip

remote_user: root                     #指定账户名,这里为root

tasks:                                        #一个task 可以理解为一个任务

- name: test connection          #任务名称

ping:                                      #具体的任务,是对webservers组的机器执行ping

remote_user: yourname       #定义自己的远程用户

也支持从 sudo 执行命令,这样就在整个paly中都是用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 杀死卡住的任务,再重新运行一次.

Tasks 列表

下面是一种基本的 task 的定义,service moudle 使用 key=value 格式的参数,这也是大多数 module 使用的参数格式:

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 行看起来太长,你可以使用 space(空格) 或者 indent(缩进) 隔开连续的一行:

tasks:

- name: Copy ansible inventory file to client

copy: src=/etc/ansible/hosts dest=/etc/ansible/hosts

owner=root group=root mode=0644

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

---

- hosts: webservers

gather_facts: no

remote_user: root

vars:

vhost: xxx

tasks:

- name: create a virtual host file for {{ vhost }}

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

这些变量在 tempates 中也是可用的

Handlers: 在发生改变时执行的操作

例子,当一个文件的内容被改动时,重启两个 services:

- name: template configuration file

template: src=template.j2 dest=/etc/foo.conf

notify:

- restart memcached

- restart apache

‘notify’ 下列出的即是 handlers.

Handlers 也是一些 task 的列表,通过名字来引用,它们和一般的 task 并没有什么区别.Handlers 是由通知者进行 notify, 如果没有被 notify,handlers 不会执行.不管有多少个通知者进行了 notify,等到 play 中的所有 task 执行完成之后,handlers 也只会被执行一次.

这里是一个 handlers 的示例:

handlers:

- name: restart memcached

service:  name=memcached state=restarted

- name: restart apache

service: name=apache state=restarted

Handlers 最佳的应用场景是用来重启服务,或者触发系统重启操作.除此以外很少用到了.

注意:handlers 会按照声明的顺序执行

执行一个 playbook

示例是并行的运行 playbook,并行的级别 是10(译者注:是10个并发的进程?):

ansible-playbook playbook.yml -f 10                 #用 -f 指定10个并发进程

其实指定并发进程也可以在/etc/ansible/ansible.cfg中更改,找到forks。取消注释,将后面的值5改成10保存退出即可

在执行palybook剧本之前 如何检查yml文件的语法是否正确?

ansible-playbook  playbook.yml   --syntax-check

ansible-playbook  playbook.yml   --check

在执行一个 playbook 之前,想看看这个 playbook 的执行会影响到哪些 hosts:

ansible-playbook playbook.yml --list-hosts