Ansible使用任务在变量模板中返回变量

时间:2015-04-24 01:44:03

标签: ansible ansible-playbook

我正在尝试制作一个环境变量列表,以便在由于版本差异而在每台主机上路径可能略有不同的任务中使用。

例如,/some/common/path/v_123/rest/of/path

我在variables.yml文件中创建了这些变量的列表,这些变量通过角色导入。

roles/somerole/varables/main.yml包含以下内容

somename:
  somevar: 'coolvar'
  env:
    SOME_LIB_PATH:  /some/common/path/{{ unique_part.stdout }}/rest/of/path

然后我有一个运行类似

的任务
- name:  Get unique path part
  shell:  'ls /some/common/path/'
  register: unique_part
  tags:  workflow

- name:  Perform some actions that need some paths
  shell:  'binary argument argument'
  environment: somename.env

但是我得到一些关于未定义变量的Ansible错误。

或者我试图预定义unique_part.stdout希望注册覆盖预定义变量,但后来我得到了其他的ansible错误 - 模板失败。

是否有其他方法可以根据命令返回来制作这些变量?

2 个答案:

答案 0 :(得分:7)

您还可以使用事实: http://docs.ansible.com/set_fact_module.html

# Prepare unique variables 
- hosts: myservers
  tasks: 
    - name:  Get unique path part
      shell:  'ls /some/common/path/'
      register: unique_part
      tags:  workflow

    - name: Add as Fact per for each hosts
      set_fact:
         library_path: "{{ unique_part.stdout }}"

# launch roles that use those unique variables
- hosts: myservers
  roles: 
   - somerole

通过这种方式,您可以在使用变量之前动态地向主机添加变量。

答案 1 :(得分:1)

当Ansible读取vars文件时,会对其进行评估。您唯一的机会是包含一个占位符,然后您必须自行替换,如下所示:

somename:
  somevar: 'coolvar'
  env:
    SOME_LIB_PATH: '/some/common/path/[[ unique_part.stdout ]]/rest/of/path'

然后在您的剧本中,您可以替换该占位符:

- name:  Perform some actions that need some paths
  shell:  'binary argument argument'
  environment: '{{ somename.env | replace("[[ unique_part.stdout ]]", unique_part.stdout) }}'