我有一组剧本和角色,它们可以构建一个相当复杂的应用平台:多个剧本、多个角色和多个清单文件定义了平台的特定变体。在构建过程中,我需要输入用户名/密码:数据库帐户、访问 git 以提取代码等。
我想在发出 ansible-playbook 命令后立即提示输入所有剧本的所有凭证(例如在第一个剧本中)。在需要时将它们收集到多个剧本中意味着在几分钟内暂停构建,所以我宁愿在开始时一次性获取所有凭证。
我还希望能够在开发 Ansible 剧本或构建简单测试环境时为凭证设置默认值,而无需从密码管理器中剪切粘贴真实凭证。默认值意味着我可以多次按回车键来接受预定义的默认值,并快速进入实际构建某些内容的剧本和角色。
Ansible Vault 是一个选项,但对于我的简单要求来说似乎有点过多,而且在这种情况下密码管理器是我所在组织的正常解决方案,所以如果我引入 Vault,我就会重复凭据。
我已经看过了vars_prompts
,但它并不合适,原因有几个,包括:变量的范围只是当前的剧本,所以我以后不能使用它们;并且group_vars
该部分不可用,vars_prompt
所以我无法控制根据库存文件中定义的变量来请求哪些变量。
我查看了pause
模块,它可以访问 group_vars 以及when
子句,并set_facts
在以后使 vars 可用。下面是一些示例、工作代码,但它相当冗长,需要一项pause
任务和两项任务set_facts
来收集每条数据。
但第一个问题实际上是,Ansible 中是否有更好的标准解决方案来解决这个问题?在剧本执行开始时收集所有凭证似乎是一个显而易见的要求,但我似乎无法在任何地方找到这个问题的标准解决方案。
工作示例,但是有没有更好的方法来做到这一点?
pre_tasks:
- name: "get username"
pause:
prompt: "Enter username [defaultusername]"
register: username
run_once: yes
- name: username after pause command is
debug:
msg: "{{username}}"
- name: set_fact for default username
set_fact:
username_fact: "defaultusername"
when: username.user_input == ""
- name: set_fact for non-default username
set_fact:
username_fact: "{{username.user_input}}"
when: username.user_input != ""
- name: username_fact
debug:
msg: "username_fact is {{username_fact}} "
答案1
我认为,当您想要开发始终依赖于手动用户输入的解决方案时,您没有正确地实现自动化。这样做还会使自动运行剧本变得困难甚至不可能(来自 Ansible Tower/AWX)
Ansible vault 是安全地为您的剧本提供机密的事实标准,但是当您使用 Ansible-Tower 时,您还有其他选择,也可以从外部系统中提取机密:Seee文档
我只会将您的剧本将使用的凭据/秘密存储在一个变量文件中。
当您发现 Ansible vault 过于麻烦而无法使用时,请将这些变量文件以明文形式(带有默认值)保存以供开发使用。
在生产中使用不同的变量文件,或者使用保险库来加密整个文件,或者使用保险库选项仅加密特定变量的值,从而将秘密安全地存储在仍然可读的文件中,如下所示:
notsecret: myvalue
mysecret: !vault |
$ANSIBLE_VAULT;1.1;AES256
66386439653236336462626566653063336164663966303231363934653561363964363833313662
6431626536303530376336343832656537303632313433360a626438346336353331386135323734
62656361653630373231613662633962316233633936396165386439616533353965373339616234
3430613539666330390a313736323265656432366236633330313963326365653937323833366536
34623731376664623134383463316265643436343438623266623965636363326136
other_plain_text: othervalue
看https://docs.ansible.com/ansible/2.4/playbooks_vault.html#single-encrypted-variable