web-dev-qa-db-ja.com

Ansible Towerで既存のVaultファイルを使用するにはどうすればよいですか?

Group_varsやvaultファイルなど、以前にAnsible(スタンドアロン)で使用した既存のインベントリをAnsible Tower(3.2.0)にインポートしたい。

ただし、Vaultファイルが機能するようになると機能しなくなります。 Vaultパスワードファイルの認証情報をセットアップし、ソースタイプ「Sourced from a Project」を使用してインベントリを作成したら、[Source Details]でVault認証情報を選択できません。

Credentials Dialog screenshot

手動で挿入してソースを保存すると、次のエラーで同期が失敗します。

 1.735 INFO     Updating inventory 10: TEST
    1.753 DEBUG    Using system install of ansible-inventory CLI: /usr/bin/ansible-inventory
    1.753 INFO     Reading Ansible inventory source: /var/lib/awx/projects/_6__ansible_master/inventories/test/hosts
    1.754 DEBUG    Using private credential data in '/tmp/awx_123_LXUj9p'.
    1.755 DEBUG    Using fresh temporary directory '/tmp/awx_proot_ZURWmR' for isolation.
    1.755 DEBUG    Running from `/var/lib/awx/projects/_6__ansible_master/inventories/test` working directory.
Traceback (most recent call last):
  File "/usr/bin/awx-manage", line 9, in <module>
    load_entry_point('awx==3.2.0', 'console_scripts', 'awx-manage')()
  File "/lib/python2.7/site-packages/awx/__init__.py", line 107, in manage
  File "/var/lib/awx/venv/awx/lib/python2.7/site-packages/Django/core/management/__init__.py", line 354, in execute_from_command_line
    utility.execute()
  File "/var/lib/awx/venv/awx/lib/python2.7/site-packages/Django/core/management/__init__.py", line 346, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/var/lib/awx/venv/awx/lib/python2.7/site-packages/Django/core/management/base.py", line 394, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/var/lib/awx/venv/awx/lib/python2.7/site-packages/Django/core/management/base.py", line 445, in execute
    output = self.handle(*args, **options)
  File "/var/lib/awx/venv/awx/lib/python2.7/site-packages/Django/core/management/base.py", line 661, in handle
    return self.handle_noargs(**options)
  File "/lib/python2.7/site-packages/awx/main/management/commands/inventory_import.py", line 1000, in handle_noargs
  File "/lib/python2.7/site-packages/awx/main/management/commands/inventory_import.py", line 243, in load_inventory_source
  File "/lib/python2.7/site-packages/awx/main/management/commands/inventory_import.py", line 179, in load
  File "/lib/python2.7/site-packages/awx/main/management/commands/inventory_import.py", line 163, in command_to_json
RuntimeError: ansible-inventory failed (rc=4) with stdout:

stderr:
ERROR! Attempting to decrypt but no vault secrets found

また、ansible_vaultファイルを作成して変数「vault_password_file」をポイントするように試みましたが、これも機能しません(ボールトパスワードファイルが見つからないというメッセージが表示されます)。

誰かが以前にこれに遭遇したことがありますか?

6
Martial

したがって、これは実装上の問題のようでした。 RedHatによると、vaultファイルをインベントリと一緒に保持することはお勧めしません。これは、インベントリ同期が実行されるたびにファイルを復号化することになるためです。

これを解決する方法は、プレイブックで「vars_files」を使用することです。次のようになります。

  # Secrets
  vars_files:
    - '../../secrets/{{ tower_env }}/vault.yml'

Towerでは、tower_env変数を渡します。 「dev」または「qa」は、インベントリの同期時ではなく、プレイブックの実行時に対応するボールトファイルを復号化します。

4
Martial

(現時点では)サポートされていない2つのことを実行しようとしています:

  • インベントリのインポート時に秘密を解読する
  • 変数ではなく、ansible-vaultを使用してファイル全体を暗号化する

ここでの用語は少し貧弱ですが、これらのドキュメントの「単一の暗号化された変数」のセクションを参照してください。これらのインライン変数と呼ばれることがあります。

https://docs.ansible.com/ansible/latest/user_guide/playbooks_vault.html

Ansibleは、これらのインライン変数からインベントリ解析プロセスの移動をサポートするようになりました。この形式も安全であり、内部的には同じアルゴリズムです。暗号化された変数のnameは、ソース管理へのアクセス権を持つユーザーに公開されます(おそらく妥当です)が、値は暗号化されます。

その構文で値を.ymlまたはgroup_vars/フォルダーの下のHost_vars/変数ファイルに保存します。 Tower内でのインベントリの同期が成功し(ボールトの資格情報を使用せずに)、グループまたはホストに移動すると、変数の暗号化された形式が表示されます。

プレイブック(Towerのジョブテンプレート)を実行するときは、その時点でボールトの資格情報をアタッチします。これにより、実際に必要なランタイムコンテキストまで暗号化が遅延します。

インベントリファイル構造の例:

https://github.com/AlanCoding/Ansible-inventory-file-examples/tree/master/vault/single_var_file

また、他のコメントが指摘しているように、ファイル全体の暗号化変数またはインライン暗号化変数のいずれかを、プレイブックがあるソース管理のフォルダー構造に置くことができます。これは、Ansibleによって取得され、添付したボールト資格情報によって復号化されますジョブテンプレートに。

1
Alan Rominger

わかりました-調査後、次の理由により、バージョン2.6.5では現在これを行う方法がないことを認めることができます。

  • host_varsまたはgroup_varsのいずれかで変数を暗号化することは完全に可能です
  • ボールトパスフレーズは、次の方法でのみ使用されます。

-vault-password-fileパラメータ

-ask-vault-pass--vault-id=@Promptに置き換えられました

記載されたコードに従って ここでは220行目から

必要なのは、ボールトパスフレーズを提供する別の可能性です。グループ変数によって、現在不可能です。

そして、これはGithubの Bugreport が他の何かで解決/置換されないことを意味します。私見それはまだ他のすべてのスレッドによってカバーされていません。このgithubバグスレッドを続けます。

1