Ansible:如何在单独的保险库文件中加密清单文件中的某些变量?
Ansible: How to encrypt some variables in an inventory file in a separate vault file?
设置
考虑一个类似于以下示例的 Ansible inventory file:
[san_diego]
host1
host2
[san_francisco]
host3
host4
[west_coast]
san_diego
san_francisco
[west_coast:vars]
db_server=foo.example.com
db_host=5432
db_password=top secret password
问题
我想将一些变量(如 db_password
)存储在 Ansible vault 中,而不是整个文件。
如何将保管库加密的 ansible 文件导入到未加密的清单文件中?
我试过的
我已经创建了一个加密的 vars 文件并尝试将其导入:
include: secrets
ansible-playbook
回复:
ERROR: variables assigned to group must be in key=value form
可能是因为它试图将 include
语句解析为变量。
您可以使用 group_vars(参见 http://docs.ansible.com/playbooks_variables.html#variable-precedence-where-should-i-put-a-variable)。
在您的剧本中创建一个名为 group_vars
.
的子目录
在那里您创建一个名为 west_coast
的文件并在其中放入以下条目:
---
db_server: foo.example.com
db_host: 5432
db_password: top secret password
然后可以将此文件转换为 ansible vault。
这取决于您的工作流程。您可以按照 Sebastian Stigler 的建议使用 group_vars
文件,或者如果您想使用清单文件,您可以在清单目录中添加另一个 "ini-like" 文件并对其进行加密。
$ mkdir my_inventory/
$ cat >> hosts << EOF
[san_diego]
host1
host2
[san_francisco]
host3
host4
[west_coast]
san_diego
san_francisco
EOF
$ cat >> inventory_crypted_vars << EOF
[west_coast:vars]
db_server=foo.example.com
db_host=5432
db_password=top secret password
EOF
然后,在您的命令行中使用 -i my_inventory/
,或创建一个包含以下内容的本地 ansible.cfg
:
[defaults]
hostfile = ./my_inventory/
你应该准备好了。 Ansible 将在 运行 时间合并两个文件。
在提交之前使用 ansible-vault encrypt my_inventory/inventory_crypted_vars
就可以了。
您可能需要预提交挂钩以确保您不会提交文件的未加密版本。例如 a pre-commit hook like this 就可以了(相应地调整 FILES_PATTERN
)。
你可以做类似的事情。
- 创建一个密码文件(一个纯文本文件,您的密码在一行中)
在您的 ansible 项目文件夹中创建一个 ansible.cfg
[defaults]
vault_password_file = <path/to/your/password/file>
创建剧本文件(例如playbook.yml
)
- name: my ansible playbook
hosts: 127.0.0.1
vars_files:
- 'vars.yml'
tasks:
- name: print secure variable
debug: msg="my secure variable '{{ my_secure_variable }}'"`
创建变量文件(例如vars.yml
)
my_secure_variable: "X_my_secret_X"
加密变量文件(从带有ansible.cfg
的ansible项目位置)
ansible-vault encrypt vars.yml
运行 你的剧本(来自 ansible.cfg
的 ansible 项目位置)
ansible-playbook -i "localhost," playbook.yml
您应该得到类似于以下的输出:
$ ansible-playbook playbook.yml -i 'localhost,'
PLAY [my ansible playbook] ****************************************************
GATHERING FACTS ***************************************************************
ok: [127.0.0.1]
TASK: [print secure variable] *************************************************
ok: [127.0.0.1] => {
"msg": "my secure variable 'X_my_secret_X' "
}
PLAY RECAP ********************************************************************
127.0.0.1 : ok=2 changed=0 unreachable=0 failed=0
如果您的问题是根据 group_hosts 同时拥有未加密和加密的 vars 文件。
您可以使用这个 ansible 功能:http://docs.ansible.com/ansible/playbooks_best_practices.html#best-practices-for-variables-and-vaults
group_vars/
san_diego/
vars.yml # unencrypted yaml file
vault.yml # encrypted yaml file
Ansible 会自动读取 vault.yml 作为加密的 yaml 文件。
更新:解决方案 也是很好的解决方案(自 Ansible 2.3 起)
此时使用 Ansible 2.3 可以在普通的 yaml 中同时包含加密和未加密的变量。加密后的变量格式是这样的:
dbServer: PlainDatabaseServer
dbName: PlainDatabaseName
dbUser: PlainUser
dbPasswd: !vault |
$ANSIBLE_VAULT;1.1;AES256
63633363616165656538656537323835343634633063386137353637646663333939623464666437
6263383933656635316436313934366564316337623435350a386362613838373363393534383232
39663162363066313431623466363763356466376538613532333731613538373431623239626330
6463373238366630360a623566616535376339326431363465663431623462356238636333306663
6439
您可以通过以下语句使用密码或密码文件加密变量:
ansible-vault encrypt_string "dummy" --vault-password-file pass-ansible.txt
此语句 returns 上面 yaml 中的 dbPasswd 变量中显示的文本。
到 运行 使用加密变量的剧本只需添加以下变量:
ansible-playbook playbooks/myplaybook --vault-password-file pass-ansible.txt
或者你可以用 --ask-vault-pass 做同样的事情,它会在执行剧本时要求你输入密码:
ansible-playbook playbooks/myplaybook --ask-vault-pass
从 Ansible 2.3 开始,您可以加密 Single Encrypted Variable。
IMO,需要演练,因为 doco 看起来很简洁。
举个例子:mysql_password: password123
(在main.yml内)
运行 命令如:
ansible-vault encrypt_string password123 --ask-vault-pass
这将产生:
!vault |
$ANSIBLE_VAULT;1.1;AES256
66386439653236336462626566653063336164663966303231363934653561363964363833
3136626431626536303530376336343832656537303632313433360a626438346336353331
Encryption successful
将此粘贴到您的 main.yml:
mysql_password: !vault |
$ANSIBLE_VAULT;1.1;AES256
66386439653236336462626566653063336164663966303231363934653561363964363833
3136626431626536303530376336343832656537303632313433360a626438346336353331
运行剧本:
即ansible-playbook -i hosts main.yml --ask-vault-pass
通过调试验证:
- debug:
msg: "mysql Pwd: {{ mysql_password }}"
设置
考虑一个类似于以下示例的 Ansible inventory file:
[san_diego]
host1
host2
[san_francisco]
host3
host4
[west_coast]
san_diego
san_francisco
[west_coast:vars]
db_server=foo.example.com
db_host=5432
db_password=top secret password
问题
我想将一些变量(如 db_password
)存储在 Ansible vault 中,而不是整个文件。
如何将保管库加密的 ansible 文件导入到未加密的清单文件中?
我试过的
我已经创建了一个加密的 vars 文件并尝试将其导入:
include: secrets
ansible-playbook
回复:
ERROR: variables assigned to group must be in key=value form
可能是因为它试图将 include
语句解析为变量。
您可以使用 group_vars(参见 http://docs.ansible.com/playbooks_variables.html#variable-precedence-where-should-i-put-a-variable)。
在您的剧本中创建一个名为 group_vars
.
的子目录
在那里您创建一个名为 west_coast
的文件并在其中放入以下条目:
---
db_server: foo.example.com
db_host: 5432
db_password: top secret password
然后可以将此文件转换为 ansible vault。
这取决于您的工作流程。您可以按照 Sebastian Stigler 的建议使用 group_vars
文件,或者如果您想使用清单文件,您可以在清单目录中添加另一个 "ini-like" 文件并对其进行加密。
$ mkdir my_inventory/
$ cat >> hosts << EOF
[san_diego]
host1
host2
[san_francisco]
host3
host4
[west_coast]
san_diego
san_francisco
EOF
$ cat >> inventory_crypted_vars << EOF
[west_coast:vars]
db_server=foo.example.com
db_host=5432
db_password=top secret password
EOF
然后,在您的命令行中使用 -i my_inventory/
,或创建一个包含以下内容的本地 ansible.cfg
:
[defaults]
hostfile = ./my_inventory/
你应该准备好了。 Ansible 将在 运行 时间合并两个文件。
在提交之前使用 ansible-vault encrypt my_inventory/inventory_crypted_vars
就可以了。
您可能需要预提交挂钩以确保您不会提交文件的未加密版本。例如 a pre-commit hook like this 就可以了(相应地调整 FILES_PATTERN
)。
你可以做类似的事情。
- 创建一个密码文件(一个纯文本文件,您的密码在一行中)
在您的 ansible 项目文件夹中创建一个
ansible.cfg
[defaults] vault_password_file = <path/to/your/password/file>
创建剧本文件(例如
playbook.yml
)- name: my ansible playbook hosts: 127.0.0.1 vars_files: - 'vars.yml' tasks: - name: print secure variable debug: msg="my secure variable '{{ my_secure_variable }}'"`
创建变量文件(例如
vars.yml
)my_secure_variable: "X_my_secret_X"
加密变量文件(从带有
ansible.cfg
的ansible项目位置)ansible-vault encrypt vars.yml
运行 你的剧本(来自
ansible.cfg
的 ansible 项目位置)ansible-playbook -i "localhost," playbook.yml
您应该得到类似于以下的输出:
$ ansible-playbook playbook.yml -i 'localhost,'
PLAY [my ansible playbook] ****************************************************
GATHERING FACTS ***************************************************************
ok: [127.0.0.1]
TASK: [print secure variable] *************************************************
ok: [127.0.0.1] => {
"msg": "my secure variable 'X_my_secret_X' "
}
PLAY RECAP ********************************************************************
127.0.0.1 : ok=2 changed=0 unreachable=0 failed=0
如果您的问题是根据 group_hosts 同时拥有未加密和加密的 vars 文件。
您可以使用这个 ansible 功能:http://docs.ansible.com/ansible/playbooks_best_practices.html#best-practices-for-variables-and-vaults
group_vars/
san_diego/
vars.yml # unencrypted yaml file
vault.yml # encrypted yaml file
Ansible 会自动读取 vault.yml 作为加密的 yaml 文件。
更新:解决方案
此时使用 Ansible 2.3 可以在普通的 yaml 中同时包含加密和未加密的变量。加密后的变量格式是这样的:
dbServer: PlainDatabaseServer
dbName: PlainDatabaseName
dbUser: PlainUser
dbPasswd: !vault |
$ANSIBLE_VAULT;1.1;AES256
63633363616165656538656537323835343634633063386137353637646663333939623464666437
6263383933656635316436313934366564316337623435350a386362613838373363393534383232
39663162363066313431623466363763356466376538613532333731613538373431623239626330
6463373238366630360a623566616535376339326431363465663431623462356238636333306663
6439
您可以通过以下语句使用密码或密码文件加密变量:
ansible-vault encrypt_string "dummy" --vault-password-file pass-ansible.txt
此语句 returns 上面 yaml 中的 dbPasswd 变量中显示的文本。
到 运行 使用加密变量的剧本只需添加以下变量:
ansible-playbook playbooks/myplaybook --vault-password-file pass-ansible.txt
或者你可以用 --ask-vault-pass 做同样的事情,它会在执行剧本时要求你输入密码:
ansible-playbook playbooks/myplaybook --ask-vault-pass
从 Ansible 2.3 开始,您可以加密 Single Encrypted Variable。 IMO,需要演练,因为 doco 看起来很简洁。
举个例子:mysql_password: password123
(在main.yml内)
运行 命令如:
ansible-vault encrypt_string password123 --ask-vault-pass
这将产生:
!vault |
$ANSIBLE_VAULT;1.1;AES256
66386439653236336462626566653063336164663966303231363934653561363964363833
3136626431626536303530376336343832656537303632313433360a626438346336353331
Encryption successful
将此粘贴到您的 main.yml:
mysql_password: !vault |
$ANSIBLE_VAULT;1.1;AES256
66386439653236336462626566653063336164663966303231363934653561363964363833
3136626431626536303530376336343832656537303632313433360a626438346336353331
运行剧本:
即ansible-playbook -i hosts main.yml --ask-vault-pass
通过调试验证:
- debug:
msg: "mysql Pwd: {{ mysql_password }}"