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

时间:2019-08-01 18:10:20

标签: ansible

我已经构建了一套可爱的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变量中仅包含最后一个文件数据。

1 个答案:

答案 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