首页 > 解决方案 > Ansible 子元素查找需要字典

问题描述

我有一个变量/字典文件如下:

cafu_analyze_bidprice:
  artifacts_name:
    - "forecast-measures-read-deploy"
    - "forecast-measures-finalizer-deploy"
  group_id: "com.lufthansa.cobra.cafu"

cafu_measurement:
  artifacts_name:
    - "forecast-exporter-read-deploy"
  group_id: "com.lufthansa.cobra.cafu"

和剧本如下:

- name: Get deployable artifact from artifactory and copy
  maven_artifact:
    validate_certs: false
    group_id: "{{ item.0.group_id }}"
    artifact_id: "{{ item.1 }}"
    version: "{{ version }}"
    repository_url: http://10.127.130.82:8081/artifactory/cafu
    dest: "/opt/cafu/target-test"
    classifier: "exec"
  with_subelements:
    - "{{ module_name }}"
    - artifacts_name

我将模块名称作为变量传递:

ansible-playbook -C cafu-deploy.yml -i hosts -e module_name=cafu_analyze_bidprice -e version=1.1.17-SNAPSHOT

出现以下错误:

失败的!=> {"msg": "子元素查找需要字典,得到 'cafu_analyze_bidprice'"}

如果我做错了什么,请帮忙,任务是从命令行获取模块名称,而不是将它们用作字典变量。

标签: ansible

解决方案


两个错误:

  • 您传递的是字符串 ( cafu_analyze_bidprice) 而不是对名为 的变量的引用cafu_analyze_bidprice

  • 使用subelements查找不适合此用例,因为您没有字典列表。

你应该做什么:

  • 使用vars查找来引用名称存储在另一个变量中的变量(您使用module_name),

  • 遍历artifacts_name上述查找结果的键中定义的列表。

由于您还使用group_id键,您可以使用辅助变量(my_var在下面的示例中调用)来避免调用查找两次:

- name: Get deployable artifact from artifactory and copy
  maven_artifact:
    validate_certs: false
    group_id: "{{ my_var.group_id }}"
    artifact_id: "{{ item }}"
    version: "{{ version }}"
    repository_url: http://10.127.130.82:8081/artifactory/cafu
    dest: "/opt/cafu/target-test"
    classifier: "exec"
  loop: "{{ my_var.artifacts_name }}"
  vars:
    my_var: "{{ lookup('vars', module_name) }}"

推荐阅读