我有一组剧本和角色,它们构建了一个相当复杂的应用程序平台:几个剧本、几个角色和多个清单文件定义了平台的特定变体。在构建期间,我需要输入用户名/密码:数据库帐户,访问 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}} "
恕我直言,当您希望开发始终依赖于手动用户输入的解决方案时,您并没有正确地使事情自动化。这样做也会使自动运行 playbook 变得很困难(如果不是不可能的话)(来自 Ansible Tower / AWX)
Ansible vault 是为您的剧本安全提供秘密的事实上的标准,但是当您使用 Ansible-Tower 时,您还有其他选择,也可以从外部系统中提取秘密:请参阅文档
我只是将您的剧本将使用的凭据/秘密存储在变量文件中。
当您发现 Ansible Vault 太麻烦而无法在其中使用时,请将这些变量文件以明文形式(使用默认值)进行开发。
在生产中使用不同的变量文件,或者使用保险库对这些文件进行整体加密,或者使用保险库选项仅加密特定变量的值,从而将机密安全地存储在仍然可读的文件中,如下所示:
请参阅https://docs.ansible.com/ansible/2.4/playbooks_vault.html#single-encrypted-variable