web-dev-qa-db-ja.com

ボールトにansible_become_passを格納する方法とそれを使用する方法?

私はansibleの初心者で、いくつかのサーバーでSudo apt-get updateSudo 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という環境変数に格納されます。私の知る限り、ボールト内の変数を検索する方法はありません。

では、どこから自分のパスワードを検索して安全に保管できるようにファイルを整理するにはどうすればよいでしょうか。

18
CristianCantoro

ヴォールトされた変数ファイルをいくつか作成し、それらをプレイブックまたはコマンドラインに含める必要があります。

インベントリファイルを変更して、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
20
ydaetskcoR

独自の関連設定でインベントリをセットアップした後。これらの設定は、サーバーにアクセスするためのrsa-keyペアがすでに設定されていることを前提としています。 ssh [email protected]でサーバーに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
4
andy_roddam

この問題を解決する最良の方法は、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で呼び出す必要があります。

1
ofrommel