Ansible - 使用 {{ item }} 和 csvfile 查找

Ansible - using {{ item }} with csvfile lookups

我正在尝试找出一种方法来减少各种模块的代码行数,重复节似乎毫无意义。我想使用 csvfile 查找来帮助填补空白。以以下 CSV 为例:

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

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

所以,我的所有组定义都是 csv 格式的。问题是,处理它时,无论我尝试什么,我都无法在组模块中进行查找。 所以最初,我想这样做:

---

- hosts: localhost

  become: True
  become_user: root

  tasks:

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

  - debug: var=groups_out.stdout_lines


  - 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') }}"
    # with_lines: "/usr/bin/awk -F',' '!/^#/ && !/^$/ { print  }' groups.csv"
    # with_items: "{{ groups_out.stdout_lines }}"
    with_lines: "{{ groups_out.stdout_lines }}"

结果是这样的:

    TASK [Process groups] **********************************************************
/bin/sh: accounts: command not found
fatal: [localhost]: FAILED! => {"failed": true, "msg": "lookup_plugin.lines(accounts) returned 127"}

正如您从代码中看到的那样,我也尝试过使用 with_items 和 with_lines 直接使用 awk 命令,但是组模块似乎不喜欢我这样做。

Centos 7 上的 Ansible 2.1.1.0。 Python 2.7.5 神社 2.8

有什么想法可以实现吗?

提前致谢,

R

在下面回答。感谢 ansible-project googlegroup 上的 Jon 和 Kai 提供的帮助。

---

- hosts: localhost

  become: True
  become_user: root

  tasks:

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

  - name: Process groups one
    group: >
      name={{ lookup('csvfile', item + ' file=groups.csv col=0 delimiter=,') }}
      gid={{ lookup('csvfile', item + ' file=groups.csv col=1 delimiter=,') }}
      state={{ lookup('csvfile', item + ' file=groups.csv col=2 delimiter=,') }}
      system={{ lookup('csvfile', item + ' file=groups.csv col=3 delimiter=,') }}
    with_items: "{{ groups_out.stdout_lines }}"
    ignore_errors: True

  - name: Process groups two
    group: >
      name={{ lookup('csvfile', item + ' file=groups.csv col=0 delimiter=,') }}
      gid={{ lookup('csvfile', item + ' file=groups.csv col=1 delimiter=,') }}
      state={{ lookup('csvfile', item + ' file=groups.csv col=2 delimiter=,') }}
      system={{ lookup('csvfile', item + ' file=groups.csv col=3 delimiter=,') }}
    with_lines: /usr/bin/awk -F',' '!/^#/ && !/^$/ { print  }' /var/tmp/groups.csv