【发布时间】:2016-02-25 22:53:51
【问题描述】:
环境为:Ansible 1.9.2、CentOS 6.5
我创建了一个角色,用于从 Artifactory 下载 3 个不同 JAVA 版本的 JAVA (.tar.gz) 工件文件。我正在尝试使用 Ansible 的 with_dict 功能(而不是使用 with_items)。
创建了以下文件:
$ cat roles/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 roles/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(当前设置在角色/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"]}
【问题讨论】:
-
与其将所有变量组合到变量
dict_url中并在任务中引用它,不如让任务自己执行wget -q "{{ artifactory_url }}/{{ item.value.group_path }}/{{ item.value.version }}/{{ dist_file }}"更容易吗? -
感谢您的评论。我试过了,但它使任务看起来有点难看。即使我这样做,我认为问题在于您是否可以使用同一个 KEY 中的另一个字典变量来设置字典变量。无论哪种方式,问题似乎是字典变量中的变量没有被替换。我正在尝试你说的,看看是否有效!想知道有没有一种方法可以在字典的 KEY 部分中组合/重用变量。
-
我相信最简单(也许是最好)的方法是在角色中创建 dist_file 和 dist_url 字符串,而不是在字典中定义它。
-
@SepehrNazari 我喜欢这个主意!,你能发布如何做到这一点吗?你的意思是,我仍然可以使用 with_dict: 只有初始 4 个字典变量(版本、组路径、分类器和 ext)并创建 2 个变量:dist_file 和 dist_url 在角色/java/tasks/main.yml 中?
标签: ansible roles ansible-playbook ordereddictionary