简体   繁体   中英

How to pass data from text file to ansible playbook?

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM