using csvfile lookups inside a module

Hi,

I’m trying to use csvfile lookups to populate values in the groups module, but not having much luck. My csvfile:

`

groups.csv

name, gid [optional - leave blank], state [present|absent], system [yes|no]

accounts,502,present,no
engineering,504,present,no

`

The playbook:

`

Presumably you’ve got csv files coming from somewhere else that you want to use to drive things?

If not, I’d suggest to you see if you can use group_vars http://docs.ansible.com/ansible/intro_inventory.html#group-variables to set variables for specific groups. Bear in mind you can have multiple groups and you can have groups which are specific to just one inventory file or are shared, so they can be pretty flexible.

I think using group_vars would ‘go with the grain’ better than using the lookups, and give you more readable playbooks.

Probably not what you wanted to hear, but hope it helps,

Jon

Thanks for replying.

At the moment no, there aren’t any csv files anywhere. Just trying out different approaches to config management using ansible. I’m comfortable with group_vars, it’s the repetition in defining them that grates.

If you have a spare few minutes, take a look at Neil Watson’s blog, specifically this post explaining the evolution of his Cfengine policies. I’ve used this approach at a previous shop that had CFengine deployed and it worked well.
It makes viewing and managing configuration much easier, the idea of data-driven policies appeals.It also simplifies operations view of managing the infrastructure, one line specifies multiple configuration parameters for an object.

So…not what I wanted to hear but, not the end of the world either.

Just noticed I hadn’t set the delimiter parameter, however still get the “…unable to convert to bool” message.

Asil

Not read this yet but you can define cross group_vars that are common across inventory as well as specific to inventory - it’s a trick I use to save having to copy and paste stuff which is shared across most, but not all inventory.

Thanks for the link though.

Hi,

I'm trying to use csvfile lookups to populate values in the groups module,
but not having much luck. My csvfile:

# groups.csv
# name, gid [optional - leave blank], state [present|absent], system
[yes|no]
accounts,502,present,no
engineering,504,present,no

The playbook:

---

- hosts: localhost
  become: True
  become_user: root

  tasks:

  - name: get groups
    command: /usr/bin/awk -F',' '!/^#/ && !/^$/ { print $1 }' groups.csv
    register: groups_out

  - name: Process groups
    group: >
      name="{{ lookup('csvfile', 'item file=groups.csv col=0') }}"
      gid="{{ lookup('csvfile', 'item file=groups.csv col=1') }}"
      state="{{ lookup('csvfile', 'item file=groups.csv col=2') }}"
      system="{{ lookup('csvfile', 'item file=groups.csv col=3') }}"

As you mention in a later post you are missing the delimiter, TAB is the default.

And you key is literally "item" on all you lookup. To use the variable item you'll have to concatenate like this.

   lookup('csvfile', item + ' file=groups.csv delimiter=, col=n')

    # with_lines: "/usr/bin/awk -F',' '!/^#/ && !/^$/ { print $1 }'
groups.csv"
    # with_items: "{{ groups_out.stdout_lines }}"
    with_lines: "{{ groups_out.stdout_lines }}"

You can't only have a variable in with_items, it must be a command
https://docs.ansible.com/ansible/playbooks_loops.html#iterating-over-the-results-of-a-program-execution

Using with_lines and groups_out.stdout_lines gives me:

TASK [Process groups]
**********************************************************
/bin/sh: accounts: command not found

You don't have /bin/sh, that can be a problem, since default, Ansible is depending on it.

Hi Kai,

Thanks for taking the time to reply. I did first try using with_lines and the awk command and using “item +”, that throws up another error: This code

`

I wonder if you might be better off using include_vars to load all of your groups details in one pass, without multiple lookup calls.

http://docs.ansible.com/ansible/include_vars_module.html

There’s a little bit more syntax to make your csv into yaml. Instead of…
accounts,502,present,no
engineering,504,present,no

You’d write:

groups:

  • {name: accounts, gid: 502, state: present, system: no}
  • {name: engineering, gid: 504, state: present, system: no}

or

If you look carefully at my example I have a space in front of file.
Without it your name would be like this on first iteration

   lookup('csvfile', 'accountfile=groups.csv col=0 delimiter=,')

And this is not a valid lookup.

Kai - Thank you, I missed the space! This now works as I would have hoped.

Jon - Thank you too! Using a include_vars rather than a lookup achieves the same goal, the single-line format of each item was something I completely forgot you could do, for some reason I’ve adopted the multi-line format and never let go.

Kind regards,

Asil