如何从 Ansible playbook 获取文件?

问题描述 投票:0回答:2

我在 /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 ?

ansible environment-variables ansible-2.x ansible-facts
2个回答
3
投票

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"

在plays中定义环境变量:

或者,您可以使用

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 任务中访问某些变量,则可以使用常规 Ansible variables 来代替。有很多选项,其中包括 - 从 .yaml 文件读取变量


0
投票

我已经成功使用

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 }}"
© www.soinside.com 2019 - 2024. All rights reserved.