机密和事实
Ansible vault(管理机密)
- 简单说就是给密码或API密钥等敏感数据进行加密
- Ansible可能需要访问密码或API密钥等敏感数据,以便能配置受管主机,但是这些敏感数据是任何有权限访问Ansible文件的用户都能查看,这样是不安全。
- Ansible Vault可以加密和解密任何由Ansible使用的结构化数据文件
二、创建加密的文件
命令将会提示输入新的vault密码,然后利用默认编辑器vi打开文件
(我们可以设置和导出EDITOR环境变量,通过设置和导出指定其他默认编辑器)
[root@ansible ~]# ansible-vault create server.yml
New Vault password:
Confirm New Vault password:
还可以用vault密码文件来存储vault密码
[root@ansible ansible]# vim vault_password
[root@ansible ansible]# cat vault_password
123456
[root@ansible ansible]# ansible-vault create --vault-password-file=vault_password server.yml
查看加密的文件
[root@ansible ansible]# ansible-vault view server.yml
Vault password:
123456
编辑现有加密的文件
此命令将文件解密为一个临时文件,并允许编辑。保存时,它将复制其内容并删除临时文件。
[root@ansible ansible]# ansible-vault edit server.yml
Vault password:
注意:不要用vi/vim直接编辑加密文件,这样会导致加密文件无法打开
加密现有的文件
此命令可取多个想要加密文件的名称作为参数
#加密单个文件
[root@ansible ~]# ansible-vault encrypt server.yml
New Vault password:
Confirm New Vault password:
Encryption successful
#加密多个文件
[root@ansible ~]# ansible-vault encrypt hehe haha
New Vault password:
Confirm New Vault password:
Encryption successful
解密现有的文件
在解密单个文件时,可使用**–output**选项以其他名称保存解密的文件
[root@ansible ~]# ansible-vault decrypt hehe haha
Vault password:
Decryption successful
[root@ansible ~]# cat hehe
123456
[root@ansible ~]# cat haha
123456
更改加密的密码
此命令可一次性更新多个数据文件的密钥。它将提示提供原始密码和新密码。
[root@ansible ~]# ansible-vault rekey hehe
Vault password: #//当前密码
New Vault password: #输入要更改的新密码
Confirm New Vault password: #重复一遍新密码
Rekey successful
-
在使用vault密码文件时,请使用–new-vault-password-file选项
ansible-vault rekey --new-vault-password-file=NEW_VAULT_PASSWORD_FILE webserve
playbook和ansible vault
ansible-playbook命令没输密码的错误示范:
[root@localhost ~]# ansible-playbook site.yml
ERROR: A Vault password must be specified to decrypt vars/api_key.yml
要为playbook提供vault密码,可使用–vault-id选项。例如,要以交互方式提供vault密码,请使用下例中所示的–vault-id @prompt:
ansible-playbook --vault-id @prompt site.yml
或使用–vault-password-file选项指定以纯文本存储加密密码的文件
ansible-playbook --vault-password-file=vault-pw-file site.yml
注意:由于该文件包含敏感的纯文本密码,因此务必要通过文件权限和其他安全措施对其加以保护
当然,也可以使用ANSIBLE_VAULT_PASSWORD_FILE环境变量,指定密码文件的默认位置
ansible-playbook --vault-id one@prompt --vault-id two@prompt site.yml
注意:@prompt前面的vaultIDone和two可以是任何字符,甚至可以完全省略它们
推荐做法:
- 需要在playbook中使用多个vault密码,请确保每个加密文件分配一个vaultID,并在运行playbook时输入具有该vaultID的匹配密码
- Playbook变量(与清单变量相对)也可通过Ansible Vault保护。敏感的playbook变量可以放在单独的文件中
- 若要简化管理,务必要设置Ansible项目,使敏感变量和其他变量保存在相互独立的文件中
管理事实
描述ansible 事实
(1)编写playbook查看主机信息:
---
- name: Fact
hosts: all
tasks:
- name: Print all facts
debug:
var: ansible_facts #系统变量名 可以直接使用
...
(2)再将事实替换为动态的值:
---
- name: Fact
hosts: all
tasks:
- name: Print all facts
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 }}
#使用字典的方式查询值 ansible_facts.fqdn表示域名
...
ansible 事实作为变量注入
- 选定的Ansible事实名称比较
ansible_facts形式 | 旧事实变量形式 |
---|---|
ansible_facts[‘hostname’] | ansible_hostname |
ansible_facts[‘fqdn’] | ansible_fqdn |
ansible_facts[‘default_ipv4’][‘address’] | ansible_default_ipv4[‘address’] |
ansible_facts[‘interfaces’] | ansible_interfaces |
ansible_facts[‘devices’][‘vda’][‘partitions’][‘vda1’][‘size’] | ansible_devices[‘vda’][‘partitions’][‘vda1’][‘size’] |
ansible_facts[‘dns’][‘nameservers’] | ansible_dns[‘nameservers’] |
ansible_facts[‘kernel’] | ansible_kernel |
实例:
[root@ansible ~]# ansible 192.168.230.98 -m setup
192.168.230.98 | SUCCESS => {
"ansible_facts": {
"ansible_all_ipv4_addresses": [
"192.168.230.98",
"192.168.122.1"
],
"ansible_all_ipv6_addresses": [
"fe80::250:56ff:fe33:3b4c"
],
"ansible_apparmor": {
"status": "disabled"
},
"ansible_architecture": "x86_64",
"ansible_bios_date": "07/29/2019",
"ansible_bios_version": "6.00",
"ansible_cmdline": {
"BOOT_IMAGE": "(hd0,msdos1)/vmlinuz-4.18.0-193.el8.x86_64",
"crashkernel": "auto",
"quiet": true,
"rd.lvm.lv": "rhel/swap",
关闭事实收集(提升执行速度):
有时我们不想为play收集事实。这样做的原因可能有:
- 不准备使用任何事实
- 希望加快play速度
- 希望减小play在受管主机上造成的负载
- 受管主机因为某种原因无法运行setup模块
- 需要安装一些必备软件后再收集事实
---
- name: User
hosts: 192.168.230.98
gather_facts: no #关闭事实收集
tasks:
- name: User
user:
name: haha
uid: 2001
state: present
...
注意:即使play设置了gather_facts: no,也可以随时通过运行使用setup模块的任务来手动收集事实:
创建自定义事实
创建自定义事实可以使用 INI 格式或者 JSON 格式。自定义格式不能使用 ymal 格式,使用最为接近的 json 最好
默认情况下,setup模块从各受管主机的/etc/ansible/facts.d目录下的文件和脚本中加载自定义事实。
#INI 格式
[packages]
web_package = httpd
db_package = mariadb-server
[users]
user1 = westos
user2 = redhat
#JSON 格式
{
"packages": {
"web_package": "httpd",
"db_package": "mariadb-server"
},
"users": {
"user1": "Linux",
"user2": "redhat"
}
}
注意:创建自定义事实时,最好在目录 /etc/ansible/facts.d下创建,并且各个文件或脚本的名称(事实)必须以.fact结尾。
实例:
[root@ansible ansible]# mkdir /etc/ansible/facts.d
[root@ansible ansible]# cd facts.d/
[root@ansible facts.d]# vim zizi.fact
[root@ansible facts.d]# cat zizi.fact
{
"packages": {
"web_package": "httpd",
"db_package": "mariadb-server"
},
"users": {
"user1": "linux",
"user2": "redhat"
}
}
[root@ansible facts.d]# ansible localhost -m setup
[WARNING]: error loading fact - please check content
localhost | SUCCESS => {
"ansible_facts": {
"ansible_all_ipv4_addresses": [
"192.168.230.100",
"192.168.122.1"
],
"ansible_all_ipv6_addresses": [
"fe80::20c:29ff:fe1e:56a0"
],
"ansible_apparmor": {
"status": "disabled"
},
"ansible_architecture": "x86_64",
"ansible_bios_date": "07/29/2019",
"ansible_bios_version": "6.00",
"ansible_cmdline": {
"BOOT_IMAGE": "(hd0,msdos1)/vmlinuz-4.18.0-193.el8.x86_64",
"crashkernel": "auto",
"quiet": true,
"rd.lvm.lv": "rhel/swap",
"resume": "/dev/mapper/rhel-swap",
"rhgb": true,
"ro": true,
"root": "/dev/mapper/rhel-root"
# 自定义事实生效:
"ansible_local": {
"zizi": {
"packages": {
"db_package": "mariadb-server",
"web_package": "httpd"
},
"users": {
"user1": "linux",
"user2": "redhat"
}
}
},
使用魔法变量
最常用的有四个:
魔法变量 | 说明 |
---|---|
hostvars | 包含受管主机的变量可以用于获取另一台受管主机的变量的值。 如果还没有为受管主机收集事实则不会包含该主机的事实。 |
group_names | 列出当前受管主机所属的所有组 |
groups | 列出清单中的所有组和主机 |
inventory_hostname | 包含清单中配置的当前受管主机的主机名称 各种原因有可能与事实报告的主机名称不同 |
使用debug模块报告特定主机的hostvars变量的内容:
ansible 192.168.230.98 -m debug -a 'var=hostvars["localhost"]'
想要了解更多可以点击链接进行深入学习:https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html#variable-precedence-where-should-i-put-a-variable