目录
1. 变量
1.1 变量内容
1.2 变量命名
1.3 变量定义
1.4 playbook中定义变量
1.5 playbook中变量的使用
1.6 主机变量和组变量
1.6.1 定义主机变量和组变量
1.7 数组作为变量
1.8 已注册变量捕获命令输出
1.9 管理变量的练习
2. 管理机密
2.1 目标
2.2 ansible vault
2.3 创建加密文件
创建加密文件
查看加密文件
编辑加密文件
加密现有文件
解密现有文件
更改加密文件密码
playbook和ansible vault
3. 管理事实
3.1 描述ansible事实
3.2 ansible事实作为变量注入
3.3 创建自定义事实
4. 魔法变量
5. 管理事实练习
将playbook中的某些值使用变量代替,从而简化playbook的编写。
范围级别 | 该范围变量定义 |
全局范围 | 从命令行或 ansible 配置设置的变量 |
play范围 | 在 play 和相关结构中设置的变量 |
主机范围 | 由清单、事实收集或注册的任务,在主机组和个别主机上设置的变量 |
如果多个级别上定义了相同名称的变量,优先采用级别最高的变量,窄范围优先于广范围
vim users.yml
###
user: westos
home: /home/westos
###
将变量名称放在花括号内即可
---
vars:
user: wesots ## 定义变量user内容为westos
tasks:
- name: Create user {{ user }} ## 通过{{ }}使用变量
user:
name: "{{user}}" ## 当变量用作开始一个值的第一元素时,必须使用引号,不然会报错
...
若缺少引号:
直接应用于主机清单变量分为两大类:
主机变量优先于组变量,但是playbook中定义的变量比这两者更高
方法一:[旧方法,不建议]
## 定义servera.dsd.com的ansible_user主机变量
[webserver]
servera.dsd.com ansible_user=westos
## 定义dbservers主机组的user组变量
[dbservers]
dbserver1.dsd.com
dbserver2.dsd.com
[dbservers:vars]
user=westos
## 定义嵌套组user变量
[servers1]
node1.dsd.com
node2.dsd.com
[servers2]
node3.dsd.com
node4.dsd.com
[servers:children]
servers1
servers2
[servers:vars]
user=westos
缺点:清单文件难以处理,在同一文件中混合提供主机和变量信息,语法也过时
方法二:使用目录填充主机和组变量
定义主机和主机组变量,在工作目录下包含ansible.cfg文件、inventory文件以及playbook文件,创建host_vars【主机变量目录】和group_vars【组变量目录】两个目录,分别包含用于定义组变量和主机变量的文件
项目目录包含:ansible.vfg、inventory、playbook.yml以及group_vars和host_vars
调用方式一:
user.lilei.first_name
user.hanmeimei.last_name
调用方式二:
user['lilei']['first_name']
user['hanmeimei']['last_name']
管理员通过register注册一个变量,通过debug将结果显示出来
---
- name: install a package
hosts: all
tasks:
- name: install
yum:
name: httpd
state: installed
register: install_result
- debug: var=install_result
...
创建playbook,安装apahce并开启,使其可以被访问,并且查询web服务器并确认它已经设置好并在运行
---
# web_package
# firewall_package
# web_service
# firewall_service
# python_package
# rule 规则变量
- name: Configure Apache
hosts: web
vars:
web_package: httpd
firewall_package: firewalld
web_service: httpd
firewall_service: firewalld
python_package: python3-PyMySQL
rule: http
tasks:
- name: Install Package # 确保安装软件包且是最新版本
yum:
name:
- "{{ web_package }}"
- "{{ firewall_package }}"
- "{{ python_package }}"
state: latest
- name: The {{ firewall_service }} started and enabled # 确保firewalld开机启动
service:
name: "{{ firewall_service }}"
enabled: true
state: started
- name: The {{ web_service }} started and enabled # 确保apache开机启动
service:
name: "{{ web_service }}"
enabled: true
state: started
- name: Configure index.html # 配置默认发布页面
copy:
content: "Hello Westos!"
dest: /var/www/html/index.html
- name: firewall permits http # 配置防火墙允许访问http
firewalld:
service: "{{ rule }}"
permanent: true
immediate: true
state: enabled
- name: verify the apache # 检测apache服务
hosts: localhost
become: false # 本机测试 ,不必更改身份
tasks:
- name: curl webserver
uri: # uri由python提供,为了在这里测试,因此我们安装python
url: http://servera.dsd.com
status_code: 200 # 状态码为200,正常
...
检测语法:
运行:
使用ansible vault加密敏感变量,并运行vault加密变量文件的playbook
ansible可能需要访问密码或者api密钥等敏感数据,以便于配置主机
方法:ansible-vault create filename
ansible-vault create secret.yml ## 需要输入两次密码
ansible-vault create --vault-password-file=westos secret.yml ## 创建加密文件并同时保存密码,westos文件中必须先写入密码
若westos文件中没有密码时,报该错误
在进行加密操作后,我们会发现通过cat命令读取到文件内容为加密后内容
##方法:
ansible-vault view filename
ansible-vault view secret.yml
原理:将文件解密为一个临时文件并编辑,保存时,复制内容并删除临时文件,'edit'命令始终重写文件,因此只有在更改文件时使用,查看用'view'
ansible-vault edit secret.yml ## 刚该加密文件内容
## 方法:
ansible-vault encrypt filename ## filename参数可以是多个
##
可以使用--output=filename将加密文件保存为新的名称,使用此参数时输入文件只能是一个
## 方法:
ansible-vault decrypt filename ## 解密该文件
ansible-vault decrypt westos.yml --output=redhat.yml ## 解密文件同时修改文件名称
## 方法:
ansible-vault rekey filename
ansible-vault rekey dsd.yml ## 修改dsd.yml文件密码
## 若密码不是通过交互,而是在一个文件中时,我们修改密码最好使用--new-vault-password-file
ansible-vault rekey --new-vault-passwprd-file=dsd westos.yml
ansible-playbook user.yml ## 运行加密的playbook,没有密码则报错
ansible-playbook --vault-id @prompt user.yml ##交互式提供密码
## 2.4之前的ansible,使用--ask-vault-pass提供交互式密码
## 也可以将密码保存在文件中(注意使用文件系统权限对文件进行保护)
ansible-playbook --vault-password-file=password user.yml
事实包括:主机名称、内核版本、网络接口、IP地址等
[root@workstation facts]# cat fact.yml
---
- name: Fact
hosts: all
tasks:
- name: print fact
debug:
var: ansible_facts # 系统变量名
...
---
- hosts: all
tasks:
- name: print ansible facts
debug:
msg:
The IPv4 address of {{ ansible_facts.fqdn }}
is {{ ansible_facts.all_ipv4_addresses }}
...
######
The IPv4 address of {{ ansible_facts.fqdn }} # 使用字典的方式查询值
is {{ ansible_facts.all_ipv4_addresses }}
ansible servera.dsd.com -m setup
---
- name: Configure User
hosts: servera.dsd.com
gather_facts: no
tasks:
- name: wesots user
user:
name: westos
uid: 1000
state: present
...
[packages]
web_package = httpd
db_package = mariadb-server
[users]
user1 = westos
user2 = redhat
{
"packages": {
"web_package": "httpd",
"db_package": "mariadb-server"
},
"users": {
"user1": "westos",
"user2": "redhat"
}
}
[root@workstation ~]# mkdir /etc/ansible/facts.d
[root@workstation ~]# cd /etc/ansible/facts.d/
[root@workstation facts.d]# vim custom.fact
[root@workstation facts.d]# ansible localhost -m setup
魔法变量 | 作用 |
hostvars | 包含受管主机的变量,可以用于获取另一台受管主机的变量的值 |
group_names | 列出当前受管主机所属的所有组 |
groups | 列出清单中的所有组和主机 |
inventory_hostname | 包含清单中配置的当前受管主机的主机名称 |
ansible localhost -m debug -a 'var=hostvars["servera.dsd.com"]'
[root@workstation~]#mkdirdata-facts
[root@workstation data-facts]#cat ansible.cfg
[defaults]
inventory=./inventory
[root@workstation data-facts]#cat inventory
[web]
servera.dsd.com
[root@workstation data-facts]#ansiblewebservers-msetup #显示信息
## 创建自定义变量
[root@workstation data-facts]#vim custom.fact
[root@workstation data-facts]#cat custom.fact
[westos]
package = httpd
service = httpd
state = started
enabled = true
## 创建playbook
[root@workstation data-facts]#vim facts.yml
---
- name: Install facts
hosts: web
vars:
remote_dir: /etc/ansible/facts.d
facts_file: custom.fact
tasks:
-name: Create directory
file:
state: directory
recurse: yes
path: "{{remote_dir}}"
-name: Install new facts
copy:
src: "{{facts_file}}"
dest: "{{remote_dir}}"
## 检测ansible_local变量,当前没有
[root@workstation data-facts]#ansible web -m setup
## 语法检测
[root@workstation data-facts]#ansible-playbook--syntax-checkfacts.yml
## 运行
[root@workstation data-facts]#ansible-playbook facts.yml
## 编写主playbook
---
- name: Install Apache and starts
hosts: webservers
tasks:
-name: Install Packages #安装httpd
yum:
name: "{{ ansible_facts['ansible_local']['custom']['westos']['package'] }}"
state: latest
-name: Starthttpd #启动
service:
name: "{{ ansible_facts['ansible_local']['custom']['westos']['service'] }}"
state: "{{ ansible_facts['ansible_local']['custom']['westos']['state'] }}"
enabled: "{{ ansible_facts['ansible_local']['custom']['westos']['enabled'] }}"
## 验证httpd服务没有在servera上运行
[root@workstation data-facts]#ansible servera.dsd.com -m command-a 'systemctl status httpd'
## 语法检测
[root@workstationdata-facts]#ansible-playbook--syntax-check playbook.yml
## 运行
[root@workstation data-facts]#ansible-playbook playbook.yml