简介
playbooks 是一种简单的配置管理系统与多机器部署系统的基础.与现有的其他系统有不同之处,且非常适合于复杂应用的部署.
Playbooks 使用yaml语法, 可用于声明配置,更强大的地方在于,在 playbooks 中可以编排有序的执行过程,甚至于做到在多组机器间,来回有序的执行特别指定的步骤.并且可以同步或异步的发起任务.
使用
ansible-playbook playbooks文件 -DC #测试运行
ansible-playbook playbooks文件 -f 10 #指定并发的线程数,默认是5
ansible-playbook playbooks文件 --syntax-check #检查语法
playbook变量
变量优先级:
extra-vars外置传参的优先级最高
定义在yml文件中的优先级其次
hosts文件中定义的变量优先级最低
定义方式有三种:
playbook的yaml文件中定义变量赋值
- hosts: all vars: #定义变量 file_name: bgx_yaml_vars tasks: - name: # {{ file_name }}引用上面定义的变量 file: path=/tmp/{{ file_name }} state=touch #playbook执行,在/tmp目录创建bgx_yaml_vars文件
执行参数赋给变量
- hosts: all tasks: - name: Create New File file: path=/tmp/{{ file_name }} state=touch #playbook执行时传入file_name变量的参数,在/tmp目录创建bgx_extra-vars文件
ansible-playbook test.yml --extra-vars "file_name=bgx_extra-vars"
在文件中定义变量
vim /etc/ansible/hosts
[test] 192.168.1.100 [test:vars] file_name=bgx_filename
vim test.yml
- hosts: all tasks: - name: Create New File file: path=/tmp/{{ file_name }} state=touch #playbook执行,在/tmp目录创建bgx_filename文件
变量注册
register关键字可以存储指定命令的输出结果到一个自定义的变量中
- hosts: test tasks: - name: shell: netstat -lnt check_mode: no register: System_Status - name: Get System Status debug: msg={{System_Status.stdout_lines}} #一个注册变量通常会有以下4个属性: #changed:任务是否对远程主机造成的变更。 #delta:任务运行所用的时间。 #stdout:正常的输出信息。 #stderr:错误信息。
ansible-playbook test.yml -DC

条件判断
when关键字判断条件
- hosts: all remote_user: root tasks: #如果系统中存在主机名为nfs或者backup的主机,则创建文件 - name: Create File file: path=/tmp/this_is_{{ ansible_hostname }}_file state=touch when: (ansible_hostname == "nfs") or (ansible_hostname == "backup") #系统为centos的主机才会执行 - name: Centos Install httpd yum: name=httpd state=present when: (ansible_distribution == "CentOS") #系统为ubuntu的主机才会执行 - name: Ubuntu Install httpd yum: name=httpd2 state=present when: (ansible_distribution == "Ubuntu")
循环语句
- hosts: all remote_user: root tasks: - name: Add Users user: name={{ item.name }} groups={{ item.groups }} state=present with_items: - { name: 'testuser1', groups: 'bin' } - { name: 'testuser2', groups: 'root' } #批量创建用户
标签
标签使用,通过tags和任务对象进行捆绑,控制部分或者指定的task执行
- hosts: all remote_user: root tasks: - name: Install Nfs Server yum: name=nfs-utils state=present tags: - install_nfs - install_nfs-server - name: Service Nfs Server service: name=nfs-server state=started enabled=yes tags: start_nfs-server
ansible-playbook -t install_nfs-server test.yml #执行指定tag
ansible-playbook --skip-tags nfs-server test.yml #不执行指定tag
handlers
在系统中,我们修改了服务器的配置文件,这时候就需要重启操作服务,就可以使用到handlers。
handlers: #下面定义了两个handlers - name: restart memcached service: name=memcached state=restarted - name: restart apache service: name=apache state=restarted - name: template configuration file template: src=template.j2 dest=/etc/foo.conf #修改了配置文件然后依次启 动memcached和apache服务。 notify: #使用notify来声明引用handlers。 - restart memcached - restart apache
在使用handlers时需要注意以下几点:
- Handlers只有在其所在的任务被执行时,才会被运行;如果一个任务中定义了notify调用Handlers,但是由于条件判断等原因,该任务未被执行,那么Handlers同样不会被执行。
- Handlers只会在每一个play的末尾运行一次;如果想在一个playbook中间运行Handlers,则需要使用meta模块来实现。例如: -meta: flush_handlers.
- 如果一个play在运行到调用Handlers的语句之前失败了,那么这个Handlers将不会被执行。我们可以使用meta模块的--force-handlers选项来强制执行Handlers,即使Handlers所在的play中途运行失败也能执行。
Include
在多个 playbook 中重用同一个 task 列表,你可以使用 include files 做到这一点
一个 task include file 由一个普通的 task 列表所组成,像这样:
--- # possibly saved as tasks/foo.yml - name: placeholder foo command: /bin/foo - name: placeholder bar command: /bin/bar
Include 指令看起来像下面这样,在一个 playbook 中,Include 指令可以跟普通的 task 混合在一起使用:
tasks: - include: tasks/foo.yml
也可以传递变量给文件
tasks: - include: tasks/foo.yml var="var"
Role
Roles 基于一个已知的文件结构,我们可以对一个很复杂的 playbook 进行拆分,它会自动的加载某些 vars_files,tasks 以及 handlers。基于 roles 对内容进行分组,使得我们可以容易地与其他用户分享 roles 。
比如将任务都放到 tasks/ 目录中、将触发处理程序都放到 handlers/ 目录中等。如果以后需要对 role 进行修改或者调整,只需修改相应的文件即可。如果还想把这个 role 分享给其它人,也只需要分享整个目录即可,从而实现重用的目的。
一个项目的结构如下:
site.yml webservers.yml fooservers.yml roles/ common/ files/ templates/ tasks/ handlers/ vars/ defaults/ meta/ webservers/ files/ templates/ tasks/ handlers/ vars/ defaults/ meta/
- tasks: 包含角色要执行的主要任务列表
- handlers: 包含任务的触发处理程序
- defaults: 角色的默认变量
- vars: 角色的其它变量
- files: 包含可以通过此角色部署的静态文件,比如由 copy 或 script 模块调用的文件
- templates: 包含可以通过此角色部署的模板,比如由 template 模块调用的模板文件
- meta: 为此角色定义一些元数据,比如将角色分享到 Ansible Galaxy 时的说明信息 galaxy_info(作者名、角色描述、License 等)、角色的依赖关系 dependencies(允许您在使用角色时自动引入其他角色)
一个 playbook 调用role如下:
--- - hosts: webservers roles: - common - webservers