gpt4 book ai didi

Ansible - with_dict : dictionary - How to use variables defined in each dictionary which depends upon others

转载 作者:行者123 更新时间:2023-12-04 14:25:48 29 4
gpt4 key购买 nike

环境为:Ansible 1.9.2、CentOS 6.5

我创建了一个角色来从 Artifactory 下载 3 个不同 JAVA 版本的 JAVA (.tar.gz) 工件文件。我正在尝试使用 Ansible 的 with_dict 功能(而不是使用 with_items)。

创建了以下文件:

$ cat 角色/java/defaults/main.yml

---
java_versions:
java7_60:
version: 1.7.60
group_path: com/oracle/jdk
classifier: linux-x64
ext: tar.gz
dist_file: "jdk-{{ version }}-{{ classifier }}-{{ ext }}"
# dist_file: "jdk-{{item.value.version }}-{{ item.value.classifier }}-{{ item.value.ext }}"
dist_url: "{{ artifactory_url }}/{{ group_path }}/{{ version }}/{{ dist_file }}"
# dist_url: "{{ artifactory_url }}/{{ item.value.group_path }}/{{ item.value.version }}/{{ dist_file }}"

java7_67:
version: 1.7.67
group_path: com/oracle/jdk
classifier: linux-x64
ext: tar.gz
dist_file: "jdk-{{item.value.version }}-{{ item.value.classifier }}-{{ item.value.ext }}"
dist_url: "{{ artifactory_url }}/{{ item.value.group_path }}/{{ item.value.version }}/{{ dist_file }}"
java8_45:
version: 1.8.45
group_path: com/oracle/jdk
classifier: linux-x64
ext: tar.gz
dist_file: "jdk-{{item.value.version }}-{{ item.value.classifier }}-{{ item.value.ext }}"
dist_url: "{{ artifactory_url }}/{{ item.value.group_path }}/{{ item.value.version }}/{{ dist_file }}"

如何设置或使用 dist_file dist_url 依赖于在同一个 KEY 中定义的其他变量的变量(让我们在 KEY java7_60 中说)?

现在,当我尝试当前的 dist_file 或 dist_url 变量时 注释掉的行设置它们的方式(即使用 item.value。),它没有根据需要设置这 2 个变量的值,即取决于其他变量 version、group_path、classifier、ext 和 artifactory_url(在另一个常见角色的defaults/main.yml 文件))。

我看到使用 with_dict: 在剧本/任务中,我必须使用 {{ item.value.variable_name }} 但是如何定义依赖于字典的同一 KEY 部分中的其他变量的变量。

在以下任务中使用上述字典时收到的错误消息是:

$ cat 角色/java/tasks/main.yml :
- name: Download Java/JDK Versions
command: wget -q "{{ item.value.dist_url }}"
chdir="{{ common_download_dir }}"
creates="{{ common_download_dir }}/{{ item.value.dist_file }}"
with_dict: "{{ java_versions }}"
become_user: "{{ build_user }}"

