使用Ansible-Vault进行加密

引入

以前我写过一篇名为“使用加密密码生成用户”的文章。
当时我想要加密的并不是整个文件,而是某个变量的一项,所以没有使用ansible-vault。
为了不想在生成用户时将密码以明文方式显示出来,我将用Python加密后的密码直接粘贴到了剧本中使用。
结果很顺利,当时我觉得做得不错,但是需要加密的项目越来越多。
使用Python加密只能应对上述情况,其他情况却不能适用。
版本已经更新了很多,会不会可以只加密某个变量的一项呢?于是我进行了搜索,然后…

有。

听说从Ansible 2.3版本开始,有这个功能。

确认ansible-vault的帮助。

因为每次都要敲命令来检查帮助太麻烦了,所以我把步骤贴在文章里了。
如果你想立即查看文章的内容,请跳过此步骤。

    ansible-vault -h
ansible-vault -h
Usage: ansible-vault [create|decrypt|edit|encrypt|encrypt_string|rekey|view] [options] [vaultfile.yml]

encryption/decryption utility for Ansible data files

Options:
  --ask-vault-pass      ask for vault password
  -h, --help            show this help message and exit
  --new-vault-id=NEW_VAULT_ID
                        the new vault identity to use for rekey
  --new-vault-password-file=NEW_VAULT_PASSWORD_FILE
                        new vault password file for rekey
  --vault-id=VAULT_IDS  the vault identity to use
  --vault-password-file=VAULT_PASSWORD_FILES
                        vault password file
  -v, --verbose         verbose mode (-vvv for more, -vvvv to enable
                        connection debugging)
  --version             show program's version number and exit

 See 'ansible-vault <command> --help' for more information on a specific
command.
    ansible-vault encrypt_string –help
ansible-vault encrypt_string --help
Usage: ansible-vault encrypt_string [--prompt] [options] string_to_encrypt

encryption/decryption utility for Ansible data files

Options:
  --ask-vault-pass      ask for vault password
  --encrypt-vault-id=ENCRYPT_VAULT_ID
                        the vault id used to encrypt (required if more than
                        vault-id is provided)
  -h, --help            show this help message and exit
  -n ENCRYPT_STRING_NAMES, --name=ENCRYPT_STRING_NAMES
                        Specify the variable name
  --new-vault-id=NEW_VAULT_ID
                        the new vault identity to use for rekey
  --new-vault-password-file=NEW_VAULT_PASSWORD_FILE
                        new vault password file for rekey
  --output=OUTPUT_FILE  output file name for encrypt or decrypt; use - for
                        stdout
  -p, --prompt          Prompt for the string to encrypt
  --stdin-name=ENCRYPT_STRING_STDIN_NAME
                        Specify the variable name for stdin
  --vault-id=VAULT_IDS  the vault identity to use
  --vault-password-file=VAULT_PASSWORD_FILES
                        vault password file
  -v, --verbose         verbose mode (-vvv for more, -vvvv to enable
                        connection debugging)
  --version             show program's version number and exit

 See 'ansible-vault <command> --help' for more information on a specific
command.

有以下的选项:–new-vault-id和–new-vault-password-file。从ansible 2.4+开始,可以使用–vault-id选项来创建多个vault-id和vault-passwrod。稍后会了解到这是关于什么的对话。

仅对变量进行单项加密。

如果在不指定ansible-vault密码的情况下使用,将会出现以下错误。

TASK [Gathering Facts] ***********************************************************************************************************************************************
fatal: [redmine]: FAILED! => {"msg": "Attempting to decrypt but no vault secrets found"}
        to retry, use: --limit @/Users/devtopia/.ansible/retry-files/redmine.retry

只需指定密码并使用,便可通过,因此请先准备好密码文件。

# 復号化する為のパスワードをgit repositoryではない他のところに保存する。
echo 'PASSWORD' > ~/.vault_pass

在这里,我将对变量”ansible_password”进行加密处理。
之前,我们将其保存在”hosts.ini”文件中,并且在”.gitignore”文件中指定了忽略该文件。
现在我将”ansible_user”和”ansible_password”从”hosts.ini”移动到”groups_var/all.yml”中。

# ansible_passwordというvariableを暗号化する。
echo -n 'PASSWORD' | ansible-vault encrypt_string --vault-id dev@~/.vault_pass --stdin-name 'ansible_password'

Reading plaintext input from stdin. (ctrl-d to end input)
ansible_password: !vault |
          $ANSIBLE_VAULT;1.2;AES256;dev
          38653564306332366561363062643632663834656465366430306139376163386535303539303034
          3335393633333538656534343631336238653063626135320a303834396534366235333030373464
          62336538663566653765646331666130323061373262646166613834343939323938333666303162
          3164303437306662630a646534643661323065373339363166366633363337396330323563656533
          3635
Encryption successful
    • ‘PASSWORD’のところに実際のパスワードを入力する。

 

    • encrypt_stringというのが1項目だけ暗号化する為のサブコマンドである。

 

    • –vault-idで「ラベル名@パスワードファイルのパス」

 

    –stdin-nameには暗号化したいvariable名(ここではansible_password)を入力する。

使用ansible-vault进行加密时,执行ansible或ansible-playbook命令时,必须通过选项指定密码文件。正如开头所提到的,如果不指定密码文件,将会出现错误。

ansible-playbook dev.yml --vault-password-file ~/.vault_pass

