Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash Ansible-在playbook执行期间更新环境变量_Bash_Ansible_Environment Variables - Fatal编程技术网

Bash Ansible-在playbook执行期间更新环境变量

Bash Ansible-在playbook执行期间更新环境变量,bash,ansible,environment-variables,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 ma

我想在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变量,则之前的env_之后的env_将具有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变量,并将这些值保留到结尾。而且ansible任务似乎没有更新/获取相应的bash conf文件。因此,我无法找到一种方法来更新ENV变量,该变量的新值将在下面的任务中可用


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

更改呈现给任务的环境的唯一方法是在任务或游戏中使用
环境
关键字。如果您使用的是
shell:
任务,则可以显式地为
~/.bashrc
等任务提供源代码,但这并不十分美观

如果将剧本拆分为多个剧本,并在导出剧本的值后在剧本上设置
环境
键,该怎么办?大概是这样的:

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

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

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

这将修改第二个重头戏中所有任务的环境。

为什么在这里使用环境变量而不是事实?通常,您不能在运行时更改linux中正在运行的进程的环境。@KonstantinSuvorov我正在使用和修改环境变量,因为更新后的下一个任务将使用linux环境变量执行。但我不想在每个任务中使用环境关键字,所以我正在寻找替代方法。谢谢。这是一个很好的建议和解决办法。不是我想要的,但我会调查的。源代码~/.bashrc实际上会更新此任务的环境变量吗?下一个任务(如果没有使用source ~/.bashrc)将有一个“旧”任务,对吗?好的,sourcing
~/.bashrc
将执行bash中的dotfile通常执行的操作:它将运行脚本。如果您正在设置
FOO=bar
,它会将shell变量
FOO
设置为
bar
。如果您
export FOO
,它将使该变量在当前环境和由同一脚本启动的任何子进程的环境中可用。