如何使用with_lines读取ansible-playbook中的CSV文件数据?

时间:2018-12-16 05:37:57

标签: loops variables ansible ansible-2.x

我遇到的情况是,在一个csv文件中,我有如下两列

var elems = document.querySelector('.collapsible');
var instances = M.Collapsible.init(elems);
instances.open(1);

现在我要使用粗体字行。

每个列将是ansible角色之一的输入。

它应该像

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

4 个答案:

答案 0 :(得分:1)

我相信您可以通过两种(一半)方式想到:

  1. 按照您所说的做,并通过cutpython -c "import csv;..."或其他“手动”处理运行文件,然后将输出捕获到变量中

    将任何类似JSON的东西输入vars:set_fact:时,都会变成listdict,因此您只想将文本放入看起来像CSV的工具,而看起来像JSON的工具

  2. 使用lookup("csvfile")通过“批准的”机制实际读取文件
    1. (这是“半个”部分:)如果csv在远程计算机上,则使用fetch:将其拉到您的控制计算机上,然后 在其上运行lookup("csvfile")

答案 1 :(得分:0)

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}]

答案 2 :(得分:0)

这里是一个例子:

this

和CSV:

- 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 

first_name,last_name,email Joel,Zamboni,joel.zamboni@example.com 以两种格式返回数据,分别为read_csvdict,在这种情况下,我将“循环”到列表中以发送电子邮件。

最好

乔尔

答案 3 :(得分:0)

也分享我的 ansible 代码,这对我有用https://stackoverflow.com/a/56910479/1679541

playbook.yaml

---
- name: Read Users
  gather_facts: True
  hosts: localhost

  tasks:
  - read_csv:
      path: users.csv
    register: userlist

  - debug: 
      msg: "{{ user.username }} and password is {{ user.password }}"
    loop: "{{ userlist.list }}"
    loop_control:
      loop_var: user

users.csv

username,password
user0,test123
user1,test123

Ansible 输出

PLAY [Read Users] *************************************************

TASK [Gathering Facts] *********************************************************
ok: [127.0.0.1]

TASK [read_csv] ****************************************************************
ok: [127.0.0.1]

TASK [debug] *******************************************************************
ok: [127.0.0.1] => (item={u'username': u'user0', u'password': u'test123'}) => {
    "msg": "user0 and password is test123"
}
ok: [127.0.0.1] => (item={u'username': u'user1', u'password': u'test123'}) => {
    "msg": "user1 and password is test123"
}

PLAY RECAP *********************************************************************
127.0.0.1                  : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0