Ansible子元素查询需要字典

时间:2018-08-24 14:17:23

标签: 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'“}

如果我做错了事,请提供帮助,任务是从命令行获取模块名称,然后将其用作字典变量。

1 个答案:

答案 0 :(得分:1)

两个错误:

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

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

您应该做什么:

  • 使用vars lookup来引用一个变量,该变量的名称存储在另一个变量中(您使用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) }}"