Drux
Drux

Reputation: 12660

Ansible module lineinfile with variable path

I need to use the Ansible lineinfile module in such a way that it operates on a variable path. (This is for Ansible 2.5.2.) In this example the filename should depend on the version of PostgreSQL that is actually installed on a remote host (instead of a hardwired version 9.6):

- lineinfile:
    path: /etc/postgresql/9.6/main/postgresql.conf
    regexp: '^#?\s*log_connections\s*='
    line: 'log_connections = on'
    state: present

In bash I would use e.g. this expression for obtaining the version and the path:

/etc/postgresq/$(pg_lsclusters -h | awk '{print $1}' | head -n 1)/main/postgresql.conf 

It apparently does not work verbatim as parameter path to Ansible's lineinfile module:

FAILED! => {"changed": false, "msg": "Destination /etc/postgresq/$(pg_lsclusters -h | awk '{print $1}' | head -n 1)/main/postgresql.conf does not exist !", "rc": 257}

So my question is this: How can I form a variable path with Ansible in this use case?

Upvotes: 1

Views: 1603

Answers (1)

Drux
Drux

Reputation: 12660

This seems to work fine:

- name: Got it!
  command: bash -c "pg_lsclusters -h | awk '{print $1; exit}'" 
  register: version
- set_fact: version='{{version.stdout}}'
- lineinfile:
    path: "/etc/postgresql/{{version}}/main/postgresql.conf"
    regexp: '^#?\s*log_connections\s*='
    line: 'log_connections = on'
    state: present

Upvotes: 2

Related Questions