73

设置

考虑一个类似于以下示例的Ansible 清单文件:

[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中,但不是整个文件。

如何将 Vault 加密的 ansible 文件导入未加密的清单文件?

我试过的

我创建了一个加密的 vars 文件并尝试使用以下命令导入它:

include: secrets

对此ansible-playbook作出回应:

ERROR: variables assigned to group must be in key=value form

可能是因为它试图将include语句解析为变量。

4

6 回答 6

114

从 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

运行剧本:

IE,ansible-playbook -i hosts main.yml --ask-vault-pass

通过调试验证:

- debug:
    msg: "mysql Pwd: {{ mysql_password }}"
于 2017-05-29T11:24:29.407 回答
60

如果您的问题是每个 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 开始)

于 2015-10-27T12:35:13.760 回答
17

目前,使用 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

此语句返回上面 yaml 中 dbPasswd 变量中显示的文本。

要运行使用加密变量的剧本,只需添加以下 var:

 ansible-playbook playbooks/myplaybook --vault-password-file pass-ansible.txt

或者您可以使用 --ask-vault-pass 执行相同的操作,在执行 playbook 时要求您输入密码:

ansible-playbook playbooks/myplaybook --ask-vault-pass
于 2017-05-18T09:39:05.113 回答
6

你可以做类似的事情。

  1. 创建一个密码文件(一个纯文本文件,您的密码在一行上)
  2. ansible.cfg在您的 ansible 项目文件夹中创建一个

    [defaults]
    vault_password_file = <path/to/your/password/file>
    
  3. 创建一个剧本文件(例如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 }}'"`
    
  4. 创建一个变量文件(例如vars.yml

    my_secure_variable: "X_my_secret_X"
    
  5. 加密变量文件(从 ansible 项目位置使用ansible.cfg

    ansible-vault encrypt vars.yml
    
  6. 运行你的剧本(从 ansible 项目位置使用ansible.cfg

    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
于 2015-06-22T00:02:30.273 回答
4

这取决于您的工作流程。您可以group_vars按照 Sebastian Stigler 的建议使用文件,或者如果您想使用库存文件,您可以在库存目录中添加另一个“类似 ini”的文件并对其进行加密。

$ 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,你就设置好了。

您可能需要一个预提交挂钩来确保您没有提交文件的未加密版本。例如,像这样的预提交钩子可以解决问题(FILES_PATTERN相应地进行调整)。

于 2015-05-13T09:06:54.147 回答
0

您可以使用 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。

于 2015-05-13T08:34:49.227 回答