从 Ansible 写入 csv 文件中的特定单元格

Writing to a particular cell in csv file from Ansible

我正在尝试查找是否有任何选项可以从 Ansible 写入 CSV 文件中的特定单元格。我可以使用 Ansible 查找插件类型“csvfile”来查找 csv 文件中的值,但我需要向该文件添加文本。考虑以下示例:

empID,name,mark
111,user1
112,user2
113,user3

我需要为每个用户添加标记,运行 剧本应该提示输入 empID 和标记:

---
- name: Update data
  hosts: localhost
  vars_prompt:
    - name: empid
      prompt: EMP_ID
      private: no
    - name: marks
      prompt: MARKS
      private: no
  tasks:
    - name: Lookup
      debug:
        msg: "{{ lookup('csvfile', '{{ empid }} file=data.csv delimiter=, col=2') }}"

需要帮助写入 CSV 文件 C 列第 1、2、3 行....

ansible 中似乎没有提供 write_csv 机制,部分原因是 ansible 不是通用计算平台。但是,您可以轻松 write your own module which behaves as you wish, or you may be able to find an existing one out in ansible galaxy

正如 @mdaniel 提到的,Ansible 中没有开箱即用的 write_csv 模块。在不创建自己的模块的情况下,我能想到的唯一解决方法如下:

  1. 您使用 read_csv 模块读取 CSV 文件并将数据 table 注册为字典变量。
  2. 您使用键“mark”递归地将新值添加到 dict 变量。 (检查此 以修改 dict 变量中的值)
  3. 您遍历 dict 变量并使用 lineinfile 模块将每一行输出到一个新文件。可以使用 .csv 扩展名创建文件,并且在每一行中,值用分隔符分隔(,;)。

这是一个例子:

---
- hosts: localhost
  gather_facts: no

  tasks:
    - name: Read from CSV file
      community.general.read_csv:
        path: data.csv
        key: empID
        delimiter: ','
      register: response
    - name: Create a dict variable from the CSV file
      set_fact:
        data_dict: "{{  response.dict  }}"
    - name: Update values in dictionary recursively
      set_fact:
        data_dict: "{{ data_dict | combine(new_item, recursive=true) }}"
      vars:
        new_item: "{ '{{ item.key }}': { 'mark': 'some_value' } }"
      with_dict: "{{ data_dict }}"
    - name: Debug
      debug:
        msg: "{{  data_dict  }}"
    - name: Save ddata_dict headers to a new CSV file
      lineinfile:
        path: new_data.csv
        line: empID,name,mark
        create: yes
    - name: Save data_dict values to a new CSV file
      lineinfile:
        path: new_data.csv
        line: "{{ item.value.empID }},{{ item.value.name }},{{ item.value.mark }}"
      loop: "{{ data_dict | dict2items }}"

输出的CSV文件为:

empID,name,mark
111,user1,some_value
112,user2,some_value
113,user3,some_value