如何配置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
相关产品推荐
相关产品推荐

