我需要將新用戶添加到多個 Ubuntu 服務器。不幸的是,密碼和用戶名不一致。每臺機器都有自己的用戶名,密碼不能相同。例如,host-1 將擁有一個用戶帳戶 host-1_username,密碼為 host-1_password,而 host-2 將擁有一個用戶帳戶 host-2_username,密碼為 host-2_password,依此類推。
我想通過 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
這是我的 Ansible 劇本:
- 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 無法呼叫變數添加到 hosts 列中:
ERROR! couldn't resolve module/action 'hosts'. This often indicates a misspelling, missing collection, or incorrect module path.
我對 Ansible 很陌生,感謝任何幫助!
uj5u.com熱心網友回復:
鑒于資料
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://www.uj5u.com/ruanti/396022.html
上一篇:當我嘗試從ViewModel更改ModalBottomSheetState時,此CoroutineContext中沒有MonotonicFrameClock
