仅当变量包含特定字符串时才运行Ansible任务

时间:2016-04-08 10:08:32

标签: linux conditional ansible ansible-playbook ansible-2.x

我有多个任务取决于variable1的值。我想检查值是否在{{variable1}}但是我收到了错误:

- name: do something when the value in variable1
  command: <command>
  when: "'value' in {{variable1}}"

我正在使用ansible 2.0.2

9 个答案:

答案 0 :(得分:35)

上述答案都没有在ansible 2.3.0.0中适用于我,但以下内容确实如此:

when: variable1 | search("value")

在ansible 2.9中,不赞成使用〜concatenation进行变量替换:

when: "variable1.find('v=' ~ value) == -1"

http://jinja.pocoo.org/docs/dev/templates/#other-operators

答案 1 :(得分:33)

如果when: '"value" in variable1' 是一个字符串,并且您正在其中搜索子字符串,那么这应该有效:

variable1

如果in是数组或字典,def aggregate(lst): new = {} for d in lst: new.setdefault((d['user'], d['id']), []).append(d) for k, d in new.items(): if len(d) > 1: keys, values = zip(*[(sub['key'], sub['value']) for sub in d]) user, id_ = k yield {'key': keys, 'value': values, 'user': user, 'id': id_} else: yield d[0] print list(aggregate(lst)) [{'id': 7, 'value': 5, 'key': 17, 'user': 578}, {'id': 7, 'value': (3, 4), 'key': (16, 17), 'user': 3}, {'id': 48, 'value': 1, 'key': 52, 'user': 3}, {'id': 48, 'value': 2, 'key': 46, 'user': 578}] 将搜索 exact 字符串作为其中一项。

答案 2 :(得分:7)

来自Ansible 2.5

when: variable1 is search("value")

答案 3 :(得分:3)

此示例使用regex_search执行子字符串搜索。

- name: make conditional variable
  command: "file -s /dev/xvdf"
  register: fsm_out

- name: makefs
  command: touch "/tmp/condition_satisfied"
  when: fsm_out.stdout | regex_search(' data')

ansible version:2.4.3.0

答案 4 :(得分:3)

某些答案不再如所解释的那样起作用。

当前,这在ansible 2.6.x中适用于我

 when: register_var.stdout is search('some_string')

答案 5 :(得分:3)

这在Ansible 2.9中对我有效:

select t.*, min(value) over () + row_number() over (order by id) - 1 as new_value
from test t;

而不是:

variable1 = www.example.com. 
variable2 = www.example.org. 

when: ".com" in variable1

答案 6 :(得分:2)

使用此

  

何时:“ {{variable1}中的“值”}”

代替

  

何时:“ {{variable1}}中的''value'”

还可以使用字符串比较

  

当:“ {{variable1 =='value'}}”

答案 7 :(得分:1)

在Ansible版本2.9.2中:

如果声明了变量variable1:

when: "'value' in variable1"

如果您注册了variable1,则:

when: "'value' in variable1.stdout"

答案 8 :(得分:-2)

我用过

failed_when: not(promtool_version.stdout.find('1.5.2') != -1)

表示 - 仅当先前注册的变量“promtool_version”不包含字符串“1.5.2”时才会失败。