Рубрики
Uncategorized

Совместное использование чувствительных переменных между неизбежным и террафором

Простое доказательство концепции, как поделиться некоторыми чувствительными переменными между террафом и неизбежными таким образом, что позволяет совершать в Git, в то время как также разумно легко расшифровать, а также использоваться в результате которого используется с помощью непредвзятости

Автор оригинала: 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»