[英]How to distribute / Where to store keys that applications need to access HashiCorp Vault
[英]How to store ansible_become_pass in a vault and how to use it?
我是ansible的新手,並且我使用一個非常簡單的劇本在幾台服務器上發布sudo apt-get update
和sudo apt-get upgrade
。
這是我正在使用的劇本:
---
- name: Update Servers
hosts: my-servers
become: yes
become_user: root
tasks:
- name: update packages
apt: update_cache=yes
- name: upgrade packages
apt: upgrade=dist
這是我的~/.ansible/inventory/hosts
文件的摘錄:
[my-servers]
san-francisco ansible_host=san-francisco ansible_ssh_user=user ansible_become_pass=<my_sudo_password_for_user_on_san-francisco>
san-diego ansible_host=san-diego ansible_ssh_user=user ansible_become_pass=<my_sudo_password_for_user_on_san-diego>
這是我啟動該劇本所得到的:
$ ansible-playbook update-servers-playbook.yml
PLAY [Update Servers] **********************************************************
TASK [setup] *******************************************************************
ok: [san-francisco]
ok: [san-diego]
TASK [update packages] *********************************************************
ok: [san-francisco]
ok: [san-diego]
TASK [upgrade packages] ********************************************************
ok: [san-francisco]
ok: [san-diego]
PLAY RECAP *********************************************************************
san-francisco : ok=3 changed=0 unreachable=0 failed=0
san-diego : ok=3 changed=0 unreachable=0 failed=0
讓我困擾的是我的用戶user
密碼以明文形式存儲在~/.ansible/inventory/hosts
文件中。
我已經閱讀了有關保管庫的信息 ,也了解了有關變量和保管庫的最佳做法,但是我不知道如何將其應用於我的最小用例。
我也嘗試使用查找 。 通常,它們也可以在清單文件中工作,而我可以執行以下操作:
[my-servers]
san-francisco ansible_host=san-francisco ansible_ssh_user=user ansible_become_pass="{{ lookup('env', 'ANSIBLE_BECOME_PASSWORD_SAN_FRANCISCO') }}"
在這種情況下,密碼將存儲在名為ANSIBLE_BECOME_PASSWORD_SAN_FRANCISCO
的環境變量中; 據我所知,沒有辦法在金庫中查找變量。
因此,如何組織文件,以便能夠從某個地方查找密碼並將其安全存儲?
您需要創建一些拱形變量文件,然后將其包括在您的劇本或命令行中。
如果將清單文件更改為使用變量作為通行證,則可以存儲此變量:
[my-servers]
san-francisco ansible_host=san-francisco ansible_ssh_user=user ansible_become_pass='{{ sanfrancisco_become_pass }}'
san-diego ansible_host=san-diego ansible_ssh_user=user ansible_become_pass='{{ sandiego_become_pass }}'
然后使用ansible-vault create vaulted_vars.yml
創建具有以下內容的存儲文件:
sanfrancisco_become_pass: <my_sudo_password_for_user_on_san-francisco>
sandiego_become_pass : <my_sudo_password_for_user_on_san-diego>
然后,將像這樣的文件作為額外的變量包括在內:
ansible-playbook -i ~/.ansible/inventory/hosts playbook.yml --ask-vault-pass -e@~/.ansible/inventory/vault_vars
或通過include_vars任務將vars文件包括在您的劇本中:
- name : include vaulted variables
include_vars: ~/.ansible/inventory/vault_vars
用您自己的相關設置設置清單后。 這些設置假定您已經設置了rsa-key對來訪問服務器。 您應該能夠使用ssh remoteuser@155.42.88.199 SSH進入服務器
[local]
localhost ansible_connection=local
[remote]
155.42.88.199 ansible_connection=ssh ansible_user=remoteuser ansible_become_user=root ansible_become=yes ansible_ssh_private_key_file=<private_key_file_path>
您需要將您的根密碼存儲在一個文件中(我叫我的“ my_vault.yml”)。 您可以使用以下命令執行此操作:
~/.ansible$ ansible-vault create my_vault.yml
只需按以下方式存儲遠程服務器密碼(不包括'<>'標記)
su_password: <myreallyspecialpassword>
現在,密碼將由Vault加密,查看此密碼的唯一方法是輸入以下命令。
~/.ansible$ ansible-vault edit my_vault.yml
現在,我們需要在我們的劇本中包含“ my_vault.yml”文件。 我們可以使用vars-files
來獲取su-password
的值。 現在,我們可以創建一個名為ansible_become_pass
,該變量將傳遞自my_vault.yml
文件中的值,這將使我們的my_vault.yml
用戶可以在服務器上運行一次。
---
- name: My Awesome Playbook
hosts: remote
become: yes
vars_files:
- ~/.ansible/my_vault.yml
vars:
ansible_become_pass: '{{ su_password }}'
roles:
- some_awesome_role
每次我們要運行此劇本時都在使用保管庫,因此我們需要使用以下命令。
ansible-playbook myawesome_playbook.yml --ask-vault-pass
解決此問題的最佳方法是使用host_vars。 最簡單的設置是將ansible_become_pass
放入相應host_vars目錄中的Vault加密文件中,如下所示:
myplaybook.yml
host_vars/onehost.com/crypted
host_vars/otherhost.com/crypted
在crypted
文件中,放置ansible_become_pass
變量的分配:
ansible_become_pass: SuperSecre3t
使用ansible-vault create
創建文件,使用ansible-vault edit
。
按照Ansible文檔中的建議,您需要為每個主機創建一個附加文件,該ansible_become_passwd
從名稱不同的加密變量中分配ansible_become_passwd
。 這樣,可以在項目文件中搜索ansible_become_passwd
。
myplaybook.yml
host_vars/onehost.com/plain
host_vars/onehost.com/crypted
host_vars/otherhost.com/plain
host_vars/otherhost.com/crypted
plain
文件包含以下內容:
ansible_become_pass: "{{ vaulted_become_pass }}"
crypted
文件將設置vaulted_become_pass
所示。
所有crypted
文件必須使用相同的密鑰加密,並且ansible-playbook
必須使用--ask-vault-pass
調用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.