3

我已经准备好了 Ansible 剧本,它们包括几个加密的变量。通过正常流程,我可以提供一个保管库密码文件来解密它们--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 Vault 密码,然后可以用来取消你的 Ansible 变量的保管库)并拥有你的部署过程创建一个一次性使用令牌,该令牌通过Terraform 的模板注入到用户数据脚本中。

为此,您可能需要使用某种形式的帮助脚本来包装 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 中使用类似这样的模板(也未经测试):

模板.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}"
    }
}

初始化.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 之类的东西来触发针对它运行的剧本。这使您可以将秘密保存在进行配置的中央机器上,而不必将它们分发到您正在部署的每个实例。

使用 Ansible Tower,这是使用回调完成的,您需要设置作业模板,然后让您的用户数据脚本卷曲 Tower 以触发配置运行。您可以将您的用户数据脚本更改为以下内容:

模板.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}"
    }
}

初始化.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 乍一看似乎是一个秘密,但它是一个共享密钥,可用于多个主机访问作业模板,并且仅当主机在作业模板的静态清单中定义或如果您使用的是动态清单,那么如果在该查找中找到主机。

于 2016-06-10T07:14:06.623 回答