使用Ansible将多个用户添加到linux系统

使用Ansible将多个用户添加到linux系统,ansible,Ansible,我已经构建了一套可爱的Ansible剧本,packer使用它们为AWS中的软件构建构建Linux映像。他们很好,现在很多其他球队也想要使用他们 当前的设置是一个调用许多角色的剧本。其中一些角色执行系统级配置,其他角色创建由var jenkins_用户定义的用户,并为其设置各种程序(conan、npm、jfrog) 由于我的角色已经设置为作用于单个变量,因此修改它们以作用于用户名数组应该不会太困难。我正在尝试确定定义多个用户的最佳方法 我需要为每个用户提供少量VAR: 用户名 密码 私钥 授权密

我已经构建了一套可爱的Ansible剧本,packer使用它们为AWS中的软件构建构建Linux映像。他们很好,现在很多其他球队也想要使用他们

当前的设置是一个调用许多角色的剧本。其中一些角色执行系统级配置,其他角色创建由var jenkins_用户定义的用户,并为其设置各种程序(conan、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:
  password: "{{vault_user2_pass}}"
  private_key_file:  "{{vault_user2_key}}"
  auth_keys_file:  "{{user2_auth_keys_file}}"
然后user2.yml包含

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}}"
但是,如果我尝试向buildusers变量添加其他文件,include_vars会覆盖它,而不是添加:

- name: load buildusers files
  include_vars:
    dir: buildusers
    name: buildusers

这将导致buildusers变量中只包含最后的文件数据。

include\u vars
将使用位于
buildusers
文件夹的所有文件中的变量值覆盖
buildusers
变量的内容

如果要将中心文件(playbook或变量文件)中定义的变量与文件夹中文件列表中定义的值合并,则必须手动组合这两个变量

- 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
建筑用户
├── user1.yml
└── user2.yml
希望能有帮助

笔记 您还可以通过在加载过程中注册变量并通过变量
ansible\u included\u var\u 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

您能否确认“如果我尝试向buildusers变量添加其他文件”的意思?您在这里得到的应该是将这两个文件的内容加载到
buildusers
中,从而产生
user1
users2
buildusers
散列成员,以及类似地包含的任何其他用户。但是,如果在每个文件的顶层没有唯一的值,它们将发生冲突。当include_vars运行时,它读取第一个文件,创建一个哈希buildusers,其中user1是唯一的元素,然后读取第二个文件,该文件重新创建哈希buildusers,其中user2是唯一的元素,依此类推。最终的结果是,如果我有多个文件,那么数组中只有最后一个文件。