Ansible自动化运维|第2章:playbook 详解

  • 原创
  • Madman
  • /
  • /
  • 1
  • 1285 次阅读

ansible-min.png

Synopsis: playbook 文件包含了多个 play,每个 play 可以应用于一个主机组或单个主机。而每个 play 又包含一系列编排后的 tasks(按顺序执行),每个 task 其实就是执行一次 Ad Hoc 临时命令,从根本上来讲,所谓的 task 无非就是调用了 Ansible 的一个模块。如果你熟悉 Python 中的 Flask 框架,它默认的模板引擎就是 Jinja2,那么你学习本文内容时会感觉非常简单

1. YAML 简介

YAML 格式的配置文件易于阅读,大多数编程语言都有可用于 YAML 的库,Docker Compose 和 Kubernetes 的配置文件也都使用 YAML

对于 Ansible 而言,每个 YAML 格式的 Playbook 文件都以列表开头(以短划线和空格开头,-),列表中的每个元素都是键/值对(大小写敏感,且冒号后面必须跟一个空格key: value),通常称为 "哈希" 或 "字典",因此我们需要知道如何在 YAML 中编写列表和字典

YAML 依赖缩进来序列化数据结构,所以缩进必须统一,比如都使用 2 个空格!

另外,所有 YAML 文件都以 --- 开头(可以选择以 ... 结尾),注释以 # 开头

---
# Employee records
- martin:
    name: Martin D'vloper
    job: Developer
    skills:
      - python
      - perl
      - pascal
- tabitha:
    name: Tabitha Bitumen
    job: Developer
    skills:
      - lisp
      - fortran
      - erlang
...

其中,martin 和 tabitha 组成一个列表,而它们的值都是一个字典。列表和字典可以互相嵌套,另外,它们也可以各自缩写为一行:

---
martin: {name: Martin D'vloper, job: Developer, skill: ['python', 'perl', 'pascal']}

2. Playbook 的核心元素

  • hosts: 要执行操作的远程受管节点列表(主机清单)
  • vars: Ansible 内置的有关远程受管节点的系统信息的全局变量(由 setup 模块获取的 facts)或用户自定义的变量
  • tasks: 任务集合,各任务按次序逐个在远程主机上执行
  • handlers: 配置 notify 一起使用,当 tasks 中的某任务满足某一条件时,触发执行 notify 中指定的 handler,详情见本文章节 8

通常还需要指明在远程主机上以什么用户身份来执行任务,比如 remote_user: root。如果是普通用户,像安装软件包这些操作需要 sudo 权限,所以需要指定 become: true

每个任务都可以定义为如下两种形式:

- name: Install Package
  yum: name=httpd state=latest

或者:

- name: Install Package
  yum:
    name: httpd
    state: latest

ansible-playbook 命令的常用选项:

  • --syntax-check: 进行语法检查
  • -C: 不会真的在远程目标主机上执行任务,可用来检查 playbook 文件是否到达我们的预期
  • --list-hosts: 输出此 Playbook 中指定将要执行任务的目标主机列表
  • --list-tasks: 任务列表
  • --list-tags: 标签列表(任务可以指定标签)
  • -v-vv-vvv: 显示详细的任务执行过程(-vvvv 还可用于调试连接)

3. 使用变量

变量名仅能由字母、数字和下划线组成,且只能以字母开头。变量来源优先级(从高到低)如下:

  • 通过命令行 -e 选项指定的变量
  • 在 playbook 中 vars 处定义的变量
  • 内置的全局变量
  • 在主机清单中定义的变量

3.1 内置的全局变量

Ansible 内置了有关远程受管节点的系统信息的全局变量(由 setup 模块获取的 facts),比如 ansible_distributionansible_fqdn

---
- hosts: webservers
  remote_user: root
  tasks:
    - name: Create symbolic link
      file: src=/etc/passwd dest=/tmp/{{ ansible_fqdn }} state=link

执行此 playbook 后,会在远程主机的 /tmp 目录下创建以各远程主机的主机名命名的软链接文件

3.2 在 playbook 中 vars 处定义的变量

---
- hosts: webservers
  remote_user: root
  vars:
    ansible_fqdn: madman
  tasks:
    - name: Create symbolic link
      file: src=/etc/passwd dest=/tmp/{{ ansible_fqdn }} state=link

将会覆盖 Ansible 的全局变量 ansible_fqdn 的值,在各远程主机的 tmp 目录下都创建 madman 软链接文件

多个变量定义成列表的格式:

vars:
  - var1: value1
  - var2: value2

3.3 通过命令行指定的变量

通过给 ansible-playbook 命令的 -e 选项指定变量,它的优先级是最高的,比如:

[root@CentOS ~]# ansible-playbook -e "ansible_fqdn=alice" devops.yml

将会覆盖 playbook 中 vars 处定义的变量,以及 Ansible 的全局变量 ansible_fqdn 的值,在各远程主机的 tmp 目录下都创建 alice 软链接文件

3.4 在主机清单中定义的变量

可以在主机清单文件(比如 /etc/ansible/hosts)中定义变量,它的优先级是最低的。另外,为单个主机指定的 主机变量 优先级要高于为整个主机组指定的 组变量

(1) 主机变量

[webservers]
192.168.40.121 username=madman
192.168.40.122

(2) 组变量

[webservers:vars]
username=Alice

假设 playbook 要创建一个用户:

---
- hosts: webservers
  remote_user: root
  tasks:
    - name: Create new user
      user: name={{ username }} state=present

执行此 playbook 后,会在 192.168.40.121 创建 madman 用户,在 192.168.40.122 创建 Alice 用户

4. 给任务指定 tags

可以给 playbook 中各任务分别指定不同的 tags(不同的任务可以属于同一 tag)

---
- hosts: webservers
  remote_user: root
  tasks:
    - name: Install Nginx
      yum: name=nginx state=latest
      tags: install
    - name: Copy configure file
      copy: src=nginx.conf dest=/etc/nginx/conf.d/default.conf
    - name: Start Nginx service
      service: name=nginx state=started enabled=yes
      tags: service

查看标签列表:

[root@CentOS ~]# ansible-playbook --list-tags devops.yml 

playbook: devops.yml

  play #1 (webservers): webservers  TAGS: []
      TASK TAGS: [install, service]

只运行 playbook 中指定 tag 下的任务:

[root@CentOS ~]
                                
                            
未经允许不得转载: LIFE & SHARE - 王颜公子 » Ansible自动化运维|第2章:playbook 详解

分享

作者

作者头像

Madman

如需 Linux / Python 相关问题付费解答,请按如下方式联系我

1 条评论

novolei
novolei

test

专题系列