错误信息 使用 dist_file/dist_url(使用roles/java/defaults/main.yml 中的当前设置):
TASK: [java | Download Java/JDK Versions] *************************************
failed: [server01.poc.jenkins] => (item={'key': 'java7_60', 'value': {'dist_file': u'jdk-{# version #}-{# classifier #}-{# ext #}', 'ext': 'tar.gz', 'version': '1.7.60', 'dist_url': u'{# artifactory_ur #}/{# group_path #}/{# version #}/{# dist_file #}', 'group_path': 'com/oracle/jdk', 'classifier': 'linux-x64'}}) => {"changed": true, "cmd": ["wget", "-q", "{# artifactory_url #}/{# group_path #}/{# version }/{# dist_file #}"], "delta": "0:00:00.006081", "end": "2015-11-23 12:50:18.383728", "item": {"key": "java7_60", "value": {"classifier": "linux-x64", "dist_file": "jdk-{# version #}-{# classifier #}-{# ext #}, "dist_url": "{# artifactory_url #}/{# group_path #}/{# version #}/{# dist_file #}", "ext": "tar.gz", "group_path": "com/oracle/jdk", "version": "1.7.60"}}, "rc": 4, "start": "2015-11-23 12:50:18.377647", "wrnings": ["Consider using get_url module rather than running wget"]}

错误信息 使用 dist_file/dist_url (目前在角色/java/defaults/main.yml 中注释掉了 的行 ):
TASK: [java | Download Java/JDK Versions] *************************************
failed: [server01.poc.jenkins] => (item={'key': 'java7_60', 'value': {'dist_file': u'jdk-{#item.value.version #}-{# item.value.classifier #}-{# item.value.ext #}', 'ext': 'tar.gz', 'version': '1.7.60' , 'dist_url': u'{# artifactory_url #}/{# item.value.group_path #}/{# item.value.version #}/{# dist_file #}', 'group_path': 'com/oracle/jdk', 'classifier': 'linux-x64'}}) => {"changed": true, "cmd": ["wget", "-q", "{# artifactory_url #}/{# item.value.group_path #}/{# item.value.version #}/{# dist_file #}"], "delta": "0:00:00.005900", "end": "2015-11-23 12:36:24.131327", "item": {"key": "java7_60", "value": {"cla ssifier": "linux-x64", "dist_file": "jdk-{#item.value.version #}-{# item.value.classifier #}-{# item.value.ext #}", "dist_url": "{# artifactory_url #}/{# item.value.group_path #}/{# item.value.version #}/{# dist_file #}", "ext": "tar.gz", "group_path": "com/oracle/jdk", "version": "1.7.60"}}, "rc": 4, "start": "2015-11-23 12:36:24.125427", "warnings": ["Consider using get_url module rather than running wget"]}

最佳答案

我对这个很好奇所以我做了一些挖掘,在这样做的过程中我遇到了 this similar answer .不过,这只是您的解决方案的一部分。

Ansible 似乎不允许你从它自己的定义中引用一个变量,我想这是有道理的,因为它没有完全定义。所以这样的事情是行不通的,实际上在引用变量时会抛出一个有点令人困惑的错误:

---
myvar:
param1: foo
param2: "{{ myvar['foo'] }} bar"

从您自己的示例来看,Ansible 似乎也不允许您使用 item在变量中构造以引用其他复杂变量。这种对我来说很有意义,因为 Ansible 似乎在定义变量时解析变量中的 jinja2 构造,而不是在引用变量时在运行时解析。

因此,尽管这不是您想要的,但我认为如果您将变量分成两部分,您可以通过执行以下操作来使其工作:
---
artifactory_url: "http://path.to.jarfile"
java_versions:
java7_60:
version: 1.7.60
group_path: com/oracle/jdk
classifier: linux-x64
ext: tar.gz

java_downloads:
java7_60:
dist_url: "{{ artifactory_url }}/{{ java_versions['java7_60']['group_path'] }}/{{ java_versions['java7_60']['version'] }}/jdk-{{ java_versions['java7_60']['version'] }}-{{ java_versions['java7_60']['classifier'] }}.{{ java_versions['java7_60']['ext'] }}"

调试时 java_downloads这样你就可以得到你正在寻找的完整 URL:
TASK: [debug var=item] ********************************************************
ok: [localhost] => (item={'key': 'java7_60', 'value': {'dist_url': u'http://path.to.jarfile/com/oracle/jdk/1.7.60/jdk-1.7.60-linux-x64.tar.gz'}}) => {
"item": {
"key": "java7_60",
"value": {
"dist_url": "http://path.to.jarfile/com/oracle/jdk/1.7.60/jdk-1.7.60-linux-x64.tar.gz"
}
},
"var": {
"item": {
"key": "java7_60",
"value": {
"dist_url": "http://path.to.jarfile/com/oracle/jdk/1.7.60/jdk-1.7.60-linux-x64.tar.gz"
}
}
}
}

关于Ansible - with_dict : dictionary - How to use variables defined in each dictionary which depends upon others,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33877730/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com