Ansible - 在playbook执行期间更新env变量

时间:2017-09-14 13:28:21

标签: bash ansible environment-variables

我想在ansible playbook执行期间更新主机上的环境变量(这个playbook在本地执行),所以剩下的任务可以使用env变量的更新值,但似乎这是不可能的。

让我举一个例子来说明我想要完成的事情:

# Environment variable before changing
- set_fact: env_before="{{ lookup('env', 'ENV_VAR') }}"

# A task that updates the env variable, I tried to make the needed configuration
# into ~/.bashrc, ~/.bash_profile, ~/.profile, /etc/environment

# Environment variable after changing
- set_fact: env_after="{{ lookup('env', 'ENV_VAR') }}"

# Unfortunately env_after = env_before

如果我重新执行剧本,但这次没有更改env变量, env_before env_after 将具有env变量的更新值即可。

示例:

- 1st Execution:
 - env_before = ENV_VAR = 10
 - update_ENV_VAR to 20 and update ~/.bashrc, ~/.bash_profile, ~/.profile, /etc/environment files
   with export ENV_VAR=20 etc.
 - env_after = ENV_VAR = 20

- 2nd Execution (Do not make any changes just skip the update_ENV_var step
 - env_before = ENV_VAR = 20 (new value from previous execution)

据我所知,ansible仅在playbook的开头加载env变量,并将这些值保持到最后。并且似乎ansible任务没有更新/获取相应的bash conf文件。所以我找不到更新ENV变量的方法,它的新值将在以下任务中可用。

这可行的唯一方法是在下一个任务中定义 environment:关键字,但我想避免这种情况。这个新值将被许多任务使用,所以我正在寻找一种在playbook执行期间更新其值的方法。

1 个答案:

答案 0 :(得分:0)

更改呈现给任务的环境的唯一方法是在任务或游戏中使用environment关键字。如果您使用的是shell:个任务,则可以明确地找到~/.bashrc等,但这并不是非常漂亮。

如果您将Playbook分成多个播放,并在您获得其值后在播放中设置environment键,该怎么办?像这样:

- hosts: localhost
  tasks:
    - set_fact:
        myvar: "some value"

- hosts: localhost
  environment:
    MYVAR: "{{ myvar }}"
  tasks:
    - shell: "echo $MYVAR"
      register: res

    - debug:
        msg: "MYVAR = {{ res.stdout }}"

这将修改第二场比赛中所有任务的环境。