Skip to content

Add InfluxDB settings in Telegraf using Ansible: [WARNING]: The value [...] (type list) in a string field was converted to "[...]" (type string)

I'm in the process of updating my entire home setup, and integrate everything properly. Part of this process is to automate everything, and use Ansible Playbooks to deploy devices and configurations.

Today: install Telegraf and send data to InfluxDB

Along the way something broke, and Ansible doesn't really like me anymore. But let's start at the beginning.

In the Telegraf configuration in "/etc/telegraf/telegraf.conf" one can specify output plugins. One of them (probably the most used one) is "InfluxDB". The InfluxDB instance(s) are specified as a [...] list. In Ansible I somehow need to have this list as a string, and write it into the configuration file. This happens:

TASK [Update telegraf.conf InfluxDB settings] ***************************************************
changed: [localhost] => (item={'section': '[outputs.influxdb]', 'option': 'urls', 'value': ['http://192.168.xxx.xxx:8086'], 'state': 'present'})
[WARNING]: The value ['http://192.168.xxx.xxx:8086'] (type list) in a string field was converted to "['http://192.168.xxx.xxx:8086']" (type string). If this does not look like what you expect, quote the entire value to ensure it does not change.

Looks nasty ...

 

The Playbook I'm using:

  # setup the InfluxDB output plugin
  - name: Update telegraf.conf InfluxDB settings
    ini_file:
      path: "/etc/telegraf/telegraf.conf"
      section: "{{ item.section }}"
      option: "{{ item.option }}"
      value: "{{ item.value }}"
      state: "{{ item.state }}"
    loop:
      - { section: "[outputs.influxdb]", option: "urls", value: "{{ influxdb_url }}", state: present }
    notify:
      - restart telegraf

The Task is a bit longer than that, but for this purpose the above example is enough. Note that even though the "ini_file" plugin understands "sections", you have to specify an extra set of square backets here, because the Telegraf config is using "[[...]]" instead of "[...]":

# Configuration for sending metrics to InfluxDB
[[outputs.influxdb]]

The InfluxDB urls are supposed to be a list:

urls = ["http://192.168.0.1:8086", "http://192.168.0.3:8086", "http://192.168.0.3:8086"]

If you store that list in an Ansible variable, Ansible (or more exactly: the YAML parser) complains that it recognized a list and converts that into what it thinks is the right data type. But in this case that's neither nesessary nor what I want. There are two ways to work around that problem:

The config approach

The Ansible configuration file (ansible.cfg) knows a variable "string_conversion_action". Since Ansible 2.8 this is set to "warn", and apparently will change to "error" in 2.12. If this is set to "ignore", the problem goes away.

However that is quite a brutal approach: this applies to all Playbooks. There might be valid use cases which will be hidden if that setting is changed to "ignore".

The string approach

After testing around for a while I found that the YAML parser only complains (and converts) if the string starts with a "[". And Telegraf doesn't care how many spaces are after the "=". The easy solution is:

influxdb_url: ' ["http://192.168.xxx.xxx:8086"]'

Note there is a space at the beginning of the string. This makes the YAML parser happy, and no longer converts the string into an Ansible list. As a result the "/etc/telegraf/telegraf.conf" looks like:

[[outputs.influxdb]]
urls =  ["http://192.168.xxx.xxx:8086"]

 

Trackbacks

No Trackbacks

Comments

Display comments as Linear | Threaded

No comments

Add Comment

Enclosing asterisks marks text as bold (*word*), underscore are made via _word_.
E-Mail addresses will not be displayed and will only be used for E-Mail notifications.
To leave a comment you must approve it via e-mail, which will be sent to your address after submission.
Form options