机密和事实

机密和事实

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值