【问题标题】:Ansible conditional template variable substitutionAnsible 条件模板变量替换
【发布时间】:2018-02-06 05:04:55
【问题描述】:

我正在尝试从包含基于 {{ ansible_hostname }} 的第四个字符的包含变量的模板创建配置文件。

什么有效:

剧本:

---
- hosts: spock
  roles:
   - templaterole

角色:

---
- name: testing autofs template on spock
  template:
    src=autofs
    dest=/tmp/autofs
  with_items: 
     - "{{ var_a }}"
  when: ('{{ ansible_hostname }}' == "spock") 

vars/main.yml:

var_a:
  -
     var_1: 'this is var_a1'
     var_2: 'this is var_a2'
var_b:
  -
     var_1: 'this is var_b1'
     var_2: 'this is var_b2'

模板:

{{ item.var_1 }}
#
{{ item.var_2 }}
#

这按预期工作,输出在 spock 主机上生成一个 /tmp/autofs 文件,如下所示:

this is var_a1
#
this is var_a2
#

现在,如果我尝试根据尝试提取{{ ansible_hostname }} 的第 4 个字符来写入文件,则该播放不会在条件上匹配并且不会写入文件。我在我的角色中尝试这个条件:

---
- name: testing autofs template on spock
  template:
    src=autofs
    dest=/tmp/autofs
  with_items: 
     - "{{ var_a }}"
  when: ('{{ ansible_hostname }} | cut -c4' == "c") or
        ('{{ ansible_hostname }} | cut -c4' == "k") 

由于条件不匹配,播放跳过此任务。最终,我希望能够提取我们主机名的任何第 4 个字符,因为这始终是可预测的(只能是定义我的环境并让我根据这些差异生产环境定义正确的模板变量的 4 个已知字符之一。)

谁能帮我重新定义我的 when 语句,以便我可以做或条件并从定义的 ansible 变量(如 ansible_hostname)中提取字符?

【问题讨论】:

  • 当您使用管道时,它会发送第一个命令的结果......但这是一个变量而不是命令的名称。所以很可能它使用了一个找不到的命令。也许如果你刚刚用{{ ansible_hostname[3] }} == "c" 在第 4 个位置得到了字符,它会起作用
  • 我不相信第一个条件可以正常工作。它总是评估为假。请阅读when 指令上的文档。

标签: ansible ansible-2.x


【解决方案1】:

不要在when 语句中使用大括号,它已经是 Jinja2 语句了。
在 Jinja2 语句中,您使用 | 来应用过滤器,但没有可用的 cut 过滤器。

你的陈述应该很简单:

when: ansible_hostname[3] in 'ck'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多