查询模块中的 Ansible 循环

问题描述 投票:0回答:1

您好,我有一个要求,需要读取特定目录下所有文件的内容,并通过 变量的内容。

- name: Generate  logs
  hosts: appserver
  vars:
    logs_dir: /properties
    logs: {}
  tasks:
    - name: Read log config files
      set_fact:
        log_files: "{{ lookup('fileglob', logs_dir + '/*.properties')|split(',') }}"
    - name: check values   
      debug:
        var: log_files
      
    - name: Generate  list
      set_fact:
         logs: "{{ item }}"
      with_items: "{{ query('file', log_files[1], wantlist=True) }}"
       

当我只传递一个文件时它是否有效我想逐个文件传递给查询模块?任何建议,这些都是 yaml 文件,请让我帮助从文件中获取特定标签。

loops ansible ansible-template
1个回答
0
投票

Q:“读取特定目录的所有(yaml)文件并将内容传递给变量。”

A:有更多选择。例如,给定用于测试的树

shell> tree /tmp/properties
/tmp/properties
├── 01.properties
├── 02.properties
└── 03.properties

0 directories, 3 files

shell> cat /tmp/properties/01.properties 
var_01: '01'

shell> cat /tmp/properties/02.properties 
var_02: '02'

shell> cat /tmp/properties/03.properties 
var_03: '03'

  1. 包括来自所有文件的变量并组合字典。剧
- hosts: localhost

  vars:

    log_dir: /tmp/properties
    log_files_glob: "{{ log_dir }}/*.properties"
    log_files: "{{ query('fileglob', log_files_glob) }}"
    log_files_dict: "{{ lookup('vars', *q('varnames', 'log_file_\\d+'))|combine }}"

  tasks:

    - block:
        - debug:
            var: log_files
        - include_vars:
            file: "{{ item }}"
            name: "log_file_{{ ansible_loop.index }}"
          loop: "{{ log_files }}"
          loop_control:
            extended: true
        - debug:
            var: log_files_dict
      run_once: true

给(删节)

  log_files_dict:
    var_01: '01'
    var_02: '02'
    var_03: '03'

  1. 可以简化代码,读取独立变量
        - include_vars: "{{ item }}"
          loop: "{{ log_files }}"
        - debug:
            msg: |
              var_01: {{ var_01 }}
              var_02: {{ var_02 }}
              var_03: {{ var_03 }}

给予

  msg: |-
    var_01: 01
    var_02: 02
    var_03: 03

  1. 下一个选项是使用模块assemble
        - assemble:
            src: "{{ log_dir }}"
            regexp: '.*\.properties'
            dest: /tmp/properties.yml

给文件

shell> cat /tmp/properties.yml
var_01: '01'
var_02: '02'
var_03: '03'

根据需要包含此文件。


完整的测试剧本示例

- hosts: localhost

  vars:

    log_dir: /tmp/properties

  tasks:

    - block:
        - assemble:
            src: "{{ log_dir }}"
            regexp: '.*\.properties'
            dest: /tmp/properties.yml
        - include_vars:
            file: /tmp/properties.yml
            name: log_files_dict
        - debug:
            var: log_files_dict
      run_once: true
© www.soinside.com 2019 - 2024. All rights reserved.