Can lineinfile take variable as parameters?

I tried to change one line in a file with lineinfile command, but it looks like this command does not resolve variables. See my playbook snippet below

#in my playbook, {{ kibana_doc_root }}, {{ kibana_version }}, {{kibana_config_file}}, {{elasticsearch_URL}}, {{ elasticsearch_port }} have been defined

The following snippet can successfully change the file content in config.js, but {{elasticsearch_URL}} is not resolved (i.e. the line shows {{elasticsearch_URL}} as is):

----- Snippet 1 -------------

  • name: debug variables
    debug: msg=" variable concatication = {{ kibana_doc_root }}/{{ kibana_version }}/{{kibana_config_file}}"

  • name: Replace the URI of the ElasticSearch service in config.js on Kibana server
    lineinfile:
    dest=/var/www/kibana/kibana-3.0.0milestone4/config.js
    regexp=“(elasticsearch.* "http.*)$”
    state=present
    line="elasticsearch’:’ " {{ elasticsearch_URL }}:{{ elasticsearch_port }} " "

A quick question or to – what version of Ansible are you trying this on?

In your ansible.cfg, is this perhaps an upgrade that does not have “fail on undefined variables” turned on?

Most people have this on now, but not all. It’s the default if you don’t have an ansible.cfg and your version is new enough.

A quick question or to – what version of Ansible are you trying this on?

ansible 1.5.4

In your ansible.cfg, is this perhaps an upgrade that does not have “fail on undefined variables” turned on?

The my ansible.cfg file within my project has one line like this:

error_on_undefined_vars = False

Should I change it to True?

A quick question or to – what version of Ansible are you trying this on?

In your ansible.cfg, is this perhaps an upgrade that does not have “fail on undefined variables” turned on?

Most people have this on now, but not all. It’s the default if you don’t have an ansible.cfg and your version is new enough.

BTW, I have tested that the variables have been defined.

Here is my playbook:

  • name: debug variables
    debug: msg=" variable concatication = {{ kibana_doc_root }}/{{ kibana_version }}/{{ kibana_config_file }}"

Here is the corresponding output:

TASK: [kibana | debug variables] **********************************************

ok: [kibana] => {

“item”: “”,

“msg”: " variable concatication = /var/www/kibana/kibana-3.0.0milestone4/config.js"

}

Hi all,

Just FYI in case that other folks may find this helpful later.

I took Michael’s hint, and changed the error_on_undefined_vars from False to True, which basically returns an explicit error if there exists a missing variable, as follow.

myproject_foler/.ansible.cfg

#error_on_undefined_vars = False

error_on_undefined_vars = True

And I found that the original error was caused by one missing variable in the lineinfile command, {{ elasticsearch_URL }}. Once I add those variables in my vars file, everything start working :slight_smile:

In short, lineinfile does take varaiables and it works perfectly

My only slight complaint is that the error message was not as related to the root cause as it could be.

Thanks to Michael.

Good deal!

BTW, please don’t run 1.5.4.

The current ansible is 1.6.7, and contains security fixes which you should apply.