Aru*_*gal 5 roles ordereddictionary ansible ansible-playbook
环境是: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 }}"
Run Code Online (Sandbox Code Playgroud)
如何设置或使用dist_file或dist_url变量,这取决于在同一个KEY中定义的其他变量(比如在KEY java7_60中)?
现在,当我正在尝试当前的dist_file或dist_url变量或注释掉的行设置它们的方式(即使用item.value.)时,它不会根据需要设置这两个变量的值,即取决于其他变量版本,group_path,classifier,ext和artifactory_url(在另一个公共角色的默认值/ main.yml文件中定义)).
我看到在playbook/task中使用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 }}"
Run Code Online (Sandbox Code Playgroud)
使用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"]}
Run Code Online (Sandbox Code Playgroud)
使用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-{#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"]}
Run Code Online (Sandbox Code Playgroud)
我相信做你想做的事情的最好方法(因为我不相信循环变量可以引用自己)是让你的任务是:
- name: Download Java/JDK Versions
command: wget -q "{{ artifactory_url }}/{{ item.value.group_path }}/{{ item.value.version }}/jdk-{{item.value.version }}-{{ item.value.classifier }}-{{ item.value.ext }}"
chdir="{{ common_download_dir }}"
creates="{{ common_download_dir }}/jdk-{{item.value.version }}-{{ item.value.classifier }}-{{ item.value.ext }}"
with_dict: "{{ java_versions }}"
become_user: "{{ build_user }}"
Run Code Online (Sandbox Code Playgroud)
本质上是手动将变量插入到您的任务中。
如果你需要在多个任务中使用变量,那就不太漂亮了,但是在 ansible 1.x 中,我认为没有办法让它变得漂亮。Ansible 2.0 有块,您可以使用它们在一个字典上循环多个任务,并且您可以为该块中的所有任务定义要使用的变量。
| 归档时间: |
|
| 查看次数: |
18182 次 |
| 最近记录: |