Ansible - Environment variable

0I have the env file which is present in target machine and it contain certain number of variables with export command(the export command itself was present inside the file).

export AB_HOME=/et/dev/abinitio/abinitio-V3
export PATH=${AB_HOME}/bin:${PATH}

I have executed the env file using the below playbook and I tried to read the variables which are exported using the output1 which is a register variable in my playbook. But I am able to see my register variable is empty. Is there any way to get the variables which are all exported. I don’t know the variables name which are present inside the file, So I am not able to use the ECHO command as well.

- hosts: dev
  gather_facts: false
  tasks:   
    - name: get the environment variables
      shell: "su <id> & . ./.env"
      args:
        chdir: /path to the file
      register: output1

    - debug: var=output1.stdout_lines 

Hi

Could you please tell clearly:

- What you are trying to achieve.
- How you are doing this.
- What problems you encounter.
- Which command did you run, and what output did you get from that
(copied as text, not as images/attachments/screenshots)
- What the relevant tasks/playbooks/code/variables look like

Hi, Thank you for your response,

I have a command to check the status of abinitio service in target machines. But, the status command will only work if the env file is executed.

The env file contain some environment variables like below. The variables numbers and value will change for one target machine to another.

export AB_HOME=/et/dev/abinitio/abinitio-V3
export PATH=${AB_HOME}/bin:${PATH}

I tried to execute the env file present in the target machine by sourcing the env file and I tried to register the output to get what are all the variables present in the file in-order to use them in my next task, which is to check the status. But, I am able to see my register variable is empty. I just want to execute the environment file and to run the status command with that executed environment. Below is the playbook I have used,

- hosts: dev
  gather_facts: false
  tasks:   
    - name: get the environment variables
      shell: "su <id> & . ./.env" #this command is to execute the env file and store the result
      args:
        chdir: /path to the file
      register: output1 #for storing exported variables.

    - debug: var=output1.stdout_lines  #print exported variables (Here I am not getting anything the stdout is empty)

Hi

Could you please tell clearly:

  • What you are trying to achieve.
  • How you are doing this.
  • What problems you encounter.
  • Which command did you run, and what output did you get from that
    (copied as text, not as images/attachments/screenshots)
  • What the relevant tasks/playbooks/code/variables look like

0I have the env file which is present in target machine and it contain certain number of variables with export command(the export command itself was present inside the file).

export AB_HOME=/et/dev/abinitio/abinitio-V3
export PATH=${AB_HOME}/bin:${PATH}

I have executed the env file using the below playbook and I tried to read the variables which are exported using the output1 which is a register variable in my playbook. But I am able to see my register variable is empty. Is there any way to get the variables which are all exported. I don’t know the variables name which are present inside the file, So I am not able to use the ECHO command as well.

  • hosts: dev
    gather_facts: false
    tasks:

  • name: get the environment variables
    shell: “su & . ./.env”
    args:
    chdir: /path to the file
    register: output1

  • debug: var=output1.stdout_lines

  • name: check status
    shell: “su & ” #command to check status
    environment: “{{output1.stdout_lines}}” #setting the environment in which th above status command need to run
    register: output2

  • debug: var=output2.stdout_lines

Hi

You could fetch the .env file, parse it, and then use that as
environment vars for a subsequent shell/command.
It's not the cleanest method and probably fragile.

There is another problem, the shell and command module will execute a
single command.
What you have is two command, the first one being "su".
Instead you should either connect as the user you want to run the
command as, or you should use proper privilege escalation.
Read https://docs.ansible.com/ansible/latest/user_guide/become.html#understanding-privilege-escalation-become
for that.
If "<id>" is different that the user you connect as, but it's not a
privileged user, you will run into issues, so for that read:
https://docs.ansible.com/ansible/latest/user_guide/become.html#risks-of-becoming-an-unprivileged-user

Having said all of that, this should do the trick:

Thanks much for your reply, I think this is what the solution I need. But there are two things which I am not able get. I am new to ansible, kindly answer those question even though it was silly. whether the variables which are being used in setfact need to be set before using that in setfact, if so how to do that. And the 2nd question is

  • set_fact:

my_env: “{{ envs|default({}) | combine( { item.split(‘=’)[0]:
item.split(‘=’)[1] } ) }}”
loop: “{{ dotenv_pairs.split() }}”

in the above task what is envs and what is the roll of envs|default({})

Thanks much for your reply, I think this is what the solution I need. But there are two things which I am not able get. I am new to ansible, kindly answer those question even though it was silly. whether the variables which are being used in setfact need to be set before using that in setfact, if so how to do that.

I have no idea what you mean. In any case, the playbook just works, so
do some trial and error yourself if you want to see if things are
needed or not.

And the 2nd question is

- set_fact:
      my_env: "{{ envs|default({}) | combine( { item.split('=')[0]:
item.split('=')[1] } ) }}"
    loop: "{{ dotenv_pairs.split() }}"

in the above task what is envs and what is the roll of envs|default({})

That was a typo, the set_fact tasks should read:

  - set_fact:
      dotenv_pairs: "{{ dotenv.content | b64decode |
regex_replace('export\\s+', '') }}"

  - set_fact:
      my_env: "{{ my_env|default({}) | combine( { item.split('=')[0]:
item.split('=')[1] } ) }}"
    loop: "{{ dotenv_pairs.split() }}"

Now I am able to set the environment using the playbook you have sent. But I Have one more problem in this. The file that I have contains variables like below. As we are reading the file and setting the environment, the values are not passing correctly, Is there any workaround for that?

Variables present in the file,

export AB_AIR_ROOT=//devetl1/et/devctl/ee/rep/dev

export DEV_AIR_ROOT=${AB_AIR_ROOT}

after running the playbook, I tried to echo $DEV_AIR_ROOT, But I am getting output as ${AB_AIR_ROOT} instead of getting //devetl1/et/devctl/ee/rep/dev

Not really, this is what I meant with that the solution is fragile.

Is there any other way to do this?