Ansible - 在 playbook 执行过程中更新环境变量

4
我希望在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

如果我重新执行playbook,但这次不更改环境变量,则env_beforeenv_after将具有更新的环境变量值
示例:
- 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启动时加载环境变量,并保留这些值直到结束。看起来ansible任务没有更新/获取相应的bash配置文件。因此,我无法找到一种方法来更新一个ENV变量,使其新值可用于以下任务。
唯一可能的方法是在接下来的任务中定义“environment:”关键字,但我想避免这样做。这个新值将被许多任务使用,所以我正在寻找一种在playbook执行期间更新其值的方法。

为什么在这里使用环境变量而不是事实?一般来说,在Linux中无法在运行时更改正在运行的进程的环境。 - Konstantin Suvorov
@KonstantinSuvorov 我正在使用和修改环境变量,因为在更新之后,下一个任务需要使用Linux环境变量来执行。但我不想每个任务都使用环境关键字,所以我正在寻找替代方案。 - PyTzatzi
1个回答

2
唯一改变任务所呈现环境的方法是在任务或播放上使用“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 }}"

这将修改第二次播放中所有任务的环境。

谢谢。那是一个好的建议和解决方法。虽然不完全是我想要的,但我会研究一下。使用source ~/.bashrc命令会更新此任务的环境变量吗?如果下一个任务没有使用source ~/.bashrc命令,它将使用“旧”的环境变量,对吗? - PyTzatzi
好的,引用~/.bashrc将会执行在bash中通常执行的点文件。如果你设置了FOO=bar,它将会把shell变量FOO设置为bar。如果你导出FOO,它将会使该变量在当前环境和由相同脚本启动的任何子进程的环境中可用。 - larsks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接