自动化之Ansible-playbook
Ansible—Playbook(剧本)
剧本文件的结尾:.yml .yaml
基础不好的建议看一下Ansible部署与应用中的Ansible简单操作中的模块的使用
编写剧本格式
注意缩进格式
- hosts: 操作对象
remote_user: 远程操控时使用的主控端用户名
tasks: # 以下为具体执行的任务
- name: 任务描述信息
模块名: 任务操作
- name: 任务描述信息
模块名: 任务操作
...
例:
- hosts: dbserver # 操作对象为主机清单中的dbserver模块
remote_user: root # 远程操控用户为root
tasks:
- name: install vsftpd # 任务描述
yum: name=vsftpd # 安装vsftpd
- name: start vsftpd #任务描述
service: name=vsftpd state=started # 开启vsftpd服务
tags标签
可以通过给每一步的任务添加一个tags标签
- hosts: dbserver # 操作对象为主机清单中的dbserver模块
remote_user: root # 远程操控用户为root
tasks:
- name: install vsftpd # 任务描述
yum: name=vsftpd # 安装vsftpd
tags: vsftpd # 该任务的tags为vsftpd
可以在执行剧本时,仅执行yml文件中的这一个
使用-t
执行指定标签的tasks
ansible-playbook xxx.yml -t vsftp
以上这条命令,只会执行tasks
中标签为vsftpd的这一个模块
主机与用户
可以为一个yml文件指定以哪个用户的身份去执行task
- hosts: dbserver
remote_user: root
上述例子,是指指定的hosts使用的用户为root,在每个task中,可以定义自己的远程用户,前提是被管理主机上有该用户
- hosts: dbserver
remote_user: root
tasks:
- name: install vsftpd
yum: name=vsftpd
remote_user: cyj # 表示执行yum这个task时使用cyj用户来执行
sudo
sudo的用法也可以与用户一样的理解,可以指定那一个task可以使用sudo
,也可以指定文件中的所有task都是用sudo
指定所有task都是用sudo
- hosts: dbserver
remote_user: root
sudo: yes
tasks:
- name: install vsftpd
yum: name=vsftpd
指定单个task使用sudo
- hosts: dbserver
remote_user: root
tasks:
- name: install vsftpd
yum: name=vsftpd
sudo: yes
使用sudo来切换用户
- hosts: dbserver
remote_user: root
sudo: yes
sudo_user: cyj
如果你需要在使用 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列表
每一个yml文件包含了一个tasks列表,一个task在其所对应的所有主机上,也就是hosts文件中所定义的主机组,执行完一个task之后,下一个task才会执行。
在运行yml文件时,会按照先后顺序从上到下依次执行,如果主机组中有一台主机中执行同一个task失败,则会跳出执行,中断,请排错之后重新运行
Handlers:在发生改变时执行的操作
当被管理端的某个文件被改动之后,执行的操作,比如修改某个配置文件之后,需要重新启动相应的服务
当远端文件发生变动后,notify
会在每一个task结束时被触发,而且即使有多个不同的task通知改动的发生,notify
只会被触发一次
如:当foo.conf发生变动时,重新启动memcached
和apache
,**notify
下列出的就是handlers
**
- name: template configuration file
template: src=template.j2 dest=/etc/foo.conf
notify:
- restart memcached
- restart apache
handlers
也是一些task的列表,通过制定的task的name来引用,一般和task并没有什么区别,handlers
是由通知者进行notify
,如果没有被notify
,handlers
不会执行,不管被多少个通知进行了notify
,等到文件中所有task执行完成之后,handlers
也只会被执行一次
handlers
示例:
handlers:
- name: restart memcached
service: name=memcached state=restarted
- name: restart apache
service: name=apache state=restarted
Handlers 最佳的应用场景是用来重启服务,或者触发系统重启操作.除此以外很少用到了.
如果你想立即执行所有的 handler 命令,你可以这样做
tasks:
- shell: some tasks go here
- meta: flush_handlers
- shell: some other tasks
检测语法错误
ansible-playbook yml文件路径 --syntax-check
执行剧本
ansible-playbook yml文件路径
ansible-playbook playbook.yml --list-hosts
,可以看到yml的执行影响到了那些主机