10个ansible vault示例,用于解密/加密字符串和文件
Ansible版本2.3支持使用 !vault
标签来单个加密变量加密单个变量。在本文中,我们将看到一些ansible vault示例,说明如何在我们的剧本中使用它。
Ansible Vault是一个命令行实用程序,默认情况下与Ansible一起安装。它允许我们加密密钥、凭证、密码等秘密,以包含在我们的剧本中。
通过这样做,我们还可以使用这些加密文件与其他人共享,因为它们包含访问加密数据的密码保护。我们可以使用这个特性来加密我们的变量、模板和剧本中的文件。
Ansible vault加密文件
使用"ansible vault",我们可以加密ansible使用的任何结构化数据文件。所以ansible vault encrypt file可以加密ansible使用的文件或者剧本。我们可以查看ansible vault的手册页以获取支持的参数列表
另请阅读:
我们还可以创建自己的手册页,其中包含已创建的脚本或者自定义工具的说明列表。
在实时生产环境中,总是建议为我们开发的每个脚本或者工具创建和发布一个手册页。
只要任何给定的运行只需要一个密码,就可以使用"-ask vault pass"和"-vault password file"选项。我们将在接下来的章节中使用它。或者,也可以使用"-vault id"选项提供密码,并指示该密码用于哪个vault标签。此处,ansible vault加密文件使用"default"vault id标签执行:
[ansible@controller base]$ ansible-vault create --vault-id @prompt secret.yml New vault password (default): Confirm new vault password (default):
输入密码短语后,ansible vault encrypt文件将使用默认编辑器打开,我们可以将内容放入文件中,如下所示:
-- - name: This is a secret file hosts: server2.example.com tasks: - name: Execute command 'date' command: date
现在,我们保存剧本文件。Post-ansible-vault-encrypt文件如果我们尝试读取内容,我们将看到它们实际上是加密的,带有一个小的头提示供ansible稍后使用
[ansible@controller base]$ cat secret.yml $ANSIBLE_VAULT;1.1;AES256 61383366323932306663616165376432323838373662636464313136373833313533393961623139 3433326563386161393130626539643763643439656236320a646365363666396562626563333032 34623939363131366337643131653564646437353130666636393033393866346361646666326361 3239633533386466360a653436666665333365346462373935383030326563313263663962663866 66336532633662633930363864343537353265323565333535363634303038653133383465333237 34316431666139633530323566303436353437343362303961613563316261353532356663623064 35313735626234363131626662326463656163393630386232646561653233336536656431613832 39353837313531623934366663333662663966396237386337373235666237303766316431616363 65663635316631383539393935336636393838363033323831386163373265663935623734353563 6566306531623365623830623437363939376366386465383566
从标题中可以看出,"AES256"目前用于Vault加密,这意味着只要在创建Vault时使用良好的密码,数据就非常安全。
Ansible vault查看加密文件
正如我们现在看到的,我们无法看到加密文件的内容。因此,要使用ansible vault查看加密的文件内容,请将"ansible vault view"命令与playbook文件一起使用,如下面的ansible vault示例所示:
[ansible@controller base]$ ansible-vault view --vault-id @prompt secret.yml Vault password (default): -- - name: This is a secret file hosts: server2.example.com tasks: - name: Execute command 'date' command: date
Ansible vault编辑加密文件
一旦文件用"ansible vault"加密,就不能直接编辑。在编辑器中打开文件将显示加密的数据。对文件进行任何更改都会损坏文件,Ansible将无法正确读取内容。我们必须使用ansible vault edit首先解密文件的内容,允许我们编辑这些内容,然后在将新内容保存回文件之前对其进行加密。
编辑ansible vault加密文件secret.yml
,将"ansible vault edit"与playbook文件一起使用,在解密和打开编辑器之前,playbook文件将提示输入密码
[ansible@controller base]$ ansible-vault edit secret.yml Vault password:
ansible vault
打开时使用默认编辑器,并将临时文件作为文件路径。编辑器将保存此文件,然后"ansible vault"将对其进行加密并将其移动以替换原始文件
使用ansible vault密码文件
在前面的ansible vault示例中,我们使用"vault id"对剧本进行加密,现在我们将使用ansible vault密码文件方法进行加密。我们可以创建一个纯文本文件,并在该文件中提供密码,我们将进一步使用该文件对ansible vault文件进行加密。
提示:
使用ansible vault密码文件同样不安全,因为我们将创建一个纯文本密码文件,除非我们限制权限,否则其他人可以读取该文件。
为了克服这个问题,我们还可以在隐藏目录下创建隐藏文件,以防止未知用户使用它。
在这个ansible vault示例中,我将我的密码(mypassword
)存储在一个临时的password_file中
[ansible@controller base]$ echo "mypassword" > password_file
现在可以使用此密码文件创建或者编辑ansible vault加密文件。
[ansible@controller base]$ ansible-vault edit --vault-id password_file secret.yml
或者
[ansible@controller base]$ ansible-vault edit --vault-password-file password_file secret.yml
我们可以将任一指令与ansible vault密码文件一起使用来创建/编辑/查看剧本文件。
加密现有文件的Ansible vault示例
前面的ansible vault示例都涉及使用"create"子命令创建新的加密文件。但是如果我们想加密一个现有的剧本文件呢?在这种情况下,可以使用"ansible vault encrypt":
我有一个未加密的剧本文件_条件.yml
我希望通过提示输入新密码来加密文件。这里我不使用任何ansible vault密码文件,而是使用带有默认标签的"ansible vault":
[ansible@controller base]$ ansible-vault encrypt --vault-id @prompt secret_conditonal.yml New vault password (default): Confirm new vault password (default): Encryption successful
所以我们的ansible保险库加密文件成功了。接下来我们可以尝试检查文件的内容,它应该加密:
[ansible@controller base]$ cat secret_conditonal.yml $ANSIBLE_VAULT;1.1;AES256 33303661356362363565383834623763353431346135393634366164613733633639393338313333 3865353734336139653266386431356537663033363565620a643763366666323462353365653634 34323338363534663063336633626433653266376633623039353261303261616137343266336133 6430646335633065360a393637663738363739346365323932623332653631356261643865376432 61663836373262373631633733363831393937363461373938326533366231663734653139336436 33326564666437363462636163313466363733396636666361393464636363353739363331653936 63386638623261343662633764333931643431303439306531313437333066303936623466316433 3939643536366463343362383937656330313832333064653934
Ansible vault更改加密文件的密码
随着时间的推移,随着贡献者的来来去去去,轮换用来加密你的秘密的密码是个好主意。加密和保护密码一样好。ansible vault
提供了一个子命令,允许我们更改名为rekey的密码
我们可以使用下面的命令获取可用的受支持参数列表,并使用rekey
[ansible@controller base]$ ansible-vault rekey --help
我们使用"-ask vault pass"提示"ansible vault"更改密码。
[ansible@controller base]$ ansible-vault rekey --ask-vault-pass secret.yml Vault password: New Vault password: Confirm New Vault password: Rekey successful
所以我们成功地更改了secret.yml
剧本文件
Ansible vault解密文件
也可以使用ansible vault decrypt file对ansible中的剧本文件进行解密。如果在某个时候不再需要加密数据文件,可以使用"ansible vault decrypt"子命令删除对一个或者多个加密文件的加密。我将使用"--ask vault pass",而不是使用ansible vault密码文件。检查以下ansible vault示例:
[ansible@controller base]$ ansible-vault decrypt --ask-vault-pass secret.yml Vault password: Decryption successful
所以我们可以其中解密文件。现在我们可以使用任何编辑器来查看playbook文件的内容。
在剧本中使用ansible vault
对于在playbook中使用ansible vault,我们需要能够通知"ansible playbook"如何访问它可能遇到的任何加密数据。
与"ansible vault"不同的是,ansible playbook只用于处理文件加密或者解密,它更通用,并且默认情况下不会假设它处理的是加密数据。
幸运的是,前面示例中所有熟悉的--vault id参数在ansible playbook中的工作方式与在"ansible vault"中的相同,并且不需要在playbook中使用ansible vault进行特殊处理
Ansible将在playbook执行期间将提供的密码和ID保存在内存中。
我有一个秘密.yml
包含以下内容的剧本文件
-- - name: This is a secret file hosts: server2.example.com tasks: - name: Execute command 'date' command: date
在下面的ansible vault示例中,我们将使用"-vault id@prompt"执行这个剧本,它将在处理剧本之前提示我们yml文件的密码。
[ansible@controller base]$ ansible-playbook --vault-id @prompt secret.yml Vault password (default): PLAY [This is a secret file] ** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ** TASK [Gathering Facts] ** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ok: [server2.example.com] TASK [Execute command 'date'] ** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ***** changed: [server2.example.com] PLAY RECAP ** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** server2.example.com : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
所以这里我们在playbook中使用ansible保险库,在我们提供密码之后,ansible playbook将处理yml文件任务。
将Ansible playbook与vault密码文件一起使用
我们知道Ansible是关于自动化的,但是在上面的例子中,Ansible playbook会提示用户输入密码,所以这可能是一些组织的问题。为了克服这个问题,你可以创建一个包含剧本密码的计划文本隐藏文件。
例如,我创建了一个文本文件password_file,其中包含我的密码
[ansible@controller base]$ echo "password" > password_file
现在我可以使用下面的语法用这个vault密码文件重新生成我的ansible playbook
[ansible@controller base]$ ansible-playbook secret.yml --vault-password-file=password_file
Ansible vault加密字符串
在Ansible 2.3发布之前,安全数据必须在单独的文件中加密。现在我们不需要加密整个文件,相反,我们只能加密字符串,例如来自playbook文件的密码。我们可以使用ansible vault的"encrypt_string"子命令,该子命令生成可放入ansible YAML文件的加密字符串。
在下面的ansible vault示例中,我们有一个使用ansible vault加密字符串的示例剧本文件
[ansible@controller base]$ cat secret1.yml -- - name: inline secret variable demonstration hosts: server1.example.com gather_facts: false vars: my_secret: secure_password tasks: - name: print the secure variable debug: var: my_secret
现在在YML文件中,我们提供了纯文本格式的"secure_password"密码。任何人都可以打开这个yml文件并获取不安全的密码信息。因此,我们既可以加密整个yml文件,也可以选择使用ansible vault encrypt string只加密"secure_password"字符串。
要加密"secure_password"字符串,请使用以下命令,这里我们再次使用默认的vault id标签:
[ansible@controller base]$ ansible-vault encrypt_string --vault-id @prompt secure_password New vault password (default): Confirm new vault password (default): !vault | $ANSIBLE_VAULT;1.1;AES256 32373210386330644061613237393466393363333031303965383063316338393261616134353233 6364623038303966323834396636646463613837373461380a303662373161393466326139383565 64396538393562343464666337633337353130306365666637373266393965633766366436623836 3430396234626533340a613637393563333131626665626535393462653139346563383062343535 6335 Encryption successful
ansible vault加密字符串成功。这为我们提供了"secure_password"字符串的加密密钥,我们将在ansible vault示例剧本文件中使用该字符串,格式如下
[ansible@controller base]$ cat secret1.yml -- - name: inline secret variable demonstration hosts: server1.example.com gather_facts: false vars: my_secret: !vault | $ANSIBLE_VAULT;1.1;AES256 32373330386330643061613237393466393363333031303965383063316338393261616134353233 6364623038303966323834396636646463613837373461380a303662373161393466326139383565 64396538393562343464666337633337353130306365666637373266393965633766366436623836 3430396234626533340a613637393563333131626665626535393462653139346563383062343535 6335 tasks: - name: print the secure variable debug: var: my_secret
如我们所见,我已将"secure_password"字符串替换为从上面的ansible vault encrypt string命令获得的加密密钥:
现在我们可以使用playbook中的ansible vault重新连接此ansible:
[ansible@controller base]$ ansible-playbook --vault-id @prompt secret1.yml Vault password (default): PLAY [inline secret variable demonstration] ** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** *** TASK [print the secure variable] ** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ** ok: [server1.example.com] => { "my_secret": "secure_password" } PLAY RECAP ** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** server1.example.com : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
请注意,playbook的运行方式与我们第一次测试它时完全相同,当时所有的数据都是开放给全世界看的。不过,现在我们已经成功地将ansible vault加密字符串放在一个未加密的YAML剧本中。