我已经构建了一套可爱的Ansible剧本,供打包程序用来为AWS中的软件构建构建我们的Linux映像。他们是如此的棒,以至于现在其他许多团队也希望使用它们。
当前设置是一本剧本,需要扮演许多角色。其中一些角色进行系统级配置,另一些角色创建由var jenkins_user定义的用户并为其设置各种程序(柯南,npm,jfrog)
由于我的角色已经设置为可以作用于单个变量,因此修改角色以作用于用户名数组并不难。我正在尝试确定定义多个用户的最佳方法。
对于每个用户,我需要少量的var:
我正在尝试确定存储所有这些内容的最佳方法。我首先想到的是用户和数据的哈希值:
build_users:
user1:
password: "{{vault_user1_pass}}"
private_key_file: "{{vault_user1_key}}"
auth_keys_file: "{{auth_keys_file}}"
user2:
password: "{{vault_user2_pass}}"
private_key_file: "{{vault_user2_key}}"
auth_keys_file: "{{user2_auth_keys_file}}"
这会让我保护用户数据,这不一定是一件坏事。
我想到的第二件事就是在每个用户各自的文件中都有一个目录: user1.yml包含
user1:
password: "{{vault_user1_pass}}"
private_key_file: "{{vault_user1_key}}"
auth_keys_file: "{{auth_keys_file}}"
然后user2.yml包含
user2:
password: "{{vault_user2_pass}}"
private_key_file: "{{vault_user2_key}}"
auth_keys_file: "{{user2_auth_keys_file}}"
但是,如果我尝试将其他文件添加到buildusers变量中,则include_vars会覆盖它,而不是添加:
- name: load buildusers files
include_vars:
dir: buildusers
name: buildusers
这将导致buildusers变量中仅包含最后一个文件数据。
答案 0 :(得分:1)
include_vars
将用位于buildusers
文件夹的所有文件中的变量的值覆盖buildusers
变量的内容。
如果要合并在中央文件(剧本或变量文件)中定义的变量与在文件夹中文件列表中定义的值,则必须手动combine
这两个变量。
- name: Combine variables
hosts: localhost
connection: local
gather_facts: no
vars:
buildusers_default:
user3:
password: "pass"
private_key_file: "priv"
auth_keys_file: "auth"
tasks:
- name: load buildusers files
include_vars:
dir: buildusers
name: buildusers_files
- name: combine variables
set_fact:
buildusers: "{{ buildusers_default | combine(buildusers_files) }}"
- name: debug
debug:
var: buildusers
# ok: [127.0.0.1] =>
# buildusers:
# user1:
# auth_keys_file: auth
# password: pass
# private_key_file: priv
# user2:
# auth_keys_file: auth
# password: pass
# private_key_file: priv
# user3:
# auth_keys_file: auth
# password: pass
# private_key_file: priv
文件夹buildusers
的存在。
$ tree buildusers
buildusers
├── user1.yml
└── user2.yml
希望有帮助。
您还可以通过在加载过程中注册一个变量并通过变量ansible_included_var_files
检查其值来检查文件中变量的加载情况。
tasks:
- name: load buildusers files
include_vars:
dir: buildusers
name: buildusers_files
register: check_load
- name: debug
debug:
var: check_load.ansible_included_var_files
# check_load.ansible_included_var_files:
# - /home/romain/ansible/user1.yml
# - /home/romain/ansible/user2.yml