インスタンスを自分自身で構成したい場合は、すべての認証情報を取得するか、別の方法で認証情報を取得する必要があります。
頭の中で考えられる最善の方法は、Hashicorp の Vaultを使用して資格情報を保存することです (潜在的にすべてのシークレット、または Ansible 変数をアンボールトするために使用できる Ansible Vault パスワードのみ) を保存し、デプロイ プロセスは、 Terraform のテンプレートを介してユーザー データ スクリプトに挿入される1 回限りのトークンを作成します。
これを行うには、Terraform 適用コマンドを次のような形式のヘルパー スクリプトでラップすることをお勧めします (未テスト)。
#!/bin/bash
vault_host="10.0.0.3"
vault_port="8200"
response=`curl \
-X POST \
-H "X-Vault-Token:$VAULT_TOKEN" \
-d '{"num_uses":"1"}' \
http://${vault_host}:${vault_port}/auth/token/create/ansible_vault_read`
vault_token=`echo ${response} | jq '.auth.client_token' --raw-output`
terraform apply \
-var 'vault_host=${vault_host}'
-var 'vault_port=${vault_port}'
-var 'vault_token=${vault_token}'
次に、ユーザー データ スクリプトを Terraform で次のようにテンプレート化する必要があります (これもテストされていません)。
template.tf:
resource "template_file" "init" {
template = "${file("${path.module}/init.tpl")}"
vars {
vault_host = "${var.vault_host}"
vault_port = "${var.vault_port}"
vault_token = "${var.vault_token}"
}
}
init.tpl:
#!/usr/bin/bash
yum -y update
response=`curl \
-H "X-Vault-Token: ${vault_token}" \
-X GET \
http://${vault_host}:${vault_port}/v1/secret/ansible_vault_pass`
ansible_vault_password=`echo ${response} | jq '.data.ansible_vault_pass' --raw-output`
echo ${ansible_vault_password} > ~/.vault_pass.txt
/usr/local/bin/aws s3 cp s3://<BUCKET>/ansible.tar.gz ansible.tar.gz
gtar zxvf ansible.tar.gz
cd ansible
ansible-playbook -i inventory/ec2.py -c local ROLE.yml --vault-password-file ~/.vault_pass.txt
または、インスタンスに Ansible Tower などを呼び出して Playbook をトリガーし、それに対して実行させることもできます。これにより、展開するすべてのインスタンスに秘密を配布するのではなく、設定を行う中央のボックスに秘密を保持できます。
Ansible Tower では、これはコールバックを使用して行われます。ジョブ テンプレートをセットアップしてから、ユーザー データ スクリプトで Tower をカールさせて構成の実行をトリガーする必要があります。代わりに、ユーザー データ スクリプトを次のように変更できます。
template.tf:
resource "template_file" "init" {
template = "${file("${path.module}/init.tpl")}"
vars {
ansible_tower_host = "${var.ansible_tower_host}"
ansible_host_config_key = "${var.ansible_host_config_key}"
}
}
init.tpl:
#!/usr/bin/bash
curl \
-X POST
--data "host_config_key=${ansible_host_config_key}" \
http://{${ansible_tower_host}/v1/job_templates/1/callback/
host_config_key は一見秘密のように見えるかもしれませんが、複数のホストがジョブ テンプレートにアクセスするために使用できる共有キーであり、Ansible Tower は、ホストがジョブ テンプレートの静的インベントリーで定義されている場合、またはホストが定義されている場合にのみ実行されます。動的インベントリを使用している場合、そのルックアップでホストが見つかった場合。