【问题标题】:Ansible- How to include /import playbook based on when condition resultAnsible-如何根据条件结果包含/导入剧本
【发布时间】:2020-12-02 06:08:36
【问题描述】:

我有一个文件夹,其中有很多子文件夹,这些子文件夹将有 yaml 文件,通过使用下面的代码,我得到了所有 yaml 文件并注册了这些文件,

  tasks:
- name: Find .yml files
  find:
    paths: /temp/
    patterns: '*.yml,*.yaml'
    recurse: yes
  register: yaml_path_files

其中一个yaml文件内容如下,

apiVersion: v1
kind: ConfigMap
metadata:
  name: special-config
  namespace: default
data:
  special.how: very
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: env-config
  namespace: default
data:
  log_level: INFO
  
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: env-config
  namespace: default
data:
  log_level: INFO

我想检查 yaml 包含的种类是否为 ConfigMap,并且需要将 yaml 文件作为参数传递给角色/另一个剧本,我尝试使用下面的代码,它不起作用,

    - debug:
    var: item.path
  when: lookup('file',item.path ) | from_yaml_all | list | selectattr('kind', '==', 'ConfigMap') | list | length > 0
  with_items: "{{ yaml_path_files.files }}"

我面临以下错误,

致命:[本地主机]:失败! => {"msg": "条件检查 'lookup('file',item.path ) | from_yaml | list | selectattr('kind', '==', 'ConfigMap') | list | length > 0' 失败. 错误是:评估条件时出错 (lookup('file',{{ filename }} ) | from_yaml | list | selectattr('kind', '==', 'ConfigMap') | list | length > 0): 'dict object' 没有属性 'kind'\n\n错误似乎在 '/cygdrive/c/senthil/Ansible/Ansibleusecase4/EKSartifactvalidationV2.yml':第 14 行第 7 列,但可能\n在文件中的其他位置取决于确切的语法问题。\n\n违规行似乎是:\n\n # with_items: "{{ yaml_path_files.files }}"\n - 调试:\n ^ here\n"}

请帮助我在 ansible 中实现它

【问题讨论】:

    标签: ansible


    【解决方案1】:

    初步说明:您的问题缺少完整的剧本以 100% 确定问题。使用更多信息编辑您的问题,如果这不是您的确切问题,可能使用MCVE

    您的find 任务在您的远程目标上查找文件。 file lookup 与所有其他查找一样(请参阅lookup plugins documentation 中的注释),在您的 ansible 控制器上本地读取文件。换句话说,您正在寻找一个不存在的文件。

    您必须 fetchslurp 远程目标中的文件才能获取其内容。

    这是一个快速编写的未经测试的示例,可让您走上正轨。请注意最后一个任务item.item.path 不是错字。 item.item 在注册新的 var yaml_files_content 时引用了前面的 item 循环(即前面任务中的每个 yaml_path_files.files[*],调试完整的 item 自己看看)

    - hosts: all
      
      tasks:
        - name: Find .yml files
          find:
            paths: /temp/
            patterns: '*.yml,*.yaml'
            recurse: yes
          register: yaml_path_files
    
        - name: Slurp file contents from remote
          slurp:
            src: "{{ item.path }}"
          loop: "{{ yaml_path_files.files }}"
          register: yaml_files_contents
       
        - name: Show path for files containing ConfigMaps
          debug:
            var: item.item.path
          loop: "{{ yaml_files_contents.results }}"
          when: item.content | b64decode | from_yaml_all | list | selectattr('kind', '==', 'ConfigMap') | list | length > 0
    
    

    【讨论】:

    • 感谢您的回复,通过添加以下代码,它对我来说很好,当:lookup('file',item.path).splitlines() |地图('下') |选择('匹配','^种类:\s+configmap$') |列表 |长度 > 0
    猜你喜欢
    • 2016-02-15
    • 2022-12-08
    • 2022-10-24
    • 2016-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多