如何使用 Ansible 设置 Linux 环境变量

新手上路,请多包涵

您好我正在尝试了解如何使用 Ansible 设置环境变量。

像这样一个简单的 shell 命令:

 EXPORT LC_ALL=C

尝试作为 shell 命令并尝试使用环境模块时出错,但没有任何反应。

我错过了什么

原文由 Gleeb 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.6k
2 个回答

有多种方法可以做到这一点,从你的问题来看,你还不清楚你需要什么。

1. 如果您只需要为每个任务定义环境变量,请执行以下操作:

>  - hosts: dev
>   tasks:
>     - name: Echo my_env_var
>       shell: "echo $MY_ENV_VARIABLE"
>       environment:
>         MY_ENV_VARIABLE: whatever_value
>
>     - name: Echo my_env_var again
>       shell: "echo $MY_ENV_VARIABLE"
>
> ```

请注意, `MY_ENV_VARIABLE` 仅适用于第一个任务, `environment` 不会在您的系统上永久设置它。

TASK: [Echo my_env_var] ******************************************************* changed: [192.168.111.222] => {“changed”: true, “cmd”: “echo $MY_ENV_VARIABLE”, … “stdout”: “whatever_value”}

TASK: [Echo my_env_var again] ************************************************* changed: [192.168.111.222] => {“changed”: true, “cmd”: “echo $MY_ENV_VARIABLE”, … “stdout”: “”}

”`

希望很快使用 environment 也可以在 游戏级别 上使用,而不仅仅是上面的任务级别。目前在 Ansible 的 GitHub 上有一个针对此功能的拉取请求: https ://github.com/ansible/ansible/pull/8651

更新:它现在已于 2015 年 1 月 2 日合并。

2.如果您想要永久环境变量+系统范围/仅适用于某些用户

你应该看看你是如何在你的 Linux 发行版/shell 中做到这一点的,有很多地方可以做到这一点。例如,在 Ubuntu 中,您可以在文件中定义它,例如:

  • ~/.profile
  • /etc/environment
  • /etc/profile.d 目录

你会在这里找到关于它的 Ubuntu 文档: https ://help.ubuntu.com/community/EnvironmentVariables

毕竟在 ex 中设置环境变量。在 Ubuntu 中,您可以使用 Ansible 中的 lineinfile 模块并将所需的行添加到某个文件。请查阅您的操作系统文档以了解将其添加到何处以使其永久化。

原文由 Michal Gasek 发布,翻译遵循 CC BY-SA 3.0 许可协议

我没有足够的声誉发表评论,因此我添加了一个新答案。

Gasek 的回答非常正确。只有一件事:如果您要更新 .bash_profile 文件或 /etc/profile ,则这些更改仅在您进行新登录后才会反映出来。如果您想设置环境变量,然后在同一剧本的后续任务中使用它,请考虑在 .bashrc 文件中添加这些环境变量。

我猜这背后的原因是登录和非登录shell。

Ansible 在执行不同的任务时,从 .bashrc 文件而不是 .bash_profile/etc/profile 文件中读取参数。

例如,如果我更新我的路径变量以将自定义二进制文件包含在相应用户的 .bash_profile 文件中,然后执行文件的源。接下来的后续任务将无法识别我的命令。但是,如果您在 .bashrc 文件中更新,该命令将起作用。

  - name: Adding the path in the bashrc files
   lineinfile: dest=/root/.bashrc line='export PATH=$PATH:path-to-mysql/bin' insertafter='EOF' regexp='export PATH=\$PATH:path-to-mysql/bin' state=present

-  - name: Source the bashrc file
   shell: source /root/.bashrc

 - name: Start the mysql client
   shell: mysql -e "show databases";

这会起作用但如果我使用配置文件完成它, mysql -e "show databases" 会出错。

 - name: Adding the path in the Profile files
   lineinfile: dest=/root/.bash_profile line='export PATH=$PATH:{{install_path}}/{{mysql_folder_name}}/bin' insertafter='EOF' regexp='export PATH=\$PATH:{{install_path}}/{{mysql_folder_name}}/bin' state=present

 - name: Source the bash_profile file
   shell: source /root/.bash_profile

 - name: Start the mysql client
   shell: mysql -e "show databases";

_如果我们将所有这些任务都放在同一个剧本中_, 这个就行不通 了。

原文由 Gaurav Parashar 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