我正在使用 Ansible 剧本来管理用户(摘自https://keksi.io/tutorials/2016/12/05/how-to-manage-remote-server-users-with-ansible/):
vars / users.yml 文件(用户,用户到组的分配,密码,SSH密钥):
print(something)
这是剧本:
log.pr
我可以在所有服务器上正确执行此剧本,并在其上创建和管理管理员和普通用户。
现在,我想添加一个新步骤。我有几台服务器,并不是每个用户都应该在每个服务器上都进行配置,并且某些用户应该仅在某些服务器上(例如,开发服务器上的开发人员)在另一个组中。
所以我希望为主机或主机组上的用户创建一些分配,例如:
---
users:
- username: user1
comment: "User 1"
group: admin
password: "sha password"
keys:
active:
- "ssh-rsa etc"
admin: yes
- username: user2
comment: "User 2"
group: users
groups: deployer
keys:
active:
- "ssh-rsa etc"
- username: user3
[...]
因此,我希望能够在所有服务器上执行剧本,以使用户根据此声明创建或更新该剧本,而不必为每个主机编写剧本的副本。
我对如何实现这一目标一无所知,您能帮我吗?
编辑:我试图通过这种方式在我的users.yml变量文件中添加一个新的“主机”键:
- hosts: all
become: true
tasks:
- include_vars: ../vars/users.yml
- name: Install sudo
apt: name=sudo state=present
- name: Add the group admin
group:
name: admin
state: present
- name: Create users
user:
name: "{{ item.username }}"
comment: "{{ item.comment | default('User {{item.username}}') }}"
password: "{{ item.password | default('!') }}"
state: "{{ item.state | default('present') }}"
shell: "{{ item.shell | default('/bin/bash') }}"
group: "{{ item.group | default('users') }}"
when: item.username is defined
with_items: '{{ users }}'
- name: Setup administrator users with complete sudo access
user: name={{ item.username }} groups=sudo append=yes
with_items: '{{ users }}'
when: item.admin is defined and item.admin == True
- name: Add SSH-keys to users
authorized_key:
user: "{{ item.0.username }}"
key: "{{ item.1 }}"
with_subelements:
- "{{ users }}"
- keys.active
- flags:
skip_missing: True
when: item.0.state is not defined or item.0.state != "absent"
- name: Remove old SSH-keys from users
authorized_key:
user: "{{ item.0.username }}"
key: "{{ item.1 }}"
state: absent
with_subelements:
- "{{ users }}"
- keys.disabled
- flags:
skip_missing: True
when: item.0.state is not defined or item.0.state != "absent"
我这样修改了任务:
- host: host1
admins:
- user1
- user2
deployers:
- user2
- user3
users:
- user4
- user5
- host: hostgroup1
admins:
- user2
users:
- user3
- user5
我的解释:我需要创建一个用户,如果它是admin(因此必须在每台主机上创建,或者如果当前主机的ventory_hostname被列在主机子项数组之一中)(第二步,我想扩展此检查同样,如果当前主机位于item.hosts子项之一中列出的主机组中。
问题在于创建user1的方式是(因为item.admin为True),而user2不是,因为其他条件始终为False。
答案 0 :(得分:0)
您可以使用host_vars或group_vars代替vars / users.yml来存储用户数据
在多台主机上运行剧本时,将从相关的group_vars或host_cars文件中读取每个主机或组成员的相应值
有关更多信息,请参见此处:https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html#splitting-out-host-and-group-specific-data