You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置Ansible遍历stdout_lines条目以删除对应INI段?

解决Ansible遍历grep结果中多个文件删除INI段的问题

你的问题核心在于:当前的loop仅遍历the_grep.results中的每个grep任务结果,但每个结果里的stdout_lines是多个文件路径的列表,直接将整个列表传给ini_file模块的path参数会导致模块无法识别,而取stdout_lines[0]又只能处理第一个文件。

要实现遍历所有匹配到的文件,你可以使用Ansible的subelements过滤器,它能将父列表元素与子列表的每个元素进行配对,实现嵌套遍历。

修改后的任务配置

将删除INI段的任务修改为如下内容:

- name: remove stanza from ini file
  ini_file:
    path: "{{ item.1 }}"
    section: "{{ item.0.item }}"
    mode: '0600'
    state: absent
  loop: "{{ the_grep.results | subelements('stdout_lines') }}"
  when: item.0.stdout_lines | length > 0

关键说明

  • subelements('stdout_lines'):这个过滤器会把the_grep.results中的每个结果项(记为item.0)和该结果中stdout_lines列表的每个元素(记为item.1)组合成元组,这样每次循环都会拿到单个文件路径和对应的要删除的section名称。
  • item.0.item:对应原my_list中的搜索条目,也就是你要删除的INI段名称。
  • when条件:确保只处理有匹配文件的结果,避免空列表导致的错误。

完整Playbook示例

---
- hosts: my_host
  gather_facts: false
  vars:
    my_list:
      - whatever
      - something
  tasks:
    - name: grep for item in search path
      shell: "grep -rIL {{ item }} /tmp"
      register: the_grep
      loop: "{{ my_list }}"
    
    - name: remove stanza from ini file
      ini_file:
        path: "{{ item.1 }}"
        section: "{{ item.0.item }}"
        mode: '0600'
        state: absent
      loop: "{{ the_grep.results | subelements('stdout_lines') }}"
      when: item.0.stdout_lines | length > 0

内容的提问来源于stack exchange,提问作者Kevin C

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 17:15:43