3

Ansible Playbook の準備ができており、いくつかの暗号化された変数が含まれています。通常のプロセスでは、vault パスワード ファイルをフィードして暗号化解除し--vault-password-file ~/.vault_pass.txt、リモート EC2 インスタンスに変更をデプロイできます。したがって、パスワード ファイルを公開する必要はありません。

しかし、私の要求はここで異なります。user-data新しい EC2 インスタンスを作成するときに、スクリプトにansible-playbook の変更を含める必要があります。理想的には、インスタンスの実行後にすべての設定を自動的に準備する必要があります。

以下の簡単なスクリプトで、 Terraformを使用してインスタンスをデプロイします。user-data

#!/usr/bin/bash

yum -y update
/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

そのため、プレイブックに暗号化された変数がいくつかある場合は、パスワードファイルをユーザーデータスクリプトにもアップロードする必要があります。

それを避けるために私にできることはありますか?Ansible Towerはこの要求に役立ちますか?

CredStashでテストしましたが、まだ鶏と卵の問題です。

4

1 に答える 1

2

インスタンスを自分自身で構成したい場合は、すべての認証情報を取得するか、別の方法で認証情報を取得する必要があります。

頭の中で考えられる最善の方法は、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 は、ホストがジョブ テンプレートの静的インベントリーで定義されている場合、またはホストが定義されている場合にのみ実行されます。動的インベントリを使用している場合、そのルックアップでホストが見つかった場合。

于 2016-06-10T07:14:06.623 に答える