Kaguei Nakueka
Kaguei Nakueka

Reputation: 1128

Why can't I capture an environment variable with Ansible?

I am trying to get and print the value of a given environment variable (ENV_VAR):

$ cat ~/.bash_profile
ENV_VAR=Updated
ENV_VAR2=Updated
$ source ~/.bash_profile && echo $ENV_VAR
Updated

I can successfully retrieve it via terminal, however by using the Ansible playbook below I get an error:

# YAML
---

- hosts: all

  vars:
    env_var: "{{ lookup('env','ENV_VAR') }}"

  tasks:

    - name: Add/Update an environment variable to the remote user's shell
      lineinfile:
        dest: ~/.bash_profile
        regexp: '^ENV_VAR='
        line: "ENV_VAR=Updated2"

    - name: Get the value of the environment variable we just added
      shell: source ~/.bash_profile && echo $ENV_VAR
      register: env_var_updated

    - name: Print the value of the environment variable
      debug:
        msg: "var1: {{ env_var }} - var2 {{ env_var_updated.stdout }}"
Executing:
    $ ansible-playbook playbook.yml


PLAY [all] *********************************************************************************************************

TASK [Gathering Facts] *********************************************************************************************
ok: [192.168.0.222]

TASK [Add/Update an environment variable to the remote user's shell] ***********************************************
ok: [192.168.0.222]

TASK [Get the value of the environment variable we just added] *****************************************************
fatal: [192.168.0.222]: FAILED! => {"changed": true, "cmd": "source ~/.bash_profile && echo $ENV_VAR", "delta": "0:00:00.002337", "end": "2020-12-02 10:20:21.963968", "msg": "non-zero return code", "rc": 127, "start": "2020-12-02 10:20:21.961631", "stderr": "/bin/sh: 1: source: not found", "stderr_lines": ["/bin/sh: 1: source: not found"], "stdout": "", "stdout_lines": []}

PLAY RECAP *********************************************************************************************************
192.168.0.222              : ok=2    changed=0    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0   
    

Results after execution:

$ cat ~/.bash_profile
ENV_VAR=Updated2
ENV_VAR2=Updated
$ source ~/.bash_profile && echo $ENV_VAR
Updated2

I am logged as the same user (In the terminal window and SSH for Ansible)

Upvotes: 2

Views: 1312

Answers (1)

Raman Sailopal
Raman Sailopal

Reputation: 12887

As shown by the following guide:

https://docs.ansible.com/ansible/2.5/modules/shell_module.html

Ansible shell actually runs in /bin/sh and not /bin/bash. You can specify the shell as /bin/bash through:

- name: Get the value of the environment variable we just added
  shell: source ~/.bash_profile && echo $ENV_VAR
  register: env_var_updated
  args:
  executable: /bin/bash

Upvotes: 3

Related Questions