Как прочитать данные CSV-файла в ansible-playbook, используя with_lines? - PullRequest
0 голосов
/ 16 декабря 2018

У меня есть ситуация, когда в одном файле CSV у меня есть 2 столбца, как показано ниже

cat report.csv
Field1,Field2,Field3
name3,3,5
name4,5,6

Теперь я хочу использовать строки, выделенные жирным шрифтом.

Каждый столбец будет входк одной из ответных ролей.

должно идти как

   roles:
     - { role: arti_master, mod_name: "{{ item.name}}" , version: "{{ item.version}}"
  with_lines:
    - "cat report.csv|cut -d, -f2"

Ответы [ 3 ]

0 голосов
/ 05 мая 2019
Модуль

read_csv был недавно добавлен в ansible, и теперь доступен из ansible 2.8.После обновления ansible вы можете читать построчно следующим образом:

  - name: read the csv file
    read_csv:
      path: "{{ report.csv }}"
      delimiter: ','
    register: report_csv

Затем вы можете получить к нему доступ в виде списка, используя report_csv.list, и он будет содержать значения в виде списка словарей:

[{'Field1': 'name3', 'Field2': 3, 'Field3': 5}, {'Field1': 'name4', 'Field2': 5, 'Field3': 6}]
0 голосов
/ 06 июля 2019

Вот пример:

- name: "Sending email"
  hosts: localhost
  gather_facts: no
  tasks:
  - name: "Reading user information"
    read_csv:
      path: users.csv
    register: users
  - name: "Sending an e-mail using Gmail SMTP servers"
    mail:
      host: smtp.gmail.com
      port: 587
      username: <email>
      password: <pass>
      to: "{{ user.email }}"
      subject: Email Subjet
      body: |
        Hi {{ user.first_name }},

        How are you? 
    loop: "{{ users.list }}"
    loop_control:
      loop_var: user 

И CSV:

first_name,last_name,email
Joel,Zamboni,joel.zamboni@example.com

read_csv возвращает данные в двух форматах, как dict или как list и в этом случае я «перебираю» список для отправки электронных писем.

Best,

Joel

0 голосов
/ 16 декабря 2018

Я думаю, у вас есть два (с половиной) способа, о которых я могу подумать:

  1. Сделайте, как вы сказали, и пропустите файл через cut или python -c "import csv;..." или другие«ручная» обработка, затем захватывает вывод в переменную

    Все, что выглядит как JSON при подаче в vars: или set_fact:, станет list или dict, так что вы простохотите, чтобы текст вошел в инструмент, похожий на CSV, и вышел из инструмента, похожего на JSON

  2. . Используйте lookup("csvfile"), чтобы фактически прочитать файл, используя "утвержденный"механизм
    1. (это «половинная» часть:) если csv находится на удаленной машине, то используйте fetch:, чтобы вытащить его на управляющую машину, затем пробег lookup("csvfile") на нем
...