TKAN
TKAN

Reputation: 38

Ansible script is executing but loop is failing

I am trying to write a script (adduser.yml) to create users in a linux machine which imports users list from userlist.csv file. When I executed adduser.yml, the loop failed creating only 1st user. Can someone help me understand what mistake I am doing and how to correct it?

userlist.csv:

id,username,password,sudo
1,ansible1,ansible@123,yes
2,ansible2,ansible@123,no
3,ansible3,ansible@123,yes
4,ansible4,ansible@123,yes

adduser.yml:

---
## executed but until loop failed; check 
- hosts: 192.168.0.3
  vars:
    count: "{{COUNT}}"
    x: "1"
    uname: "{{ lookup('csvfile', '{{x}} file=userlist.csv delimiter=, col=1') }}"
    password: "{{ lookup('csvfile', '{{x}} file=userlist.csv delimiter=, col=2') }}"
    sudo: "{{ lookup('csvfile', '{{x}} file=userlist.csv delimiter=, col=3') }}"

  tasks:
    name: "user add"
    action:
     - user:
         x: "x+=1"
         name: "{{ uname }}"
         password: "{{ password }}"
         state: present
    register: x
    until: "{{x > count}}"

    name: "add to sudoers"
    when: sudo == "yes"
    lineinfile:
      dest: /etc/sudoers

Upvotes: 0

Views: 232

Answers (1)

udondan
udondan

Reputation: 59989

There are quite some things that will not work as you expected them. First thing, your loop is defined for your first task. That means only the user task will be repeated. Neither the sudo task nor the vars definition at the top will be looped. But don't try to re-define your loop, this is not going to work with vars.

Ansible has no build-in way to read vars from a csv file other than the csv lookup which will read exactly one line. But as said, you can not combine that with a loop.

I see two options you have:

  1. Do not use csv. Ansible is mostly bound to yaml. If you'd had a yaml definition of your users, you simply could use the include_vars module to load these vars.

  2. If you are bound to csv, you could try to use this includecsv module. (I have no experience with it and can not tell if it actually works)

Now, let's assume you have loaded your users into a list either from yaml or from csv with mentioned module. Then you'd simply loop with with_items:

tasks:
  - name: "user add"
    user:
       name: "{{ item['uname'] }}"
       password: "{{ item['password'] }}"
       state: present
    with_items: users_you_loaded

  - name: "add to sudoers"
    when: "{{ item['sudo'] }} == 'yes'"
    ... 
    with_items: users_you_loaded

Upvotes: 1

Related Questions