簡體   English   中英

Ansible:如何在單獨的保險庫文件中加密庫存文件中的某些變量?

[英]Ansible: How to encrypt some variables in an inventory file in a separate vault file?

設置

考慮類似於以下示例的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拱頂 ,而不是整個文件。

如何將保險庫加密的ansible文件導入未加密的庫存文件?

我試過的

我創建了一個加密的vars文件,並嘗試使用以下命令導入它:

include: secrets

ansible-playbook回復:

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

可能是因為它試圖將include語句解析為變量。

從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

將其粘貼到您的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 }}"

如果您的問題是每個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

此語句返回上面的yaml中dbPasswd變量中顯示的文本。

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

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

或者您可以使用--ask-vault-pass執行相同的操作,在執行playbook時要求您輸入密碼:

ansible-playbook playbooks/myplaybook --ask-vault-pass

你可以做類似的事情。

  1. 創建一個密碼文件(一行包含您的密碼的純文本文件)
  2. ansible.cfg項目文件夾中創建一個ansible.cfg

     [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.cfgansible.cfg項目位置ansible.cfg

     ansible-vault encrypt vars.yml 
  6. 運行你的劇本(使用ansible.cfgansible.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

這取決於您的工作流程。 您可以根據Sebastian Stigler的建議使用group_vars文件,或者如果您想使用庫存文件,您只需在庫存目錄中添加另一個“類似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 )。

您可以使用group_vars(請參閱http://docs.ansible.com/playbooks_variables.html#variable-precedence-where-should-i-put-a-variable )。

在您的group_vars創建一個名為group_vars的子目錄。
在那里,您創建一個名為west_coast的文件,並在其中放入以下條目:

---
db_server: foo.example.com
db_host: 5432
db_password: top secret password

然后可以將此文件轉換為ansible庫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM