所在位置:

ansible的playbook模式

ansible 有两种模式,一种是 ad-hoc 模式,一种是 playbook 模式,playbook 就是通过组合多条ad-hoc操作的配置文件,而 playbook 的配置文件格式是 yaml,yaml 是一个类似于 json 或者 xml 的文件格式,但要比这些格式更加方便,用于指定分层配置数据

其实学习 ansible-playbook 最主要理解一些配置文件的常用指令,条件判断、循环、jinja2 的用法,还有一些常用模块的用法,role 角色的应用,今天最主要讲 playbook 模式的一些配置和用法:

ansible-playbook 的格式:

ansible-playbook yaml文件 [option]

ansible-playbook 的组成:

  • host,应用 playbook 的主机范围
  • play,一组task的集合
  • task,由模块来完成的一项任务
  • notify, 在 playbook 的每一个 task 结束时被触发
  • handler,task可以触发一定的事件,通过名字来引用
  • role,一组由playbook以及和其配合的元素(vars, files等)的集合
  • include,在一个 yaml 配置文件中包含其它的 yaml 配置文件

yaml配置文件

注意几点
  • 要以 --- 开头(可选的)
  • - 表示列表
  • yaml 是区分大小的
  • 可以使用 tab 或者 空格,建议使用 空格
常用的几个指令
  • hosts: 定义主机的范围

  • vars:定义变量

  • vars_files:定义变量文件

  • tasks:定义任务

  • name:定义playbook或者task的名称

  • notify:如果任务发生了改变,就会触发 handlers的任务

  • handlers:定义被触发的任务列表

  • include:包含各种 yaml 配置文件

yaml 变量的使用,有下面几种情况:

  • yaml 文件中 使用 vars 定义

  • 使用 ansible-playbook 的参数 --extra-vars

  • 资源清单文件 中定义

  • yaml 文件中 使用 register,这个可以把指定命令输出的结果保存到一个自定义的变量中

yaml 文件的循环语句有下面几种常用的:

with_items

安装 vim 和 emacs

---
- hosts: server1
  tasks:
    - name: install vim and emacs packages
      yum: name={{ item }} state=present
      with_items:
        - vim
        - emacs

添加用户 user1 和 用户 user2

---
- hosts: server1
  tasks:
    - name: add user1 and user2
      user: name={{ item.name }} group={{ item.group }}
      with_items:
        - { name: 'user1', group: 'root' }
        - { name: 'user2', group: 'root' }

或者

--
- hosts: server1
  tasks:
    - name: add user1 and user2
      user: name={{ item.name }} group={{ item.group }}
      with_items:
        - name: 'user1'
          group: 'root'
        - name: 'user2'
          group: 'root'
with_dict

添加用户 user1 和 user2

---
- hosts: server1
  tasks:
    - name: add user1 and user2
      user: name={{ item.key }} state=present group={{ item.value }}
      with_dict:
        { 'user1': 'root', 'user2': 'root' }
with_file

显示当前目录下 a.txt 的内容

---
- hosts: server1
  tasks:
    - name: show a.txt content
      debug: msg={{ item }}
      with_file: a.txt
with_fileglob

把当前的 test 目录下的所有文件复制到 远程的/tmp 目录中

---
- hosts: server1
  tasks:
    - name: copy file to tmp
      copy: src={{ item }} dest=/tmp/ owner=root mode=644
      with_fileglob:
        - test/*
with_sequence

添加4个用户

---
- hosts: server1
  tasks:
    - name: add four users
      user: name=user{{ item }} group=root
      with_sequence: start=1 end=4

条件语句

显示偶数

---
- hosts: server1
  tasks:
    - name: debug number
      debug: msg={{ item }}
      with_items: [0, 2, 4, 5, 6, 8, 10]
      when: item % 2 == 0

roles

一个项目的结构如下:

site.yml
webservers.yml
fooservers.yml
roles/
   common/
     files/
     templates/
     tasks/
     handlers/
     vars/
     defaults/
     meta/
   webservers/
     files/
     templates/
     tasks/
     handlers/
     vars/
     defaults/
     meta/

一个 playbook 如下:

---
- hosts: webservers
  roles:
     - common
     - webservers

这个 playbook 为一个角色 ‘x’ 指定了如下的行为:

  • 如果 roles/x/tasks/main.yml 存在, 其中列出的 tasks 将被添加到 play 中
  • 如果 roles/x/handlers/main.yml 存在, 其中列出的 handlers 将被添加到 play 中
  • 如果 roles/x/vars/main.yml 存在, 其中列出的 variables 将被添加到 play 中
  • 如果 roles/x/meta/main.yml 存在, 其中列出的 “角色依赖” 将被添加到 roles 列表中 (1.3 and later)
  • 所有 copy tasks 可以引用 roles/x/files/ 中的文件,不需要指明文件的路径。
  • 所有 script tasks 可以引用 roles/x/files/ 中的脚本,不需要指明文件的路径。
  • 所有 template tasks 可以引用 roles/x/templates/ 中的文件,不需要指明文件的路径。
  • 所有 include tasks 可以引用 roles/x/tasks/ 中的文件,不需要指明文件的路径。

ansible-playbook的 option 选项有:

说明: 其实 ansible-playbook 的 option 选项有些跟 ansible 的 opition 选项是一样的

指定资源清单,默认 /etc/ansible/hosts,使用 -i 参数
ansible-playbook yaml文件 -i 资源清单路径
并发线程数,默认5个线程,使用 -f 参数
ansible-playbook yaml文件 -f 进程数
输出详细的执行过程信息,使用 -v 参数,而 -vvv 可得到所有执行过程信息
ansible-playbook yaml文件 -v
指定远程主机以哪个用户运行命令,使用 -u 参数
ansible-playbook yaml 文件 -u 远程用户名
Linux系统下的 sudo 命令,使用 -s 参数
ansible-playbook yaml文件 -s
用户的密码(与 -s 一起使用),使用 -K 参数
ansible-playbook yaml文件 -K
指定密钥文件,使用 --private-key
ansible-playbook yaml文件 --private-key=密钥文件
列出符合条件的主机列表,不执行任何其他命令,使用 --list-hosts
ansible-playbook yaml文件 --list-hosts
列出 playbook 中会被执行的 task,使用 --list-tasks
ansible-playbook yaml文件 --list-tasks
设置额外的变量,使用 -e 参数 或者 --extra-vars参数
ansible-playbook yaml文件 -e "key1=value1" -e "key2=value2"

或者

ansible-playbook yaml文件 --extra-vars "key1=value1 key2=value2"
检测 playbook 文件语法是否有问题,不会执行 playbook,使用 --syntax-check
ansible-playbook yaml文件 --syntax-check
执行指定的 tag 标签任务,使用 -t,如果要执行除了特定的标签的所有标签,使用 --skip-tags
ansible-playbook yaml文件 -t 标签名

举例

用 include 的方式实现在远程创建文件和创始用户

touchfile.yml 配置文件的内容

---
- name: touch file
  shell: touch /tmp/file1

createuser.yml 配置文件的内容

---
- name: create user
  user: name=user1 group=root

include.yml 配置文件的内容

---
- hosts: server1
  tasks:
    - include: touchfile.yml
    - include: createuser.yml

参考链接

【上一篇】ansible的ad-hoc模式

【下一篇】如何在 CentOS 7 安装和配置 Ansible【翻译】