Автор оригинала: Vyacheslav.
Простое доказательство концепции, как поделиться некоторыми чувствительными переменными между террафом и неизбежными таким образом, что позволяет совершать в Git, в то время как также разумно легко расшифровать, а также разумно использоваться через непредубежденную игру.
Неизбежный
Давайте создадим некоторые чувствительные переменные в Anisible Play, env-default-secure-vars.yml
:
--- # Secure vars shared between terraform and ansible shared_secure_var1: securevalue1 shared_secure_var2: securevalue2
и зашифровать этот файл, используя Ansible-Vault Encrypt Env-Default-Secure-Vars.yml
Давайте проверим, может ли Anisible может работать пожелание зашифрованных вариантов, используя PlayBook
--- - name: TerraformAnsiblePOC hosts: localhost gather_facts: no pre_tasks: - include_vars: "env-default-secure-vars.yml" - include_vars: "env-default-vars.yml" tasks: - debug: - debug: var="shared_secure_var2"
PLAY [TerraformAnsiblePOC] ***************** TASK [debug] ******************************* ok: [localhost] => { "shared_secure_var1": "securevalue1" } TASK [debug] ******************************* ok: [localhost] => { "shared_secure_var2": "securevalue2" } PLAY RECAP ****************************************************************** localhost : ok=4 changed=0 unreachable=0 failed=0
Террафор
Теперь давайте посмотрим, как мы можем потреблять в террафоре те же данные?
К счастью, у нас есть встроенный провайдер внешний, Это позволяет потребляться корма JSON, возвращенная внешней программой
data "external" "ansible" { program = [ "tf_ansible_vault.sh", "env-default-secure-vars.yml"] } output "shared_secure_var1" { value = "${data.external.ansible.result.shared_secure_var1}" } output "shared_secure_var2" { value = "${data.external.ansible.result.shared_secure_var2}" }
Давайте писать раковину, которая вернет JSON представление зашифрованных варс.
#!/bin/bash set -ef -o pipefail # Keep environment clean export LC_ALL="C" # Set variables readonly TMP_DIR="/tmp" readonly TMP_OUTPUT="${TMP_DIR}/$$.out" readonly BASE_DIR="$(dirname "$(realpath "$0")")" readonly MY_NAME="${0##*/}" # Cleanup on exit trap 'rm -rf ${TMP_OUTPUT}' \ EXIT SIGHUP SIGINT SIGQUIT SIGPIPE SIGTERM if [[ -z "$ANSIBLE_VAULT_IDENTITY_LIST" ]] then echo "Please export path to vault id via ANSIBLE_VAULT_IDENTITY_LIST" exit 1 fi if [[ -z "$1" ]] then echo "Please provide path to secrets file" exit 1 fi #echo cp $1 $TMP_OUTPUT cp $1 $TMP_OUTPUT ansible-vault decrypt $TMP_OUTPUT > /dev/null python -c 'import sys, yaml, json; json.dump(yaml.load(sys.stdin), sys.stdout, indent=4)' < $TMP_OUTPUT rm $TMP_OUTPUT
Проверка, если работает скрипт …
./tf_ansible_vault.sh env-default-secure-vars.yml { "shared_secure_var2": "securevalue2", "shared_secure_var1": "securevalue1" }
И теперь давайте проверим с Terraform Play:
terraform apply data.external.ansible: Refreshing state... Apply complete! Resources: 0 added, 0 changed, 0 destroyed. Outputs: shared_secure_var1 = securevalue1 shared_secure_var2 = securevalue2
Кажется, это работает. Выглядит очень многообещающе, но давайте посмотрим на Terraform.tfstate
{ "version": 3, "terraform_version": "0.11.11", "serial": 1, "lineage": "7f589f33-7ef8-7d45-19ab-d053412dd875", "modules": [ { "path": [ "root" ], "outputs": {}, "resources": { "data.external.ansible": { "type": "external", "depends_on": [], "primary": { "id": "-", "attributes": { "id": "-", "program.#": "2", "program.0": "tf_ansible_vault.sh", "program.1": "env-default-secure-vars.yml", "result.%": "2", "result.shared_secure_var1": "securevalue1", "result.shared_secure_var2": "securevalue2" }, "meta": {}, "tainted": false }, "deposed": [], "provider": "provider.external" } }, "depends_on": [] } ] }
Мы видим там наши расшифрованные безопасные варики, так что все еще будьте осторожны, как вы его храните. У террафора есть несколько билетов вокруг подобных проблем (https://github.com/hashicorp/terrasorm/issues/4436) в течение нескольких лет, но нет хорошего решения до сих пор.
Резюме
POC показывает, как вы можете поделиться некоторыми из ваших важных переменных с террафом и спиной (Terraform может генерировать переменные YML-файл). Может быть подходит для некоторых ситуаций, хотя и не идеал.
Узнайте пример при примере в https://github.com/voronenko/poc-terraform-ansable-bridge
Оригинал: «https://www.codementor.io/@slavko/sharing-sensitive-variables-between-ansible-and-terraform-tt48bfm0v»