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