简介

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