# ansible 2.4+
ansible-playbook dev.yml --vault-id ~/.vault_pass

由于每次输入“–vault-password-file ~/.vault_pass”很麻烦,所以可以将密码文件设置为环境变量ANSIBLE_VAULT_PASSWORD_FILE,并使用它。

# 環境変数の設定ファイルに追加
vim ~/.bash_profile
... snip ...
export ANSIBLE_VAULT_PASSWORD_FILE = ~/.vault_pass
... snip ...

# 追加したものを適用するために再読込
source ~/.bash_profile

# --vault-idや--vault-password-fileなしで使える。
ansible-playbook dev.yml

不仅可以通过环境变量,还可以通过ansible.cfg来进行配置。

... snip ...
vault_password_file = ~/.vault_pass

在尝试删除环境变量后,程序正常运行了。

接下来,当尝试加密其他变量时发生了错误。

echo -n 'PASSWORD' | ansible-vault encrypt_string --vault-id dev@~/.vault_pass --stdin redmine_password
Usage: ansible-vault encrypt_string [--prompt] [options] string_to_encrypt
... snip ...
command.
ERROR! The vault-ids dev,default are available to encrypt. Specify the vault-id to encrypt with --encrypt-vault-id

决策如下,该选项提供中文翻译:
“vault-ids dev、default可用于加密。请使用–encrypt-vault-id指定要使用的vault-id。”
如果按照给出的指令尝试使用–encrypt-vault-id,仍然出现错误。

echo -n 'PASSWORD' | ansible-vault encrypt_string --encrypt-vault-id dev@~/.vault_pass --stdin redmine_password
ERROR! Did not find a match for --encrypt-vault-id=dev@~/.vault_pass in the known vault-ids ['default']

能找到 vault-id吗?之前有dev和default可用,但现在只有default了。
可能是因为与密码文件一起写的原因,试过只更改为dev,但是出现同样的错误。

echo -n 'PASSWORD' | ansible-vault encrypt_string --encrypt-vault-id dev --stdin redmine_password
ERROR! Did not find a match for --encrypt-vault-id=dev in the known vault-ids ['default']

当我尝试搜索时,我发现还有一个名为”vault_identity_list”的配置值。

... snip ...
vault_password_file = ~/.vault_pass
vault_identity_list = dev@~/.vault_pass

如果将其添加到ansible.cfg并重新执行,则会成功。

echo -n 'PASSWORD' | ansible-vault encrypt_string --encrypt-vault-id dev --stdin redmine_password
Reading plaintext input from stdin. (ctrl-d to end input)
redmine_password: !vault |
          $ANSIBLE_VAULT;1.2;AES256;dev
          61643061336363643331323437643535356333633439303532646430636534646331373136323234
          3034373631396339306466373966643636353430303235320a646635336539646131343264306433
          65626333643864636639353833326462323166636434393539613663333365383134366635373337
          3866346238313866630a626135663230323462366661653434316361333636353530326231623437
          3736
Encryption successful

看起来,–vault-id和–vault-password-file似乎有相同的用途。
当我搜索”vault-id vs vault-password-file”时,这个关键词自动弹出。
–vault-id是在–vault-password-file基础上进行了功能扩展,两者都可以使用,但只使用–vault-id也是可以的。这应该是其意思。

如果我從ansible.cfg中刪除了vault_password_file並嘗試後,成功了。

可能只需要将标签名为”dev”的项添加到”vault_identity_list”中即可,如果未在ansible.cfg中添加”vault_identity_list”,则只会使用默认选项。

这对我来说很有帮助。

对整个文件进行加密。

将groups_var/db.yml中存放着数据库连接信息的文件进行整体加密。

# 暗号化
ansible-vault create group_vars/db.yml

# 暗号化した後、ファイルの内容
cat group_vars/db.yml
$ANSIBLE_VAULT;1.1;AES256
65656533363866316462313831663032353031626239633333323862323132616239306130303162
3531363266336538376239646430656134363132633339320a636531653933636336306339636666
35373765653935636233353733323538333835316139373632633131326231653838303862346338
3963663332346263340a613932326665303631373932313364623232666535326235383836356336
34373536336139363865633336313762393761386234353830643835376639376662623636363864
37383136396436366231616130376636303039396236343266633930383230363635306332643136
64633865386636636135383363663065396637636435666635653737383061616635616532373865
64343165393335353231363539383635666562653936316264316330373438646564323161303066
34363735323534383461623933333965626634393863386661613030656237346361306336663733
37646531623432336262653030613461653262313831653365323536663034623439363562326365
30356662396231353737346565666230313934343034316333323533313066333130393064323162
31653434383939386164303838623633396665323530633738376262633232346337303661353261
31623463376665383637663466613137313539333366343231303431313434346564366665363062
3034303034653130666531343434346430653030393231373635

# 平文で編集可能
ansible-vault edit group_vars/db.yml --vault-password-file ~/.vault_password

# export ANSIBLE_VAULT_PASSWORD_FILE=~/.vault_pass した場合
ansible-vault edit group_vars/db.yml

请参照以下内容。

    • https://docs.ansible.com/ansible/latest/user_guide/playbooks_vault.html#single-encrypted-variable

 

    • https://qiita.com/yunano/items/86d3f9beb678adbff50d

 

    https://qiita.com/takuya599/items/2420fb286318c4279a02
广告
将在 10 秒后关闭
bannerAds