web-dev-qa-db-ja.com

Ansible:個別のボールトファイル内のインベントリファイル内のいくつかの変数を暗号化する方法は?

設定

次の例のような Ansibleインベントリファイル を検討してください。

[san_diego]
Host1
Host2

[san_francisco]
Host3
Host4

[west_coast]
san_diego
san_francisco

[west_coast:vars]
db_server=foo.example.com
db_Host=5432
db_password=top secret password

問題

いくつかの変数(db_passwordなど)を Ansible vault に保存したいのですが、ファイル全体ではありません。

ボールトで暗号化されたansibleファイルを、暗号化されていないインベントリファイルにインポートするにはどうすればよいですか?

私が試したこと

暗号化されたvarsファイルを作成し、それをインポートしようとしました:

include: secrets

ansible-playbookが応答したもの:

ERROR: variables assigned to group must be in key=value form

おそらく、includeステートメントを変数として解析しようとしたためです。

59
Adam Matan

問題が、group_hostsごとに暗号化されていないvarsファイルと暗号化されたvarsファイルの両方を持つことである場合。

このansible機能を使用できます。 http://docs.ansible.com/ansible/playbooks_best_practices.html#best-practices-for-variables-and-vaults

group_vars/ 
  san_diego/
    vars.yml  # unencrypted yaml file
    vault.yml # encrypted yaml file

Ansibleはvault.ymlを暗号化されたyamlファイルとして自動的に読み取ります。

更新:ソリューション 以下 も良いソリューションです(Ansible 2.3以降)

45
Antoine

Ansible 2.3以降では、Single Encrypted Variableを暗号化できます。 IMO、ドコはかなり簡潔に見えるので、ウォークスルーが必要です。

例:mysql_password: password123(main.yml内)

次のようなコマンドを実行します:

ansible-vault encrypt_string password123 --ask-vault-pass

これは以下を生成します:

    !vault |
$ANSIBLE_VAULT;1.1;AES256
66386439653236336462626566653063336164663966303231363934653561363964363833
3136626431626536303530376336343832656537303632313433360a626438346336353331
Encryption successful

これをmain.ymlに貼り付けます:

mysql_password: !vault |
    $ANSIBLE_VAULT;1.1;AES256
    66386439653236336462626566653063336164663966303231363934653561363964363833
    3136626431626536303530376336343832656537303632313433360a626438346336353331

プレイブックの実行:

すなわち、ansible-playbook -i hosts main.yml --ask-vault-pass

デバッグで確認:

- debug:
    msg: "mysql Pwd: {{ mysql_password }}"
78
wired00

現時点では、Ansible 2.3では、プレーンなyamlに暗号化された変数と暗号化されていない変数の両方を含めることができます。暗号化される変数の形式は次のとおりです。

dbServer: PlainDatabaseServer
dbName: PlainDatabaseName
dbUser: PlainUser
dbPasswd: !vault |
      $ANSIBLE_VAULT;1.1;AES256
      63633363616165656538656537323835343634633063386137353637646663333939623464666437
      6263383933656635316436313934366564316337623435350a386362613838373363393534383232
      39663162363066313431623466363763356466376538613532333731613538373431623239626330
      6463373238366630360a623566616535376339326431363465663431623462356238636333306663
      6439

次のステートメントでパスワードまたはパスワードファイルを使用して変数を暗号化できます。

ansible-vault encrypt_string "dummy" --vault-password-file pass-ansible.txt

このステートメントは、上記のyamlのdbPasswd変数に表示されるテキストを返します。

暗号化された変数を使用するプレイブックを実行するには、次の変数を追加します。

 ansible-playbook playbooks/myplaybook --vault-password-file pass-ansible.txt

または、プレイブックの実行時にパスワードを要求する--ask-vault-passでも同じことができます。

ansible-playbook playbooks/myplaybook --ask-vault-pass
13
V. Morate

これに似たことができます。

  1. パスワードファイルを作成します(パスワードを1行に入力したプレーンテキストファイル)
  2. Ansibleプロジェクトフォルダーにansible.cfgを作成します

    [defaults]
    vault_password_file = <path/to/your/password/file>
    
  3. プレイブックファイルを作成します(例:playbook.yml

     - name: my ansible playbook
       hosts: 127.0.0.1
       vars_files:
         - 'vars.yml'
       tasks:
         - name: print secure variable
           debug: msg="my secure variable '{{ my_secure_variable }}'"`
    
  4. 変数ファイルを作成します(例:vars.yml

    my_secure_variable: "X_my_secret_X"
    
  5. 変数ファイルを暗号化する(ansible.cfgを使用してansibleプロジェクトの場所から)

    ansible-vault encrypt vars.yml
    
  6. プレイブックを実行します(ansible.cfgでansibleプロジェクトの場所から)

    ansible-playbook -i "localhost," playbook.yml
    

次のような出力が得られます。

$ ansible-playbook playbook.yml -i 'localhost,'

PLAY [my ansible playbook] ****************************************************

GATHERING FACTS ***************************************************************

ok: [127.0.0.1]

TASK: [print secure variable] *************************************************

ok: [127.0.0.1] => {
    "msg": "my secure variable 'X_my_secret_X' "
}

PLAY RECAP ********************************************************************

127.0.0.1                  : ok=2    changed=0    unreachable=0    failed=0
5
grandma

それはあなたのワークフローに依存します。 Sebastian Stiglerの提案に従ってgroup_varsファイルを使用できます。インベントリファイルを使用する場合は、インベントリディレクトリに別の「iniに似た」ファイルを追加して暗号化するだけです。

$ mkdir my_inventory/
$ cat >> hosts << EOF
[san_diego]
Host1
Host2

[san_francisco]
Host3
Host4

[west_coast]
san_diego
san_francisco
EOF

$ cat >> inventory_crypted_vars << EOF
[west_coast:vars]
db_server=foo.example.com
db_Host=5432
db_password=top secret password
EOF

次に、コマンドラインで-i my_inventory/を使用するか、次を含むローカルansible.cfgを作成します。

[defaults]
hostfile = ./my_inventory/

設定する必要があります。 Ansibleは、実行時に両方のファイルをマージします。

コミットする前にansible-vault encrypt my_inventory/inventory_crypted_varsを使用すると、設定が完了します。

おそらく、ファイルの暗号化されていないバージョンをコミットしないようにするために、事前コミットフックが必要です。たとえば、 このような事前コミットフック はトリックを行います(それに応じてFILES_PATTERNを調整します)。

3
leucos

Group_varsを使用できます( http://docs.ansible.com/playbooks_variables.html#variable-precedence-where-should-i-put-a-variable を参照)。

プレイブックにgroup_varsという名前のサブディレクトリを作成します。
そこで、west_coastという名前のファイルを作成し、次のエントリをその中に入れます。

---
db_server: foo.example.com
db_Host: 5432
db_password: top secret password

その後、このファイルをansible vaultに変換できます。

0