目录
一、管理机密:
1、Ansible Vault :
2、ansible-vault 命令行工具:
(1)创建加密文件:
(2)查看加密文件:
(3)编辑现有加密文件:
(4)加密现有文件:
(5)解密现有文件:
(6)更改加密文件的密码:
3、运行加密 playbook :
(1)通过密码文件提供密码:
(2)以交互方式提供密码:
4、禁用 Playbook artifact :
(1)命令行:
(2)修改文件:
二、管理事实:
1、Ansible facts:
2、将事实作为变量注入:
3、事实收集:
(1)关闭事实收集:
(2)收集事实的子集:
4、自定义事实:
(1)常用场景:
(2)创建自定义事实:
(3)使用自定义事实:
5、使用魔法变量:
一、管理机密:
1、Ansible Vault :
Ansible 可能需要访问密码或 API 密钥等敏感数据,以便配置远程服务器。通常,这些信息以纯文本形式存储在变量清单或其它 Ansible 文件中。若是任何有权访问 Ansible 文件的用户,以及存储这些 Ansible 文件的版本控制系统都能够访问这些敏感数据,将存在很大的安全风险,因此 Ansible 提供了 Ansible Vault 加密敏感变量。
使用随 Ansible 提供的 Ansible Vault ,可以加密和解密任何由 Ansible 使用的结构化数据文件(例如,清单变量、 playbook 中含有的变量文件、在执行 playbook 时作为参数传递的变量文件、以及 Ansible 角色中定义的变量等)。
2、ansible-vault 命令行工具:
若要使用 Ansible Vault ,可通过一个名为 ansible-vault 的命令行工具来创建、编辑、加密、解密和查看文件。
注:Ansible Vault 并不实施自有的加密函数,而是使用外部的 Python 工具集。文件通过 AES256 的对称加密(将密码用作机密密钥)方式加以保护,而这种方式尚未得到第三方正式审核。
(1)创建加密文件:
要创建新的加密文件,可以使用 ansible-vault create filename 命令。该命令将提示输入新的 vault 密码,同时会利用默认的编辑器 vi 打开文件。
注:1)除了通过标准输入途径输入 vault 密码外,还可以使用 vault 密码文件来存储 vault 密码。密码文件是以纯文本形式存储加密密码的文件,密码应当在该文件中存储为一行字符串;
2)由于该文件中包含敏感的纯文本密码,因此密码文件务必要通过文件权限和其他安全措施加以严密保护(在最新的 Ansible 版本中,用于保护文件的密文是 AES256 );
3)需要使用密码文件时,用户可通过 --vault-password-file 选项进行指定。
(2)查看加密文件:
用户可以使用 ansible-vault view filename 命令来查看 Ansible Vault 加密的⽂件,⽽不必打开文件进行编辑。
(3)编辑现有加密文件:
编辑现有的加密文件可使用 Ansible Vault 提供的 ansible-vault edit filename 命令。此命令会将文件解密为一个临时文件,并允许用户编辑该文件。而在编辑结束保存文件时,此命令会将其内容进行复制并删除临时文件。
注:edit 子命令会改写文件,因此仅可在进行更改时使用它。若要查看文件的内容而不进行更改,始终应使用 view 子命令。
(4)加密现有文件:
使用 ansible-vault encrypt filename 命令可以加密已存在的⽂件。同时 ansible-vault encrypt filename 命令可取多个欲加密⽂件的文件名称作为参数。
若文件已为加密文件或待加密文件没有内容时,执行此命令均会报错。
1)已加密:
2)没有内容:
注:使用 --output=OUTPUT_FILE 选项,可将加密⽂件以新的名称进行保存。
(5)解密现有文件:
现有的加密⽂件可以通过 ansible-vault decrypt filename 命令进行永久解密。
注:同样,在解密单个⽂件时,也可使用 --output=OUTPUT_FILE 选项将解密⽂件以新的名称进行保存。
(6)更改加密文件的密码:
使用 ansible-vault rekey filename 命令可更改加密⽂件的密码,此命令可同时更新多个数据⽂件的密钥,需要提供原始密码和新密码。
注:若更改密码时,用户需要使用 Vault 密码⽂件,可使用 --new-vault-password-file 选项以实现此操作。
3、运行加密 playbook :
如需访问通过 Ansible Vault 加密的 playbook ,则需要向 ansible-playbook 命令提供其加密密码。
(1)通过密码文件提供密码:
在执行 playbook 时,使用 --new-vault-password-file 选项可提供加密密码。
注:若运行加密 playbook 时没有提供加密密码,命令将报错。
(2)以交互方式提供密码:
若要以交互方式提供 vault 密码,可使用 --vault-id @prompt 选项实现。
用户还可以通过 ansible-navigator 使用多个 Ansible Vault 密码,将多个 --vault-id 选项或 --vault-password-file 选项传递给 ansible-navigator 命令。
注:必须禁用 playbook artifact 才能以交互方式输入 Vault 密码。若 ansible-navigator 命令需要提示用户输入交互式 Vault 密码,并且 playbook artifact 未禁用,则该命令会挂起。
4、禁用 Playbook artifact :
(1)命令行:
Playbook artifact 默认处于启用状态,用户可以使用 ansible-navigator --playbook-artifact-enable false 命令禁用 playbook artifact 。
(2)修改文件:
另外,用户还可以通过修改项目 ansible-navigator.yml 文件或主目录中的 .ansible-navigator.yml 文件来禁用 playbook artifact 。
二、管理事实:
1、Ansible facts:
Ansible 事实( facts )是 Ansible 从受管主机自动探查到的变量,由 ansible.builtin.setup 模块调取,其包含的信息存储到可重复使用的变量中。此外,用户也可以创建自定义事实,这些事实对于该系统来说是唯一的,存储在受管主机上。
事实 | 变量 |
---|---|
简短的主机名称 | ansible_facts['hostname'] |
完全限定的域名 | ansible_facts['fqdn'] |
基于路由的 IPv4 地址 | ansible_facts['default_ipv4']['address'] |
所有网络接口的名称列表 | ansible_facts['interfaces'] |
/dev/vda1 磁盘分区的大小 | ansible_facts['devices']['vda']['partitions']['vda1']['size'] |
DNS 服务器列表 | ansible_facts['dns']['nameservers'] |
当前运行的内核版本 | ansible_facts['kernel'] |
事实可提供主机名称、内核版本、网络接口、IP 地址、操作系统版本、各种环境变量、CPU 数量、可用内存、可用磁盘空间等信息。
Ansible 事实可以成为 playbook 的一部分。借助事实,用户可以方便地检索受管主机的状态,并根据此状态确定要执行的操作。例如,根据当前内核版本重新启动服务器、根据可用的内存来自定义 MySQL 配置文件、根据主机名称来创建用户等等。
2、将事实作为变量注入:
Ansible 2.5 之前,事实变量是以 ansible_ 字符串为前缀的单个变量注入, Ansible 2.5 之后,事实变量的前缀变为 ansible_facts 。目前仍有许多 playbook 使用作为变量注入的事实,而非使用 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 |
注:可在配置文件 [default] 中用 inject_facts_as_vars = false 关闭对两种表示方式的兼容。
3、事实收集:
(1)关闭事实收集:
为了加快 playbook 的运行速度,或受管主机不支持 setup 模块,可将事实收集功能关闭,即将 gather_facts 关键字设置为 no 。
注:即使将 gather_facts 关键字设置为 no ,用户也可以在 play 中通过 ansible.builtin.setup 模块手动收集事实。
(2)收集事实的子集:
系统默认会收集所有事实,如仅需收集事实的子集,而非所有事实,同样可以通过 ansible.builtin.setup 模块实现。
如需收集除特定子集以外的所有事实,在子集名称前面添加 ! 即可。
4、自定义事实:
管理员可以自行创建事实,将它们推送到受管主机。自定义事实创建后将由 ansible.builtin.setup 模块收集和读取。
(1)常用场景:
1)基于自定义脚本定义系统的特定值;
2)基于程序执行定义值。
(2)创建自定义事实:
通常情况下, ansible.builtin.setup 模块将从各个受管主机的 /etc/ansible/facts.d 目录中加载自定义事实。这些文件或脚本是采用 INI 或 JSON 格式的纯文本文件,其扩展名必须以 .fact 结尾才可以使用。
1)INI 格式:
在 INI 事实文件中,首先定义事实的顶级分类(例如,[packages] ),后跟欲定义事实的键值对。
2)JSON 格式:
同样的内容以 JSON 格式实现,使用语法如下:
注:⾃定义事实⽂件不能采用同 playbook 相同的 YAML 格式,而 JSON 格式是最为接近的等效格式。
(3)使用自定义事实:
在 playbook 中,自定义事实和默认事实的使用方式相同。
5、使用魔法变量:
魔法变量( magic variables )即一些并非是 ansible.buildin.setup 模块采集的事实或配置信息,但是很有用,仍可以被 ansible 使用的变量。
魔法变量有 4 种常用类型如下:
(1)hostvars :是包含受管主机的变量,可以用于列出受管主机的非事实变量。
注:若还没有为受管主机收集事实,则 hostvars 不会包含该主机的事实。
(2)group_names :可列出受管主机所属的所有组。
(3)groups :可列出所有 inventory 中的组( groups )和主机( hosts )。
(4)inventory_hostname :可列出当前受管主机在 inventory 中定义的主机名,因为各种原因这可能和事实报告中的主机名不同。
注:更多有关魔法变量的信息可参考https://docs.ansible.com/ansible/latest/reference_appendices/special_variables.html