ansible中遇上的一个小问题

  1. 1. 问题描述
  2. 2. 原因排查
  3. 3. 解决办法

今天在新工作的地方研究了一下自动化的playbook,刚好遇上一个很奇怪的问题,来自ansible(version=2.10.1)

问题描述

由于需要利用ansible调用zabbix的JMX监控,而监控的触发器在不同环境又是不一样的,因此需要利用ansible的set_fact 模块,为不同的环境添加不同的模板。 同时ansible 需要支持自定义传参添加额外监控模板功能。以下是实现:

举个例子:

1
2
3
4
5
6
7
- name: Set jmx template for dev 
set_fact:
zabbixJmxTemplate: "{{devZabbixTemplate" + [item] }}"
with_items:
- "{{inputParamZabbixTemplate}}"
when:
- ( env| string == "dev" )

看起来很美好对吧

那就大错特错了。

实际执行起来这段playbook会被跳过

原因排查

查来查去发现是因为加了with_item的原因, 由于item的默认值是一个空的列表inputParamZabbixTemplate: []

实际上就不会对他进行操作。

解决办法

解决办法其实比较简单,就是在这一步之前执行一个变量初始化操作,这样如果有item的话原有逻辑也能继续执行,同样的如果没有的话跳过,也能依照初始变量运行

1
2
3
4
5
6
7
8
9
10
11
12
- name: init vars
set_fact:
zabbixJmxTemplate: "{{devZabbixTemplate}}"
when:
- ( env| string == "dev" )
- name: Set jmx template for dev
set_fact:
zabbixJmxTemplate: "{{devZabbixTemplate}}" + ['{{item}}']
with_items:
- "{{inputParamZabbixTemplate}}"
when:
- ( env| string == "dev" )