三:编写playbook
1.Ansible playbook
临时命令可以作为一次性对一组主机运行简单的任务。不过,若要真正发挥Ansible的力量,需要了解如 何使用playbook可以轻松重复的方式对一组主机执行多项复杂的任务。
play是针对对清单中选定的主机运行一组有序任务。playbook是一个文本文件,其中包含有一个或者多 个按特定顺序运行的play组成的列表。
play可以让您将一系列冗长而复杂的手动管理任务转变为可轻松重复的例程,并且具有可预测的成果。 在playbook中,您可以将play内的任务序列保存为人类可读并可立即运行的形式。根据任务的编写方 式,任务本身记录了部署应用或者架构所需的步骤。
2..yaml 标记语言 YAML是一个可读性高的用来表达资料序列的格式。YAML参考了其他多种语言,包括:XML、C语言、 Python、Perl以及电子邮件格式RFC2822等。Clark Evans在2001年在首次发表了这种语言,另外Ingy döt Net与Oren Ben-Kiki也是这语言的共同设计者,目前很多软件中采有此格式的文件,如:ubuntu, anisble,docker,k8s等
YAML:YAML Ain’t Markup Language,即YAML不是XML。不过,在开发的这种语言时,YAML的意思 其实是:"Yet Another Markup Language"(仍是一种标记语言)
YAML 语言特性
YAML的可读性好
YAML和脚本语言的交互性好
YAML使用实现语言的数据类型
YAML有一个一致的信息模型
YAML易于实现
YAML可以基于流来处理
YAML表达能力强,扩展性好
1.1YAML的三种数据结构
对象: 键值对的集合,又称为映射、哈希、字典 name: username
数组: 一组按次序排列的值,又称为序列/列表
纯量: 单个的、不可再分的值
1.2YAML语法格式
- name:
1.3playbook结果语法检测
1.4 yaml注释
#this is YAML
Same data # This is also a YAML comment
1.5yaml字符串 和多行字符串表示方式
(1)单行字符串中间有空格可以不放在引号中。字符串也可以通过单引号或者双引号括起来
(2)编写多行换行操作可以通过|竖线保留字符串中的换行符
(3) >表示换行字符转换成空格并且行内的引导空白将被删除。这种方法通常用于将很长的字符串在空格 字符处断行,使他们跨占多行来提高可读性。
重要:
只有空格字符作为缩进不能用制表符,如果您使用vi编辑器可以在$HOME/.vimrc文件中添加一下行以便 更轻松的编辑playbook,以下配置实现的是在按下Tab键是执行一个双空格缩进,并在换行后自动缩进 后续行。
autocmd FileType yaml setlocal ai ts=2 sw=2 et
四、管理变量与事实
1.变量
1.1变量命名
变量名称必须是以字母开头,并且只能含有字母、数字和下划线。
1.2变量优先级(高--低)
(1)全局范围:从命令行或ansible配置设置的变量
(2)play范围:在play和相关结构中设置的变量
(3)主机范围:由清单、事实收集或注册的任务,在主机和个别主机上设置的变量 命令行定义变量--> 主机清单中单独定义主机变量--->主机清单公共变量--->系统内置变量
1.3 命令行引用
1.4 引用playbook中的变量
1.5主机变量
1.6使用数组作为变量
数组(Array)是有序的元素序列。 若将有限个类型相同的变量的集合命名,那么这个名称为数组名。 组成数组的各个变量称为数 组的分量,也称为数组的元素,有时也称为下标变量。用于区分数组的各 个元素的数字编号称为下标。数组是在程序设计中,为了处理方便, 把具有相同类型的若干元素按有序 的形式组织起来的一种形式。 这些有序排列的同类数据元素的集合称为数组。
数组是用于储存多个相同类型数据的集合。
1.7系统变量register
使用register已注册变量捕获命令输出
管理员可以使用register语句捕获命令输出,输出保存在
一个临时变量中,稍后再playbook中可用于调试用途或者达成其他目的。
2.使用ansible vault加密文件
ansible可能需要访问密码或者API秘钥等敏感数据,以便能配置受管主机。通常,此信息可能以纯文 本形式存储在清单变量或其他ansible文件中。但若如此,任何有权访问ansible文件的用户或存储这些 ansible文件的版本控制系统都能访问如此敏感数据。这显然存在安全风险。
使用ansible随附的ansible vault 可以加密和解密任何由ansible使用的结构化数据文件。若要使用 ansible vault,可通过一个名为ansible-vault的命令行共计创建、编辑、加密、解密和查看文件。Ansible vault可以加密任何由ansible使用的结构化数据文件。这可能包括清单变量、playbook中含有的变量文 件、在执行playbook时作为参数传递的变量文件,或者ansible角色中定义的变量。
注:ansible-vault并不实施自有的加密函数,而是使用外部python工具。文件通过利用AES256的对称 加密(将密码用作机密秘钥)加以保护,这种方式并未得到第三方正式审核。
1.创建加密文件
2.使用文件权限和其他方式来严密保护文件(创建密码文件存储vault密码)
3.查看加密文件
#ansible-vault view secret1.yml
4.编辑现有的加密文件(edit命令始终重写文件,所以查看不该文件信息用view)
#ansible-vault edit secret1.yml
5.加密已存在文件
#ansible-vault encrypt secret2.yml secret3.yml
--output 以其他名称保存加密文件,使用该选项只能使用一个输入文件
6.解密现有文件
#ansible-vault decrypt secret2.yml --output=secret.decrypt.yml
7.更改加密文件密码
#ansible-vault rekey secret.yml
8.使用密码文件更改方式--new-vault-password-file
#ansible-vault rekey --new-vault-password-file=NEW_FILE_PASSWD secret2.yml
9.运行ansible-paybook命令提供加密密码 --vault-id @prompt (交互式输入密码)
#ansible-playbook --vault-id @prompt secret.yml
#ansible-play --vault-id one@prompt --vault-id two@prompt secret.yml
10.运行ansible-playbook提供密码文件 vault-password-file
#ansible-playbook --vault-password-file=/root/vault-pass secret1.yml
ansible变量文件以及加密vault文件的管理格式(在playbook级别上创建目录通常包含名称与他们所应 用的主机组匹配的变量文件。)
3.管理事实
3.1描述ansible事实
ansible事实是ansible在受管主机上自动检测到的变量。事实中含有主机相关的信息,可以像play中 的常规变量、条件、循环或者依赖于受管主机收集的任何其他语句那样使用。(收集的系统属性)
受管主机的事实有(主机名称、内核版本、网络接口、ip地址、操作系统版本、各种变量、CPU数 量、提供的或可用的内存、可用磁盘等)
借助事实我们可以方便检索主机的状态,并根据状态确定要执行的操作。
例如:
1.根据不同的内核版本事实运行条件任务,以此来重新启动服务。
2.根据事实报告的可能内存情况来定义mysql配置文件。
3.可根据事实的值设置配置文件中使用的ipv4的地址。
3.2受管主机收集事实的方式
3.2json语法表示
playbook中以JSON格式显示ansible_facts变量内容,作为变量的散列/字典
JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧 洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁 和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生 成,并有效地提升网络传输效率。
用JSON表示如下:
3.3ansible事实实例
在Ansible2.5之前,事实是作为前缀为字符串ansible_的单个变量注入,而不是作为 ansible_facts变量的一部分注入
ansible_facts['distribution']事实会被称为ansible_distribution
ansible事实的事例
3.4事实案例
3.5 关闭事实收集
3.6创建自定义事实
默认情况下setup模块从受管主机的/etc/ansible/facts.d目录下的文件和脚本中加载自定义事实。各个文 件名必须以.fact结尾才能使用。动态自定义事实脚本必须输出JSON格式的事实,而且必须是可执行文 件。
INI和JSON格式编写的静态自定义事实文件。INI格式的自定义事实文件包含由一部分定义的顶层值,后 跟用于待定义事实的键值对。
3.7使用魔法(magic)变量
一些变量并非事实或通过setup模块配置,但也由Ansible自动设置。这些魔法变量也可用于获取与特定 受管主机相关的信息
常用的魔法变量**
示例: