我需要向多个Ubuntu服务器添加新用户。不幸的是,密码和用户名不一致。每台机器都有自己的用户名,密码不能相同。例如,主机-1将有一个用户帐户主机-1_用户名与密码主机-1_密码和主机-2将有一个用户帐户主机-2_用户名与密码主机-2_密码,等等。
我想用Ansible做这件事。我有一个list.yaml文件:
---
list:
- hostname: host-1
username: host-1_username
password: host-1_password
- hostname: host-2
username: host-2_username
password: host-2_password
- hostname: host-3
username: host-3_username
password: host-3_password这是我的游戏指南:
- name: Crate new user
vars_files:
- list.yml
hosts: "{{ item.hostname }}"
remote_user: root
become: true
tasks:
- name: Create new user
ansible.builtin.user:
name: "{{ item.username }}"
groups: sudo
password: "{{ item.password | password_hash('sha512') }}"
shell: /bin/bash
- name: Modify sshd_config
ansible.builtin.lineinfile:
dest: /etc/ssh/sshd_config
line: 'AllowUsers {{ item.username }}'
loop: "{{ list }}"但是看起来Ansible不能调用变量来添加到主机列中:
ERROR! couldn't resolve module/action 'hosts'. This often indicates a misspelling, missing collection, or incorrect module path.我对Ansible非常陌生,任何帮助都是非常感谢的!
发布于 2021-12-23 22:02:06
给出数据
shell> cat list.yml
users_list:
- hostname: host-1
username: host-1_username
password: host-1_password
- hostname: host-2
username: host-2_username
password: host-2_password
- hostname: host-3
username: host-3_username
password: host-3_password创建一个库存文件,例如:
shell> cat hosts
host-1
host-2
host-3将数据转换为字典。
- hosts: all
gather_facts: false
vars_files:
- list.yml
tasks:
- set_fact:
users_dict: "{{ users_list|items2dict(key_name='hostname', value_name='username') }}"
psswd_dict: "{{ users_list|items2dict(key_name='hostname', value_name='password') }}"
run_once: true给出
users_dict:
host-1: host-1_username
host-2: host-2_username
host-3: host-3_username和
psswd_dict:
host-1: host-1_password
host-2: host-2_password
host-3: host-3_password使用字典选择主机的特定用户和密码。
- debug:
msg: "Create user: {{ users_dict[inventory_hostname] }}
password: {{ psswd_dict[inventory_hostname] }}"给出
TASK [debug] ***************************************************************
ok: [host-1] =>
msg: 'Create user: host-1_username password: host-1_password'
ok: [host-2] =>
msg: 'Create user: host-2_username password: host-2_password'
ok: [host-3] =>
msg: 'Create user: host-3_username password: host-3_password'您可以省略库存文件,并创建一个完全由数据驱动的剧本。在第一次播放中创建动态组my_group,在第二次播放中使用它。下面的剧本给出了同样的结果。
- name: Create dynamic group of the hosts from users_list
hosts: localhost
gather_facts: false
vars_files:
- list.yml
tasks:
- add_host:
name: "{{ item.hostname }}"
groups: my_group
loop: "{{ users_list }}"
- name: Create users
hosts: my_group
gather_facts: false
vars_files:
- list.yml
tasks:
- set_fact:
users_dict: "{{ users_list|items2dict(key_name='hostname', value_name='username') }}"
psswd_dict: "{{ users_list|items2dict(key_name='hostname', value_name='password') }}"
run_once: true
- debug:
var: users_dict
run_once: true
- debug:
var: psswd_dict
run_once: true
- debug:
msg: "Create user: {{ users_dict[inventory_hostname] }}
password: {{ psswd_dict[inventory_hostname] }}"https://stackoverflow.com/questions/70467487
复制相似问题