我有一个变量/词典文件,如下所示:
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'“}
如果我做错了事,请提供帮助,任务是从命令行获取模块名称,然后将其用作字典变量。
答案 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) }}"