Playbook介绍

  • Post author:
  • Post category:Ansible
  • Page Views 448 阅读

1.Playbook定义

在Ansible中,将各个模块组合在一起的一个YAML格式的配置文件,称为playbook。一个playbook可以包含一个到多个play,每一个play是一个完整的任务。一个play必须包含两项内容,hosts与task。

---
- hosts: dbservers
  become: yes
  become_method: yes

  tasks:
    - name: install software
      yum: name=nginx state=present

task的定义的格式:module:options,以模块作为键,参数作为值。YAML的字符串不需要使用单引号或者双引号,因此上述的例子中,“name=nginx state=present”是一个完整的字符串。当参数较多时,可以使用 “>” 符号或者使用缩进子块的形式进行折叠换行来增加playbook的可读性。

  task:
    - name: install software
      yum: > 
        name=nginx
        state=present

实际使用过程中,我们建议每个playbook中只编写一个play,这样可以增加playbook的可读性和可维护性,以及在不同的任务中重复利用。我们可以通过include参数来导入playbook,被导入的playbook会依次执行。

---
- include: test1.yaml
- include: test2.yaml

2.使用ansible-playbook执行playbook

ansible-playbook是一个命令行工具,使用方式如下:

ansible-playbook playbook.yaml

ansible-playbook的一些参数:

  • -T –timeout:建立ssh连接的超时时间
  • –key-file –private-key:建立ssh连接的私钥文件
  • -i –inventory-file:指定inventory文件
  • –f –forks:并发执行的进程数
  • –list-hosts:列出执行任务的服务器列表
  • –list-tasks:列出任务列表
  • –step:每执行完一个任务后停止,等待用户确认
  • –syntax-check:检查playbook的语法
  • -C –check:检查当前playbook是否会修改远程服务器,相当于预测执行结果

3.Playbook的详细语法

3.1权限

在Ansible中,默认使用当前用户执行远程服务器操作。除了在ansible.cfg中定义默认用户,我们也可以通过remote_user指定执行play的用户。

---
- hosts: dbservers
  remote_user: root

  tasks:
    - name: install software
      yum: name=nginx state=present

也可以细分每一个task:

---
- hosts: dbservers
  remote_user: root

  tasks:
    - name: install software
      yum: name=nginx state=present
      remote_user: username

当任务执行需要更高级别的权限时,使用管理员身份去执行操作,可以通过become和become_method(默认为sudo)参数,也可以细分每一个task。

---
- hosts: dbservers
  remote_user: root
  become: yes
  become_method: sudo

  tasks:
    ....

3.2通知

在Ansible中,模块是幂等的,也就是说执行相同的操作,只有第一次才起作用。比如我们要在远程服务器创建一个用户,如果该用户已经存在,那么该任务不会执行,而是直接返回成功。

日常工作中可能会有这样一种情况,我们需要通过ansible修改远程服务器nginx的配置文件,并重启nginx服务。如果此时配置文件内容和我们想要修改的内容是一致的,那么此时就不应该重启nginx服务。在Ansible中,通过notify和handler级制来处理这种情况。

hander是ansible提供的条件机制。只有当notify被触发后,handler才会被执行。那么又是通过什么条件判断notify触发的是哪一个handler呢?那就是task使用handler的名字作为参数,以此来促发handler。

 ....
 tasks:
    - name: install nginx
      yum: name=nginx state=latest
 
    - name: copy nginx config file
      template: src=/root/nginx.conf.j2 dest=/etc/nginx/nginx.conf
      notify: restart nginx
 
  handlers:
    - name: restart nginx
      service: name=nginx state=restarted

需要注意的是,handler不会在notify被触发的时候立即执行,而是在所有的task执行完成后执行,并且只会执行一次,即使notify被触发多次。官方文档中提法到,handler唯一的用途就是重启服务或者服务器。

3.3变量

在变量比较少的情况下,我们可以直接将变量定义在vars参数中;当变量比较多的时候,可以将变量保存在一个独立的文件中。

---
- hosts: webservers
  vars:
    worker_processes: 4
  vars_files:
    - /ansible/vars.yaml
[root@Ansible ansible]# cat /ansible/vars.yaml
ansible_port: 2222

3.3.1注册变量

注册变量就是获取任务的执行的结果,将任务的执行结果保存在一个变量中,并在之后引用这个变量。在Ansible中通过register参数获取。

 ....
 tasks:
    - name: install nginx
      yum: name=nginx state=latest
      register: install_result
      ignore_errors: True

    - name: xxx
      when: install_result | succeeded

3.4facts变量

facts变量是ansible执行远程任务之前从远程服务器中获取的系统信息。可以通过setup模块查看变量列表。获取到的变量可以直接在playbook中使用。

3.5循环

 ....
 tasks:
    - name: install nginx
      yum: name={{ item }} state=latest
      with_items:
        - nginx
        - mysql-server

3.6条件

Ansible没有条件语句,但是提供了一个类似if语句的参数,那就是when参数。

 ....
 tasks:
    - name: install nginx
      yum: name=nginx state=latest
      when: ansible_os_family == "CentOS"

when参数的条件可以使用and,or和括进行定义;也可以读取变量的值,或者与循环一起使用。

3.7任务执行的策略

Ansible是以task为单位执行任务,默认使用5个进程。默认当所有服务器都执行完task1之后才会执行task2。为了允许执行较快的服务器提前完成部署任务,我们可以使用free参数,这样就不需要等待其他服务器一起执行task。

---
- hosts: webservers
  strategy: free


「 文章如果对你有帮助,请点个赞哦^^ 」 

1+