ボールトにansible_become_passを格納する方法とそれを使用する方法?
私は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
ファイルにプレーンテキストで保存されているという事実です。
vaults について読みましたが、 変数とvaultのベストプラクティス についても読みましたが、これを私の最小限のユースケースに適用する方法がわかりません。
lookups も使用しようとしました。一般的にはインベントリファイルでも機能しますが、次のようなことができます。
[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
という環境変数に格納されます。私の知る限り、ボールト内の変数を検索する方法はありません。
では、どこから自分のパスワードを検索して安全に保管できるようにファイルを整理するにはどうすればよいでしょうか。
ヴォールトされた変数ファイルをいくつか作成し、それらをプレイブックまたはコマンドラインに含める必要があります。
インベントリファイルを変更して、become passに変数を使用すると、この変数はVaultに保管されます。
[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>
Rootパスワードをファイルに保存する必要があります(私は「my_vault.yml」と呼んでいます)。これは、次のコマンドで実行できます。
~/.ansible$ ansible-vault create my_vault.yml
次のようにリモートサーバーのパスワードを単純に保存します( '<>'タグは含めないでください)
su_password: <myreallyspecialpassword>
これでパスワードはボールトによって暗号化され、これを表示する唯一の方法は次のコマンドを入力することです。
~/.ansible$ ansible-vault edit my_vault.yml
プレイブックに 'my_vault.yml'ファイルを含める必要があります。これを行うには、vars-files
を使用してsu-password
の値を取得します。これで、ansible_become_pass
という名前の変数を作成できます。これには、my_vault.yml
ファイルから値が渡され、リモートユーザーがサーバーで一度suできるようになります。
---
- name: My Awesome Playbook
hosts: remote
become: yes
vars_files:
- ~/.ansible/my_vault.yml
vars:
ansible_become_pass: '{{ su_password }}'
roles:
- some_awesome_role
このPlaybookを実行するたびにVaultを使用しているため、次のコマンドを使用する必要があります。
ansible-playbook myawesome_playbook.yml --ask-vault-pass
この問題を解決する最良の方法は、Host_varsを使用することです。最も簡単な設定は、次のように対応するHost_varsディレクトリのVault暗号化ファイルにansible_become_pass
を置くだけです。
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 docsのアドバイス に続いて、ホストごとに別の名前の暗号化された変数から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
で呼び出す必要があります。