一、管理变量和事实
管理变量目的:将playbook中的某些值使用变量代替,简化playbook的编写;
1.1ansible变量简介 :
变量可能包含以下值:
要创建的用户
要安装的软件包
要重启的服务
要删除的文件
要从互联网检索的文档
1.2变量命名
变量名称:必须以字母开头,并且只能含有字母、数字和下划线 列如:web_server 、remote_file 、file1
1.3定义变量
三个范围级别
全局范围:从命令行或ansible配置设置的变量
play范围:在play和相关结构中设置的变量
主机范围:由清单、事实收集或注册的任务,在主机组和个别主机上设置的变量
注意:若多个级别上定义了相同名称的变量,优先采用级别最高的变量,窄范围优先于广范围’
1.4playbook中的变量
1.4.1.常见方式:在playbook开头的vars块中:
- host: all
vars:
user: student
home: /home/student
1.4.2.在外部文件定义playbook变量
外部设置好变量,剧本中直接使用指定文件
- hosts: all
vars_files:
- vars/users.yml 建立此文件此写入变量
如下所示:
在/vars/users.yml文件中写入
user: student
home: /home/student
编写剧本是可以使用以上设置的变量
vars:
user: westos
tasks: -name: Createuser {{user}} 在playbook中使用变量 将变量名称放在花括号内即可
user:
name: "{{user}}" 注意:当变量用做开始的第一个元素时,必须使用引号
二、主机变量和组变量
2.1直接应用于主机的清单变量分为两大类:
1.主机变量:应用于特定主机
2.组变量:应用于一个主机组或一组主机组中的所有主机
主机变量优先于组变量,但是playbook中定义的变量比这两者更高
定义主机变量和组变量:
使用目录填充主机和组变量定义主机和主机组变量的做法是:
建立与清单文件在相同的工作目录中,创建group_vars 和host_vars两个目录,这两个目录分别包含用于定义组变量和主机变量的文件
创建group_vars/servers的YAML文件,设置变量为值: user:student
同样需要在host_vars目录中创建名称与主机匹配的文件来存放主机变量
所以一个项目目录中包含: ansible.cfg、group_vars、host_vars、inventory、playbook.yml
(五个文件)
清单变量可以被playbook中设置的变量覆盖 ;两者又可通过命令行参数覆盖
2.2使用已注册变量捕获命令输出
三、管理变量的练习
创建playbook,安装Apache并开启服务,可以被访问,playbook查询web服务器并确认已经设置好正在运行
变量指定
web_pkg 要安装的web服务器安装包
firewall_pkg 要安装的防火墙的软件包
web_service 要管理的web 服务
firewall_service 要管理的防火墙服务
python_pkg uri 模块所需要的软件包
rule httpd 要打开的服务
第一个playbook
- name: Delploy and start Apache service 安装部署http并开启服务
hosts: webserver 制定受管主机组
vars: 定义变量
web_pkg: httpd
firewall_pkg: firewalld
web_service: httpd
firewall_service: firewalld
python_pkg: python3-PyMySQL
rule: httpd
tasks:
- name: Required packages are installed and last 所需的软件包已安装并且是最新的
yum: 安装
name: 软件包名称
- "{{ web_pkg }}"
- "{{ firewall_pkg }}"
- "{{ python_pkg }}"
state: latest 检测是否最新版本
- name: The {{ firewall_service }} started and enabled 火墙服务是启动的和开启启动
service: 服务
name: "{{ firewall_service }}" 火墙服务
enabled: true 开机启动
state: started 开启状态
- name: The {{ web_service }} started and enabled web服务是启动的和开启启动
service:
name: "{{ web_service }}" apache服务
enabled: true
state: started
- name: Configure index.html 设置http发布页面
copy: 上传
content: "peizhifabuyemian!!" 更改内容
dest: /var/www/html/index.html 上传到此目录下
- name: Firewalld permits http 是防火墙允许访问http
firewalld:
service: "{{ rule }}" 允许
permanent: true
immediate: true
state: enabled
第二个playbook
- name: Verify the Apache 判定证实apache
hosts: localhost 本机测试访问http
becom: false 不需要认证
tasks: 动作任务
- name: Curl web 访问主机组
uri: uri访问模块
url: http://servera.lab.examole.com 指定主机名称
status_code: 200 状态返回码
受管主机检查
本机测默认试访问界面
[root@workstation data-variables]# curl servera.lab.example.com
peizhifabuyemian!!
四、管理机密
4.1目标:使用ansible-vault加密敏感变量,并运行vault加密变量文件的playbook
4.2介绍: ansible vault
ansible可能需要访问密码或者api密钥等敏感数据,以便配置主机。
4.3加密解密工具:命令 ansible-vault
‘ansiblevault不实施自有的加密函数,而使用外部python工具集’
4.4创建加密文件
方法:ansible-vault create filename
创建加密文件同时将密码保存,file1文件中必须先写入密码
4.5编辑现有的加密文件
原理:将文件解密为一个临时文件,并编辑;保存时,复制内容并删除临时文件 ‘edit命令始终重写文件,因此只有在更改文件时使用,查看尽量使用view’。
[root@workstation dir]# ansible-vault edit file2
Vault password:
4.5加密现有的文件
方法:ansible-vault encrypt filename filename可以是多个文件一起加密
可以使用--output=filename将加密文件保存为新的名称,使用此参数时输入文件只能是一个
[root@workstation dir]# vim playbook.yml
[root@workstation dir]# vim westos.yml
[root@workstation dir]# ls
playbook.yml westos.yml
[root@workstation dir]# cat playbook.yml
123
[root@workstation dir]# cat westos.yml
456
[root@workstation dir]# ansible-vault encrypt westos.yml playbook.yml 加密多个文件
New Vault password: Lee
Confirm New Vault password: Lee
Encryption successful
[root@workstation dir]# ansible-vault view westos.yml 查看
Vault password: Lee
456
[root@workstation dir]# ansible-vault view playbook.yml 查看
Vault password: Lee
123
加密文件使用encrypt参数、解密使用decrypt参数、更改加密文件使用rekey 参数
注意:对密码文件的保护可以设置文件权限
使用vault密码文件时,最好使用–new-vault-password-file
密码文件必须存在才可以创建
[root@workstation dir]# ansible-vault rekey --new-vault-password-file=file2 wbserver.yml
Vault password: Lee
Rekey successful
五、playbook和ansible-vault
交互式提供密码--vault-id @prompt
注意:2.4版本之前的ansible,使用–ask-vault-pass提供交互式密码
创建密码文件file2:内容为Lee
[root@workstation dir]# ansible-playbook --vault-password-file=file2 wbserver.yml 不用手动输入密码直接执行
PLAY [Setup Webserver] *********************************************************************************************************************
TASK [Gathering Facts] *********************************************************************************************************************
ok: [serverb.lab.example.com]
TASK [Http Installed] **********************************************************************************************************************
ok: [serverb.lab.example.com]
PLAY RECAP *********************************************************************************************************************************
serverb.lab.example.com : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
六、管理事实
事实包括:主机名称、内核版本、网络借口、IP地址等
描述ansible事实
6.1查看主机信息 ansible_facts系统变量不用定义
6.2再将事实替换为动态的值
6.3ansible事实作为变量注入
使用setup模块显示所有事实信息
6.4创建自定义事实 *****
可以使用INI格式或者JSON格式
INI格式
INI格式
[packages]
web_package = httpd
db_package = mariadb-server
[user]
user1 = westos
user2 = lee
JSON格式
JSON格式
{
"pacgages": {
"web_package": "httpd",
"db_package": "mariadb-server"
},
"users": {
"user1": "westos",
"user2": "lee"
},
}
自定义格式不能使用ymal格式,使用最为接近的json最好
[root@workstation ~]# ls /etc/ansible/facts.d/wes.fact
/etc/ansible/facts.d/wes.fact
[root@workstation ~]# cat /etc/ansible/facts.d/wes.fact
{
"packages": {
"web_package": "httpd",
"db_package": "mariadb-server"
},
"users": {
"user1": "westos",
"user2": "lee"
},
}
自定义事实的使用方式和默认事实相同’
6.5使用魔法变量
常用的有四个:
hostvars 包含受管主机的变量,可以用于获取另一台受管主机的变量的值
group_names 列出当前受管主机所属的所有组
groups 列出清单中的所有组和主机
inventory_hostname包含清单中配置的当前受管主机的主机名称
用途之一:使用debug模块报告特定主机的hostvars的值
管理事实:练习1
检测ansible_local变量当前是不存在的(未设定变量之前)
[root@workstation data-facts]# ansible web -m setup 检测ansible_local变量
受管主机上检查文件变量是否存在
变量文件已经上传
[root@serverb ~]# ls /etc/ansible/facts.d/
custom.fact
[root@servera ~]# ls /etc/ansible/facts.d/
custom.fact
6.5.1编写主playbook
受管主机上测试(在运行playbook时受管主机上不能有http服务)