Динамическое шифрование переменных конфигурации и размещение их в определенных папках - PullRequest
0 голосов
/ 25 апреля 2019

У меня есть файл конфигурации, который содержит список строковых переменных, которые пользователь должен изменить в соответствии со своей средой:

Пример файла конфигурации:

# first_file.yml

value_one: <UPDATE>
value_two: <UPDATE>

# second_file.yml

value_one: <UPDATE>
value_two: <UPDATE>

Как только пользовательизменив значение UPDATE, я хочу иметь возможность использовать хранилище для шифрования каждой переменной перед копированием зашифрованной переменной в файл, указанный в комментарии, с желаемым значением ниже:

# first_file.yml

value_one: !vault |
      $ANSIBLE_VAULT;1.1;AES256
      30663734346135353432323531336536636566643739656332613031636630383237666636366630
      6164633835363766666535656438306534343565636434330a626239396536373032373866353861
      37376665313438363561323262393337313266613237313065396338376438313737393234303434
      3035326633616339340a346164646366623932313261613662633938356662373438643831643830
      3432

value_two: !vault |
      $ANSIBLE_VAULT;1.1;AES256...

Я не уверен, какнаилучший подход к решению этой проблемы, при этом основной задачей является:

  1. Успешное шифрование каждой переменной без шифрования всего файла
  2. Копирование зашифрованной переменной в указанный файл

1 Ответ

1 голос
/ 25 апреля 2019

Я просто скомбинировал это, но это работает для вашего случая, сохраняя структуру и отступы:

#!/bin/bash
IFS=; while read line; do
  # read key and value from line
  key=$( echo "${line}" | cut -d: -f1 )
  value=$( echo "${line}" | cut -d: -f2 | tr -d '\n' )

  # Get spaces to indent
  indent=$( echo "${key}" | grep -o '^ *' )

  # if value is not empty... 
  if [ -n "$value" ]; then
    # Encrypt value and indent
    cval=$( echo -n "${value## }" | sed -e "s/^'//" -e "s/'$//" | ansible-vault encrypt_string --vault-password-file ~/.ssh/vault_key.txt | sed "s/^ / ${indent}/")
  fi

  # if key is not empty...
  if [ -n "$key" ]; then
    echo -n "${key}: ${cval}"
  fi
  # End the line
  echo
  # unset cval
  unset cval
done < /dev/stdin

Назовите его encrypt_values.sh, запустите chmod +x encrypt_values.sh, затем вы можете запустить его с помощью

cat {input-file} | ./encrypt_values.sh > {output_file}

Если у вас есть какая-то странная структура, сначала запустите файл через yq, чтобы очистить его:

yq r {imput-file} | ./encrypt_values.sh > {output_file}
...