簡體   English   中英

如何使用 ansible 中的 jinja2 模板將字典轉換為 csv?

[英]How to convert dictionary to csv using jinja2 templates in ansible?

我需要將自定義 output 變量轉換為字典,然后使用 jinja2 模板生成 csv 文件

下面是代碼

- name: Executing the cmd (multipath -ll | grep dm- | awk -F' dm' '{print $1}') to get the device name
   shell: multipath -ll | grep dm- | awk -F' dm' '{print $1}' | awk -F ' ' '{print $1}'
   register: multipath_device_name  
      
- name: Executing the cmd (multipath -ll | grep -E status='(active|inactive)' | awk -F ' ' '{print $5}' | cut -c 8-16) to get the device active or inactive 
  shell: multipath -ll | grep -E status='(active|inactive)' | awk -F ' ' '{print $5}' | cut -c 8-16
  register: multipath_device_status
                  
- name: Executing the cmd (multipath -ll | grep dm- | awk -F' dm' '{print $1}' | awk -F ' ' '{print $2}' | cut -d "(" -f2 | cut -d ")" -f1) to get the device active or inactive 
  shell: multipath -ll | grep dm- | awk -F' dm' '{print $1}' | awk -F ' ' '{print $2}' | cut -d "(" -f2 | cut -d ")" -f1
  register: multipath_device_id

- set_fact:
        multipath_devices:
          device_name: "{{ multipath_device_name.stdout_lines }}"
          device_id: "{{ multipath_device_id.stdout_lines }}"
          device_id_status: "{{ multipath_device_status.stdout_lines  }}"
          server_name: "{{ ansible_hostname }}"
          server_ip: "{{ ansible_default_ipv4.address }}"
- debug:
    msg: "{{ multipath_devices }}"

對於上述變量“multipath_devices”,我得到了以下 output

"msg": {
        "device_id": [
            "3xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2",
            "3xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3",
            "3xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4",
            "3xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5",
            "3xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6",
            "3xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7",
            
        ],
        "device_id_status": [
            "active",
            "active",
            "active",
            "active",
            "active",
            "active"
            
        ],
        "device_name": [
            "name1",
            "name2",
            "name3",
            "name4",
            "name5",
            "name6"
        ],
        "server_ip": "192.168.56.120",
        "server_name": "node-01"

我嘗試使用如下所示的 jinja2 模板將該變量轉換為 csv ,但它沒有給出我需要的確切 output 。 請幫助我用 csv 完成這項工作

{% for key, value in multipath_devices.items() %}
    {{key}}
    {{value}}
{% endfor %}

我需要 CSV 文件 output 如下所示

"device_name","device_id","device_id_status","server_name","server_ip"
name1, 3xxxxxxx3, active, server1, 192.168.56.201

下面是命令 output

name1 (3xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2)
name2 (3xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3)
name3 (3xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4)
name4 (3xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5)
name5 (3xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6)
name6 (3xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7)

在文件夾中創建 csv.j2 文件:(您在與劇本相同的位置創建文件夾文件)

"device_name","device_id","device_id_status","server_name","server_ip"
{% for devicename in multipath_devices.device_name %}
{{devicename}}, {{multipath_devices.device_id[loop.index0]}}, {{multipath_devices.device_id_status[loop.index0]}}, {{servername}}, {{serverip}}
{% endfor %}

使用它的劇本:

- name: "tips1"
  hosts: localhost
  vars:
    multipath_devices:
      device_id:
          - 3xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2
          - 3xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3
          - 3xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4
          - 3xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5
          - 3xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6
          - 3xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7
      device_id_status:
          - active
          - active
          - active
          - active
          - active
          - active
      device_name:
          - name1
          - name2
          - name3
          - name4
          - name5
          - name6
      server_ip: 192.168.56.120
      server_name: node-01    
  tasks:  
    - name: create csv
      #delegate_to: localhost
      template:
        src: csv.j2   #cherche dans templates
        dest: result.csv
      vars:
        servername: "{{ multipath_devices.server_name }}"
        serverip: "{{ multipath_devices.server_ip}}"
    

導致結果。csv:

"device_name","device_id","device_id_status","server_name","server_ip"
name1, 3xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2, active, node-01, 192.168.56.120
name2, 3xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3, active, node-01, 192.168.56.120
name3, 3xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4, active, node-01, 192.168.56.120
name4, 3xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5, active, node-01, 192.168.56.120
name5, 3xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6, active, node-01, 192.168.56.120
name6, 3xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7, active, node-01, 192.168.56.120

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM