动态加密配置变量并将其放置在特定文件夹中
Dynamically encrypting configuration variables and placing them in specific folders
我有一个配置文件,其中包含用户需要更改以适应其环境的字符串变量列表:
配置文件示例:
# 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...
我不确定如何最好地解决这个问题,主要的挑战是如何:
- 成功加密每个变量,而不加密整个文件
- 将加密变量复制到指定文件
我只是把它放在一起,但它适用于你的情况,保留结构和缩进:
#!/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}
我有一个配置文件,其中包含用户需要更改以适应其环境的字符串变量列表:
配置文件示例:
# 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...
我不确定如何最好地解决这个问题,主要的挑战是如何:
- 成功加密每个变量,而不加密整个文件
- 将加密变量复制到指定文件
我只是把它放在一起,但它适用于你的情况,保留结构和缩进:
#!/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}