我在 /etc/profile 中添加了一些环境变量,并且能够成功地做到这一点。现在我想从 ansible 脚本获取 /etc/profile ,以便在当前 shell 中设置环境变量。我可以通过手动执行此操作:
source /etc/profile
. /etc/profile
我尝试过以下方法。该脚本正在运行,但出现任何错误,但当前 shell 中未设置环境变量。我的目的是尽可能避免手动步骤。
# - name: Execute the command in remote shell; stdout goes to the specified file on the remote
# #sudo: no
# command: . /etc/profile
#ansible.builtin.shell: configuration/files/source.sh
# - name: source bashrc
# ansible.builtin.shell: "source /etc/profile"
- name: Get the value of the environment variable we just added
#sudo: no
shell: '/bin/bash -i -c "source /etc/profile"'
# become-user: {your_remote_user}
# args:
# executable: /bin/sh
# - name: Add another bin dir to system-wide $PATH.
# copy:
# src: env_vars.sh
# dest: /etc/profile
# #content: 'HADOOP_HOME=/opt/spark/hadoop-3.1.1'
我正在使用 ansible-core 2.12 。有没有办法我们可以从 ansible 本身获取 /etc/profile ?
source
模块中使用 ansible.builtin.shell
:正如用户 @β.εηοιτ.βε 提到的 - 您想要访问环境的每个
ansible.built.shell
任务的命令参数必须以 source /etc/profile && ...
开头。
我相信此方法不能用于与
ansible.builtin.shell
不同类型的任务。
就我而言,我需要使用
sh
参数将 /bin/bash
更改为 executable
。如果您在主机(脚本的目标机器)上使用除 /bin/bash
之外的其他 shell,则可以使用 echo $SHELL
找到其路径。
所以最终结果应该是这样的:
- name: Source a file and run my command foo
ansible.builtin.shell:
executable: /bin/bash
cmd: "source /etc/profile && foo"
environment
关键字为游戏、区块或任务定义单独的环境变量。
任务示例:
- name: Run the command foo
ansible.builtin.shell:
cmd: "foo"
environment:
NVM_DIR: /var/local/nvm
PATH: /var/local/nvm/versions/node/v4.2.1/bin:{{ ansible_env.PATH }}
如果您只需要在 Ansible 任务中访问某些变量,则可以使用常规 Ansible variables 来代替。有很多选项,其中包括 - 从 .yaml 文件读取变量。
我已经成功使用
local_action
,然后回显并注册一个变量,如下所示:
- name: Source file locally to register variable
local_action: shell . /path/to/file && echo $VAR_OF_INTEREST
register: result
- name: Show variable
ansible.builtin.debug:
msg: "VAR_OF_INTEREST is {{ result.stdout }}"