Ansible自动化运维|第2章:playbook 详解
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 组成一个列表,而它们的值都是一个字典。列表和字典可以互相嵌套,另外,它们也可以各自缩写为一行:
2. Playbook 的核心元素
hosts
: 要执行操作的远程受管节点列表(主机清单)vars
: Ansible 内置的有关远程受管节点的系统信息的全局变量(由setup
模块获取的facts
)或用户自定义的变量tasks
: 任务集合,各任务按次序逐个在远程主机上执行handlers
: 配置notify
一起使用,当tasks
中的某任务满足某一条件时,触发执行 notify 中指定的 handler,详情见本文章节 8
通常还需要指明在远程主机上以什么用户身份来执行任务,比如 remote_user: root
。如果是普通用户,像安装软件包这些操作需要 sudo 权限,所以需要指定 become: true
每个任务都可以定义为如下两种形式:
或者:
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_distribution
、ansible_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 软链接文件
多个变量定义成列表的格式:
3.3 通过命令行指定的变量
通过给 ansible-playbook
命令的 -e
选项指定变量,它的优先级是最高的,比如:
将会覆盖 playbook 中 vars
处定义的变量,以及 Ansible 的全局变量 ansible_fqdn
的值,在各远程主机的 tmp 目录下都创建 alice 软链接文件
3.4 在主机清单中定义的变量
可以在主机清单文件(比如 /etc/ansible/hosts
)中定义变量,它的优先级是最低的。另外,为单个主机指定的 主机变量
优先级要高于为整个主机组指定的 组变量
(1) 主机变量
(2) 组变量
假设 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
查看标签列表:
1 条评论
评论者的用户名
评论时间novolei
2019-10-08T03:22:35Ztest