Ansible:如何在单独的保险库文件中加密库存文件中的某些变量?

Ada*_*tan 62 encryption ansible ansible-playbook ansible-vault

设置

考虑类似于以下示例的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
Run Code Online (Sandbox Code Playgroud)

问题

我想db_passwordAnsible库中存储一些变量(例如),但不是整个文件.

如何将保险库加密的ansible文件导入未加密的库存文件?

我试过的

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

include: secrets
Run Code Online (Sandbox Code Playgroud)

为了这ansible-playbook与回应:

ERROR: variables assigned to group must be in key=value form
Run Code Online (Sandbox Code Playgroud)

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

wir*_*d00 86

从Ansible 2.3开始,您可以加密单个加密变量.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
Run Code Online (Sandbox Code Playgroud)

将其粘贴到您的main.yml中:

mysql_password: !vault |
    $ANSIBLE_VAULT;1.1;AES256
    66386439653236336462626566653063336164663966303231363934653561363964363833
    3136626431626536303530376336343832656537303632313433360a626438346336353331
Run Code Online (Sandbox Code Playgroud)

运行剧本:

也就是说, ansible-playbook -i hosts main.yml --ask-vault-pass

通过调试验证:

- debug:
    msg: "mysql Pwd: {{ mysql_password }}"
Run Code Online (Sandbox Code Playgroud)

  • 截至2018年8月,这应被视为上述问题的正确答案. (5认同)
  • 有没有一种方法可以一次解密所有的保险库值,而不必复制/粘贴每个加密的字符串并运行 encrypt_string 的反向操作? (2认同)

Ant*_*ine 49

如果您的问题是每个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
Run Code Online (Sandbox Code Playgroud)

Ansible将自动读取vault.yml作为加密的yaml文件.

更新:下面的解决方案也是很好的解决方案(因为Ansible 2.3)

  • 确切地说,您可以使用san_diego.yml或san_diego/vars.yml,这是相同的. (2认同)

V. *_*ate 13

在Ansible 2.3的这个时候,可以在一个简单的yaml中包含加密和未加密的变量.加密变量的格式如下:

dbServer: PlainDatabaseServer
dbName: PlainDatabaseName
dbUser: PlainUser
dbPasswd: !vault |
      $ANSIBLE_VAULT;1.1;AES256
      63633363616165656538656537323835343634633063386137353637646663333939623464666437
      6263383933656635316436313934366564316337623435350a386362613838373363393534383232
      39663162363066313431623466363763356466376538613532333731613538373431623239626330
      6463373238366630360a623566616535376339326431363465663431623462356238636333306663
      6439
Run Code Online (Sandbox Code Playgroud)

您可以使用密码或密码文件使用以下语句加密变量:

ansible-vault encrypt_string "dummy" --vault-password-file pass-ansible.txt
Run Code Online (Sandbox Code Playgroud)

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

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

 ansible-playbook playbooks/myplaybook --vault-password-file pass-ansible.txt
Run Code Online (Sandbox Code Playgroud)

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

ansible-playbook playbooks/myplaybook --ask-vault-pass
Run Code Online (Sandbox Code Playgroud)


gra*_*dma 5

你可以做类似的事情.

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

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

    my_secure_variable: "X_my_secret_X"
    
    Run Code Online (Sandbox Code Playgroud)
  5. 加密变量文件(来自ansible项目位置ansible.cfg)

    ansible-vault encrypt vars.yml
    
    Run Code Online (Sandbox Code Playgroud)
  6. 运行你的剧本(来自ansible项目的位置ansible.cfg)

    ansible-playbook -i "localhost," playbook.yml
    
    Run Code Online (Sandbox Code Playgroud)

你应该得到类似于的输出:

$ 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
Run Code Online (Sandbox Code Playgroud)

  • 换句话说,这并没有回答问题,即“如何加密_某些变量_”。 (2认同)