I want to have text file which contains name and password
name: "Peter", "Joe", "Mark"
password: "smith", "biden", "garyy"
And I have playbook like this
---
- hosts: myhosts
become: yes
remote_user: root1
become_user: root
vars_files:
- vars.yml
vars:
ansible_ssh_private_key_file: "{{key}}"
tasks:
- name: Create users
user: name="{{item.name}}" shell=/bin/bash home="/srv/{{item.name}}" groups=root generate_ssh_key=yes ssh_key_bits=2048
loop: "{{ lookup('file', 'userspasswd.txt', wantList=True)| list }}"
- name: Set password to users
shell: echo "{{item.name}}:{{item.password}}" | sudo chpasswd
no_log: True
loop: "{{ lookup('file', 'userspasswd.txt', wantList=True)| list }}"
I am getting error like this
fatal: [xxx.xxx.xxx.xxx]: FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: 'ansible.utils.unsafe_proxy.AnsibleUnsafeText object' has no attribute 'name'\n\nThe error appears to be in '/home/root1/Documents/ansiblekernel/main.yml': line 12, column 5, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n - name: Create users\n ^ here\n"}
Is there any correct way of doing this? Cause I am new to this?
Given the file
shell> cat userspasswd.txt name: "Peter", "Joe", "Mark" password: "smith", "biden", "garyy"
Neither wantList=True
nor the filter list
will help you to parse the file because it's not a valid YAML . If you can't change the structure of the file you'll have to parse it on your own.
Declare the variables
userspasswd_lines: "{{ lookup('file', 'userspasswd.txt').splitlines() }}" userspasswd_values: "{{ userspasswd_lines| map('split', ':')| map('last')| map('regex_replace', '\"', '')| map('split', ',')| map('map', 'trim')| list }}" userspasswd_dict: "{{ dict(userspasswd_values.0| zip(userspasswd_values.1)) }}"
give
userspasswd_lines: - 'name: "Peter", "Joe", "Mark"' - 'password: "smith", "biden", "garyy"' userspasswd_values: - - Peter - Joe - Mark - - smith - biden - garyy userspasswd_dict: Joe: biden Mark: garyy Peter: smith
Iterate the dictionary. Test it
- name: Create users debug: msg: | name: {{ item }} shell: /bin/bash home: /srv/{{ item }} groups: root generate_ssh_key: yes ssh_key_bits: 2048 loop: "{{ userspasswd_dict.keys()|list }}" - name: Set password to users debug: msg: 'echo "{{ item.key }}:{{ item.value}}" | sudo chpasswd' loop: "{{ userspasswd_dict|dict2items }}"
gives
TASK [Create users] ************************************************************************** ok: [test_11] => (item=Peter) => msg: |- name: Peter shell: /bin/bash home: /srv/Peter groups: root generate_ssh_key: yes ssh_key_bits: 2048 ok: [test_11] => (item=Joe) => msg: |- name: Joe shell: /bin/bash home: /srv/Joe groups: root generate_ssh_key: yes ssh_key_bits: 2048 ok: [test_11] => (item=Mark) => msg: |- name: Mark shell: /bin/bash home: /srv/Mark groups: root generate_ssh_key: yes ssh_key_bits: 2048 TASK [Set password to users] ***************************************************************** ok: [test_11] => (item={'key': 'Peter', 'value': 'smith'}) => msg: echo "Peter:smith" | sudo chpasswd ok: [test_11] => (item={'key': 'Joe', 'value': 'biden'}) => msg: echo "Joe:biden" | sudo chpasswd ok: [test_11] => (item={'key': 'Mark', 'value': 'garyy'}) => msg: echo "Mark:garyy" | sudo chpasswd
Example of a complete playbook for testing
- hosts: myhosts vars: userspasswd_lines: "{{ lookup('file', 'userspasswd.txt').splitlines() }}" userspasswd_values: "{{ userspasswd_lines| map('split', ':')| map('last')| map('regex_replace', '\"', '')| map('split', ',')| map('map', 'trim')| list }}" userspasswd_dict: "{{ dict(userspasswd_values.0| zip(userspasswd_values.1)) }}" tasks: - block: - debug: var: userspasswd_lines - debug: var: userspasswd_values - debug: var: userspasswd_dict run_once: true - name: Create users debug: msg: | name: {{ item }} shell: /bin/bash home: /srv/{{ item }} groups: root generate_ssh_key: yes ssh_key_bits: 2048 loop: "{{ userspasswd_dict.keys()|list }}" - name: Set password to users debug: msg: 'echo "{{ item.key }}:{{ item.value}}" | sudo chpasswd' loop: "{{ userspasswd_dict|dict2items }}"- hosts: myhosts vars: userspasswd_lines: "{{ lookup('file', 'userspasswd.txt').splitlines() }}" userspasswd_values: "{{ userspasswd_lines| map('split', ':')| map('last')| map('regex_replace', '\"', '')| map('split', ',')| map('map', 'trim')| list }}" userspasswd_dict: "{{ dict(userspasswd_values.0| zip(userspasswd_values.1)) }}" tasks: - block: - debug: var: userspasswd_lines - debug: var: userspasswd_values - debug: var: userspasswd_dict run_once: true - name: Create users debug: msg: | name: {{ item }} shell: /bin/bash home: /srv/{{ item }} groups: root generate_ssh_key: yes ssh_key_bits: 2048 loop: "{{ userspasswd_dict.keys()|list }}" - name: Set password to users debug: msg: 'echo "{{ item.key }}:{{ item.value}}" | sudo chpasswd' loop: "{{ userspasswd_dict|dict2items }}"
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.