次の例のような 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
ステートメントを変数として解析しようとしたためです。
問題が、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以降)
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 }}"
現時点では、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
これに似たことができます。
Ansibleプロジェクトフォルダーにansible.cfg
を作成します
[defaults]
vault_password_file = <path/to/your/password/file>
プレイブックファイルを作成します(例: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 }}'"`
変数ファイルを作成します(例:vars.yml
)
my_secure_variable: "X_my_secret_X"
変数ファイルを暗号化する(ansible.cfg
を使用してansibleプロジェクトの場所から)
ansible-vault encrypt vars.yml
プレイブックを実行します(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
それはあなたのワークフローに依存します。 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
を調整します)。
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に変換できます。