管理机密
文章目录
- 管理机密
- 1. Ansible Vault
- 2. 创建加密的文件,并查看
- 3. 编辑现有的加密文件
- 4. 加密现有的文件
- 5. 解密现有的文件
- 6. 更改加密文件的密码
- 7. playbook和ansible vault
- 8. 变量文件管理的推荐做法
- 9. yml语言
1. Ansible Vault
- Ansible提供的Ansible Vault可以加密和解密任何由Ansible使用的结构化数据文件。
- 若要使用Ansible Vault,可通过一个名为ansible-vault的命令行工具创建、编辑、加密、解密和查看文件。
- Ansible Vault可以加密任何由Ansible使用的结构化数据文件。这可能包括清单变量、playbook中含有的变量文件、在执行playbook时作为参数传递的变量文件,或者Ansible角色中定义的变量。
2. 创建加密的文件,并查看
[root@129a ~]# cd /opt/httpd/
[root@129a httpd]# ls
ansible.cfg group_vars install.yml test.yml web
files host_vars inventory vars
[root@129a httpd]# cd vars/
[root@129a vars]# ls
httpd
//1.创建加密文件
[root@129a vars]# ansible-vault create 123
New Vault password:
Confirm New Vault password:
[root@129a vars]# ll
total 8
-rw-------. 1 root root 419 Jun 1 09:53 123
-rw-r--r--. 1 root root 71 May 29 23:59 httpd
//2.查看加密文件,自己输入密码
[root@129a vars]# ansible-vault view 123
Vault password:
name: httpd
port: 80
[root@129a vars]#
//3.可以用vault密码文件来存储vault密码,而不是通过标准输入途径输入vault密码。这样做需要使用文件权限和其他方式来严密保护该文件。
[root@129a httpd]# vim .passwd
[root@129a httpd]# cat .passwd
123456
[root@129a httpd]# ansible-vault view --vault-password-file .passwd vars/123
name: httpd
port: 80
[root@129a httpd]#
3. 编辑现有的加密文件
- 要编辑现有的加密文件,Ansible Vault提供了ansible-vault edit filename命令。此命令将文件解密为一个临时文件,并允许编辑。保存时,它将复制其内容并删除临时文件。
[root@129a httpd]# ansible-vault edit vars/123
Vault password:
[root@129a httpd]# ansible-vault view --vault-password-file .passwd vars/123
name: httpd
port: 81
[root@129a httpd]#
- edit子命令始终重写文件,因此只应在进行更改时使用它。要查看文件的内容而不进行更改时,应使用view子命令
4. 加密现有的文件
[root@129a httpd]# ansible-vault encrypt vars/httpd
New Vault password:
Confirm New Vault password:
Encryption successful
[root@129a httpd]# ansible-vault view vars/httpd
Vault password:
lamp:
pkg:
web: httpd
database: mariadb
application: php
5. 解密现有的文件
[root@129a httpd]# ansible-vault decrypt vars/123
Vault password:
Decryption successful
[root@129a httpd]# cat vars/123
name: httpd
port: 81
[root@129a httpd]#
6. 更改加密文件的密码
[root@129a httpd]# ansible-vault view --vault-password-file .passwd vars/httpd
ERROR! Decryption failed (no vault secrets were found that could decrypt) on vars/httpd for vars/httpd
[root@129a httpd]# ansible-vault rekey vars/httpd
Vault password:
New Vault password:
Confirm New Vault password:
Rekey successful
[root@129a httpd]# ansible-vault view --vault-password-file .passwd vars/httpd
lamp:
pkg:
web: httpd
database: mariadb
application: php
[root@129a httpd]#
在使用vault密码文件时,请使用--new-vault-password-file选项
[root@129a httpd]# vim .httpd
[root@129a httpd]# cat .httpd
123123
[root@129a httpd]#
[root@129a httpd]# ansible-vault rekey --new-vault-password-file .httpd vars/httpd
Vault password:
Rekey successful
[root@129a httpd]#
[root@129a httpd]# ansible-vault view --vault-password-file .httpd vars/httpd
lamp:
pkg:
web: httpd
database: mariadb
application: php
[root@129a httpd]#
7. playbook和ansible vault
- 要为playbook提供vault密码,可使用–vault-id选项。例如,要以交互方式提供vault密码
[root@129a httpd]# ansible-playbook -C --vault-id @prompt install.yml
Vault password (default):
PLAY [webservers] **************************************************************
TASK [Gathering Facts] *********************************************************
ok: [130h]
[root@129a httpd]# ansible-playbook -C --vault-id @prompt install.yml
Vault password (default):
PLAY [webservers] **************************************************************
TASK [Gathering Facts] *********************************************************
ok: [130h]
TASK [Delete the yum source] ***************************************************
changed: [130h]
TASK [Provide the yum source file] *********************************************
ok: [130h]
TASK [install apache] **********************************************************
ok: [130h]
TASK [Provides web site] *******************************************************
ok: [130h]
TASK [config apache] ***********************************************************
ok: [130h]
TASK [run httpd] ***************************************************************
ok: [130h]
TASK [close firewalld] *********************************************************
ok: [130h]
PLAY RECAP *********************************************************************
130h : ok=8 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[root@129a httpd]#
- 也可使用–vault-password-file选项指定以纯文本存储加密密码的文件。密码应当在该文件中存储为一行字符串。由于该文件包含敏感的纯文本密码,因此务必要通过文件权限和其他安全措施对其加以保护。
[root@129a httpd]# ansible-playbook -C --vault-password-file .httpd install.yml
PLAY [webservers] **************************************************************
TASK [Gathering Facts] *********************************************************
ok: [130h]
TASK [Delete the yum source] ***************************************************
changed: [130h]
TASK [Provide the yum source file] *********************************************
ok: [130h]
TASK [install apache] **********************************************************
ok: [130h]
TASK [Provides web site] *******************************************************
ok: [130h]
TASK [config apache] ***********************************************************
ok: [130h]
TASK [run httpd] ***************************************************************
ok: [130h]
TASK [close firewalld] *********************************************************
ok: [130h]
PLAY RECAP *********************************************************************
130h : ok=8 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[root@129a httpd]#
环境变量
export ANSIBLE_VAULT_PASSWORD_FILE=/opt/httpd/.httpd
ansible-playbook install.yml
[root@129a httpd]# ansible-vault create vars/port
New Vault password:
Confirm New Vault password:
[root@129a httpd]# ansible-vault view vars/port
Vault password:
port: 82
[root@129a httpd]#
[root@129a httpd]# ansible-playbook --vault-id one@prompt --vault-id two@prompt install.yml
Vault password (one):
Vault password (two):
PLAY [webservers] **************************************************************
TASK [Gathering Facts] *********************************************************
ok: [130h]
TASK [Delete the yum source] ***************************************************
changed: [130h]
TASK [Provide the yum source file] *********************************************
changed: [130h]
TASK [install apache] **********************************************************
ok: [130h]
TASK [Provides web site] *******************************************************
ok: [130h]
TASK [config apache] ***********************************************************
ok: [130h]
TASK [run httpd] ***************************************************************
ok: [130h]
TASK [close firewalld] *********************************************************
ok: [130h]
PLAY RECAP *********************************************************************
130h : ok=8 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[root@129a httpd]#
8. 变量文件管理的推荐做法
- 若要简化管理,务必要设置Ansible项目,使敏感变量和其他变量保存在相互独立的文件中。然后,包含敏感变量的文件可通过ansible-vault命令进行保护
- 管理组变量和主机变量的首选方式是在playbook级别上创建目录。group_vars目录通常包含名称与它们所应用的主机组匹配的变量文件。host_vars目录通常包含名称与它们所应用的受管主机名称匹配的变量文件
- 除了使用group_vars和host_vars中的文件外,也可对每一主机组或受管主机使用目录。这些目录可包含多个变量文件,它们都由该主机组或受管主机使用
- 例如,在playbook.yml的以下项目目录中,webservers的主机组的成员将使用group_vars/webservers/vars文件中的变量,而172.16.103.129将使用host_vars/172.16.103.129/vars和host_vars/172.16.103.129/vault中的变量
- 用于172.16.103.129的大部分变量可以放在vars文件中,敏感变量则可单独放在vault文件中保密。然后使用ansible-vault加密vault文件,而将vars文件保留为纯文本
- Playbook变量(与清单变量相对)也可通过Ansible Vault保护。敏感的playbook变量可以放在单独的文件中,此文件通过Ansible Vault加密,并能vars_files指令包含在该playbook中,playbook变量的优先级高于清单变量
- 如果需要在playbook中使用多个vault密码,请确保每个加密文件分配一个vaultID,并在运行playbook时输入具有该vaultID的匹配密码。这可确保在解密vault加密文件时先选择正确的密码,这比强制Ansible尝试用户提供的所有vault密码直至找到正确的密码要快。
9. yml语言
YAML
是一种直观的能够被电脑识别的数据序列化格式,是一个可读性高并且容易被人类阅读,容易和脚本语言交互,用来表达资料序列的编程语言。- 它类似于标准通用标记语言的子集XML的数据描述语言,语法比XML简单很多
- YAML的基本规则:
- 使用缩进来表示层级关系,每层2个空格,禁止使用TAB键
- 当冒号不是处于最后时,冒号后面必须有一个空格
- 用 - 表示列表,- 的后面必须有一个空格
- 用 # 表示注释