4

リモート サーバーにアップロードしたいファイルがローカル マシンにあり、VCS で公開したくない機密情報が含まれています。また、動的に置換する必要があるテキストもあります (現時点では、Jinja2 プレースホルダー "{{}}" として)。

コピー モジュールを使用すると、ファイルをアップロードするとボールトが解除されますが、明らかにプレースホルダーは置き換えられます。

テンプレート モジュールを使用すると、ファイルのボールトが解除されないため、暗号化された形式でアップロードされます (暗号化によって難読化されているため、プレースホルダーも置き換えられません)。

リモートサーバーに (ansible を使用して) ファイルをテンプレート化し、vault を解除するにはどうすればよいですか?

4

4 に答える 4

10

コメントで既に述べたように、シークレットを変数に設定し、プロビジョニング中にそれらをテンプレートにレンダリングすることもできますが、何らかの理由でテンプレート全体をシークレットにしたい場合は、それを行うための回避策もいくつかあります。

暗号化されたテンプレートの処理

回避策として、テンプレートをローカルで一時的に復号化し、ロールアウト後に復号化されたファイルをlocal_actionモジュールで削除することができます。template.enc暗号化されたテンプレートがロールtemplatesディレクトリにあると仮定しましょう。

---

- name: Decrypt template
  local_action: "shell {{ view_encrypted_file_cmd }} {{ role_path }}/templates/template.enc > {{ role_path }}/templates/template"
  changed_when: False

- name: Deploy template
  template:
    src=templates/template
    dest=/home/user/file

- name: Remove decrypted template
  local_action: "file path={{ role_path }}/templates/template state=absent"
  changed_when: False

注意してくださいchanged_when: False。これは、ansible ロールでべき等テストを実行するために重要です。そうしないと、プレイブックを実行するたびに変更が通知されます。ではgroup_vars/all.yml、再利用のためにグローバルな復号化コマンドを設定できます (例: view_encrypted_file_cmd.

group_vars/all.yml

---

view_encrypted_file_cmd: "ansible-vault --vault-password-file {{ lookup('env', 'ANSIBLE_VAULT_PASSWORD_FILE') }} view"

暗号化された静的ファイルの処理

一方向: テンプレートとして

秘密の静的ファイル (秘密鍵など) の内容を ansible の変数として設定し、それをテンプレートとしてプロビジョニングできます。

var.yml

---

my_private_key: |
  YOUR KEY
  asfdlsafkj
  asdlkfjasf

テンプレート/private_key.j2

{{ private_key }}

タスク/main.yml

---

template: 
  src=templates/private_key.j2
  dest=/home/user/.ssh/id_rsa
  vars:
    private_key: "{{ my_private_key }}"

別の方法: ルックアップ パイプ経由

もう 1 つの方法は、lookupモジュールを使用してモジュール内のプロパティpipeを設定することです。この方法では、追加の変数は必要ありません。contentcopy

---

- copy:
    dest=/your/dest
    content=lookup('pipe', 'VAULT_PASSWORD_FILE=path/to/pass_file ansible-vault view path/to/file.enc')
于 2016-06-07T17:02:02.747 に答える