ansible之管理变量和事实(三)
将 playbook 中的某些值使用变量代替,从而
简化 playbook 的编写
1 管理变量
1.1 ansible 变量简介
变量可能包含下面这些值:
要创建的用户、 要安装的软件包、 要重启的服务、 要删除的文件、 要从互联网检索的文档
1.2 命名变量
变量名称必须以字母开头,并且只能含有字母、数字和下划线
错误 正确
web server web_server
westos.file remote_file
1st file file1
2 定义变量
三个范围级别
全局范围:从命令行或 ansible 配置设置的变量(最低)
play 范围:在 play 和相关结构中设置的变量(最高)
主机范围:由清单、事实收集或注册的任务,在主机组和个别主机上设置的变量
’如果多个级别上定义了相同名称的变量,优先采用级别最高的变量,窄范围优先于广范围’
3 playbook 中的变量
3.1.常见方式:在 playbook 开头的 vars 块中
vim vars.yml
3.2 在外部文件定义 playbook 变量
vim vars.yml
3.3 定义变量和使用变量
注意:当变量用作开始一个值的第一元素时,必须使用引号,否则会报错’
3.4 主机变量和组变量
直接应用于主机的清单变量分为两大类:
1.主机变量:应用于特定主机
2.组变量:应用于一个主机组或一组主机组中的所有主机
主机变量优先于组变量,但是 playbook 中定义的变量比这两者更高
3.4.1 定义主机变量和组变量
—方法一(比较旧,不建议采用):
定义 server1.example.com 的 ansible_user 主机变量:
[webservers]
server1.example.com ansible_user=student
webservers]
server1.example.com ansible_user=student
定义 dbservers 主机组的 user 组变量:
[dbserver]
dbserver1.example.com
dbserver2.example.com
[dbservers:vars]
user=student
定义嵌套组 user 变量:
[servers1]
node1.example.com
node2.example.com
[servers2]
node3.example.com
node4.example.com
[servers:children]
servers1
servers2
[servers:vars]
user=student
'这种做法使的清单文件难以处理,在同一文件中混合提供主机和变量信息,语法也过时'
如:
—方法二:使用目录填充主机和组变量
定义主机和主机组变量的首选做法时与清单文件或目录相同的工作目录中,创建 group_vars 和 host_vars
两个目录,这两个目录分别包含用于定义组变量和主机变量的文件 创建 group_vars/servers 的 YAML 文件,设置变量为值:
user: student 同样需要在 host_vars 目录中创建名称与主机匹配的文件来存放主机变量
所以一个项目目录中包含: ansible.cfg、group_vars、host_vars、inventory、playbook.yml
#从命令行覆盖变量 清单变量可以被 playbook 中设置的变量覆盖 两者又可通过命令行参数覆盖
#使用数组作为变量
访问:
变量被定义为 python 字典,可以使用替代语法:
3.5 使用已注册变量捕获命令输出
管理员可以使用 register 语句捕获命令输出
3.6 管理变量的练习
创建 playbook,来安装 apache 并开启,使可被访问,playbook 查询 web 服务器并确认它
已经设置好并在运行
vim playbook.yml
#检测语法
ansible-playbook --syntax-check playbook.yml
#运行
4 管理机密
目标:使用 ansible vault 加密敏感变量,并运行 vault 加密变量文件的 playbook
4.1 介绍 ansible vault
ansible 可能需要访问密码或者 api 密钥等敏感数据,以便配置主机。
加密解密工具:ansible-vault 命令
‘ansible vault 不实施自有的加密函数,而使用外部 python 工具集’
4.2 创建加密文件
方法:ansible-vault create filename
4.3 创建加密文件同时将密码保存
4.4查看加密文件
4.5 编辑现有的加密文件
原理:将文件解密为一个临时文件,并编辑;保存时,复制内容并删除临时文件
'edit 命令始终重写文件,因此只有在更改文件时使用,查看尽量使用 view’
4.6 加密现有的文件
方法:ansible-vault encrypt filename #filename 参数可以是多个
4.7 解密
'可以使用–output=filename 将加密文件保存为新的名称,使用此参数时输入文件只能是一个
4.8 更改加密文件密码
方法:ansible-vault rekey filename
4.9 运行加密的 playbook,没有密码则报错
要交互式提供密码
ansible-playbook --vault-id @prompt user.yml
‘2.4 之前的 ansible,使用–ask-vault-pass 提供交互式密码’
#也可以将秘密存在文件中(注意使用文件系统权限对文件进行保护)
[root@workstation wsp]# ansible-playbook --vault-password-file=password user.yml
5 管理事实
事实包括:主机名称、内核版本、网络借口、IP 地址等
5.1 描述 ansible 事实
5.2 查看主机信息
[root@workstation wsp]# cat fact.yml
5.3 再将事实替换为动态的值
#使用字典的方式查询值
结果:
ansible 事实作为变量注入
5.4 使用 setup 模块显示所有事实信息
[root@workstation ~]# ansible servera.lab.example.com -m setup
5.5 关闭事实收集,开提升执行速度
禁用后便不采集:
5.6 创建自定义事实
可以使用 INI 格式或者 JSON 格式:
’自定义格式不能使用 ymal 格式,使用最为接近的 json 最好’
建立文件:必须以.fact 结尾:
得出ansible_local的信息:
’自定义事实的使用方式和默认事实相同’
5.7 使用魔法变量
常用的有四个:
hostvars #包含受管主机的变量,可以用于获取另一台受管主机的变量的值 group_names #列出当前受管主机所属的所有组
groups #列出清单中的所有组和主机 inventory_hostname #包含清单中配置的当前受管主机的主机名称
#用途之一:使用 debug 模块报告特定主机的 hostvars 的值
6 练习
6.1 创建自定义变量
生成目录和文件:
得出:
创建 playbook:
vim playbook.yml
检测得出成功:
6.2 使用基本身份认证的 httpd
6.2.1 创建基本文件
6.2.2 创建剧本
vim playbook.yml
6.2.3 创建加密文件
在文件中写入:
web_pass: redhat
6.2.4 创建 files 目录
6.2.5 拷贝文件到files目录
6.2.6 修改workstation的发布目录
vim /etc/httpd/conf/httpd.conf
6.2.7 交互式输入密码,进行语法检测
6.2.8 执行
6.2.9 验证是否成功
6.2.10 总结
1.变量能够让 playbook 复用
2.可以给清单中的主机和主机组定义变量
3.可以使用事实和外部文件定义变量,也可以在命令行中
4.register 关键字何以用于捕获命令输出
5.ansible vault
6.ansible 事实是从受管主机自动检测到的变量