Ansible - 在剧本执行过程中更新env变量

Ansible - 在剧本执行过程中更新env变量

问题描述:

我想在主持人剧本执行期间更新主机上的环境变量(本地执行本剧本),因此其余任务可以使用env变量的更新值,但似乎这是不可能的。Ansible - 在剧本执行过程中更新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_beforeenv_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加载仅在剧本开始ENV变量,并保持这些值,直到结束。看起来,这些可靠的任务并没有更新/采购相应的bash conf文件。所以我无法找到一种方法来更新ENV变量,其新值将在以下任务中可用。

这可能工作的唯一方法是在下一个任务中定义环境:关键字,但我想避免这种情况。这个新值将被许多任务使用,所以我正在寻找一种在剧本执行过程中更新其值的方法。

+0

为什么你在这里使用环境变量而不是事实?一般来说,您不能在运行时更改linux中正在运行的进程的环境。 –

+0

@KonstantinSuvorov我正在使用和修改环境变量,因为更新后的下一个任务正在使用linux环境变量变量来执行它。但我不想使用每个任务的环境关键字,所以我正在寻找替代方案。 – PyTzatzi

改变提交给任务的环境的唯一方法是在任务或播放中使用environment关键字。如果你正在使用shell:任务,你可以明确地获得你的~/.bashrc等,但这不是很漂亮。

如果您将您的剧本分成多个剧本,并在您获得其价值后在剧本中设置了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 }}" 

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

+0

谢谢。这是一个很好的建议和解决方法。不是我想要的,但我会研究它。 〜/ .bashrc的采购实际上会更新这个任务的env变量吗?下一个任务(如果不使用source〜/ .bashrc)将会有“旧”一个,对吧? – PyTzatzi

+0

那么,采购'〜/ .bashrc'会做bash中的一个点文件通常会做的事情:它会运行脚本。如果你设置'FOO = bar',它会将shell变量'FOO'设置为'bar'。如果你'输出FOO',它将使得该变量在当前环境和任何子进程的环境中可用*由相同的脚本*启动。 – larsks