【问题标题】:Ansible use task return varible in variable templatesAnsible 在变量模板中使用任务返回变量
【发布时间】:2015-04-24 01:44:03
【问题描述】:

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

例如,/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 ansible-playbook


    【解决方案1】:

    您还可以使用事实: 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
    

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

    【讨论】:

      【解决方案2】:

      在 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) }}'
      

      【讨论】:

      • 感谢 udondan 解释了模板的读取方式,这是有道理的。我脑子里的处理顺序错了,我认为它是根据首先访问的内容逐步进行的。虽然您的解决方案更简单,但我将 ant31 标记为答案,因为他的解决方案看起来更简洁。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多