如何使用 Ansible 设置 Linux 环境变量
- 2024-10-12 10:28:00
- admin 原创
- 110
问题描述:
你好,我正在尝试找出如何使用 Ansible 设置环境变量。
像这样的一个简单的 shell 命令:
EXPORT LC_ALL=C
尝试作为 shell 命令并出现错误,尝试使用环境模块但什么也没有发生。
我错过了什么
解决方案 1:
有多种方法可以做到这一点,但从您的问题来看并不清楚您需要什么。
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
毕竟,在 Ubuntu 中设置环境变量时,您只需使用lineinfile
Ansible 中的模块并将所需的行添加到某个文件即可。查阅您的操作系统文档以了解将其添加到何处以使其永久生效。
解决方案 2:
这是一个快速的本地任务,用于永久设置键/值/etc/environment
(这是系统范围的,所有用户,因此需要):
- name: populate /etc/environment
lineinfile:
path: "/etc/environment"
state: present
regexp: "^{{ item.key }}="
line: "{{ item.key }}={{ item.value}}"
with_items: "{{ os_environment }}"
become: yes
以及它的变量:
os_environment:
- key: DJANGO_SETTINGS_MODULE
value : websec.prod_settings
- key: DJANGO_SUPER_USER
value : admin
是的,如果您通过 ssh 退出并重新登录,env
则会显示新的环境变量。
ps 以前是dest
这样的:
dest: "/etc/environment"
但看到评论
仅针对任务:内联有时有效。
——————-
注意:下面的内容更多的是观察/实验,而不是建议。——————-
第一个任务相当于迈克尔获得最高票数的答案。
第二个不起作用,但foo=1 echo $foo
在 bash 中也不起作用(我怀疑这是因为echo
它是内置的)。
第三个确实有效,就像在 bash 中一样,而且几乎不需要费什么力气。 但是……当我尝试这样做来设置节点变量时,它失败了,直到我使用了 Michael 的答案。
tasks:
- name: Echo my_env_var
shell: "echo $MY_ENV_VARIABLE"
environment:
MY_ENV_VARIABLE: value1
- name: Echo my_env_var inline, doesnt work in bash either
shell: "MY_ENV_VARIABLE=value2 echo $MY_ENV_VARIABLE"
- name: set my_env_var inline then env
shell: "MY_ENV_VARIABLE=value3 env | egrep MY_ENV"
输出:
TASK [Echo my_env_var] *********************************************************
changed: [192.168.63.253] => changed=true
cmd: echo $MY_ENV_VARIABLE
stdout: value1
TASK [Echo my_env_var inline, doesnt work in bash either] **********************
changed: [192.168.63.253] => changed=true
cmd: MY_ENV_VARIABLE=value2 echo $MY_ENV_VARIABLE
stdout: ''
TASK [set my_env_var inline then env] ******************************************
changed: [192.168.63.253] => changed=true
cmd: MY_ENV_VARIABLE=value3 env | egrep MY_ENV
stdout: MY_ENV_VARIABLE=value3
解决方案 3:
我没有足够的声誉来发表评论,因此我添加了一个新答案。
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";
如果我们将所有这些任务都放在同一个剧本中,那么这个剧本就不会起作用。
解决方案 4:
这是最好的选择。正如 Michal Gasek(第一个答案)所说,由于合并了拉取请求(https://github.com/ansible/ansible/pull/8651),我们能够通过播放级别轻松设置永久环境变量。
- hosts: all
roles:
- php
- nginx
environment:
MY_ENV_VARIABLE: whatever_value
解决方案 5:
要永久设置环境变量,您可以使用 Ansible Galaxy 上的现有角色之一。我推荐weareinteractive.environment。
使用 ansible-galaxy:
$ ansible-galaxy install weareinteractive.environment
使用 requirements.yml:
- src: franklinkim.environment
然后在你的剧本中:
- hosts: all
sudo: yes
roles:
- role: franklinkim.environment
environment_config:
NODE_ENV: staging
DATABASE_NAME: staging
解决方案 6:
我正在安装krew
插件管理器及其一些用于 shell 的插件ansible
。Fish
要安装插件,我想使用我在 中的上一个任务中设置的 $PATH 值/.config/fish/config.fish
。
错误
使用带参数shell
的模块会引发:executable
stderr: |-
error: unknown command "krew" for "kubectl"
error: unknown command "krew" for "kubectl"
error: unknown command "krew" for "kubectl"
解决方案
添加一行声明 krew bin 的路径
/.config/fish/config.fish
- name: Add krew to $PATH
lineinfile:
path: '{{ home }}/.config/fish/config.fish'
search_string: krew
line: set --append --export --global PATH $HOME/.krew/bin
然后,使用该
shell
模块获取 Fish 配置文件并运行kubectl
命令来安装我的插件:
- name: Install `kubectx` (context) and `kudens` (namespace)
shell: |
source {{ home }}/.config/fish/config.fish
kubectl krew install ctx
kubectl krew install ns
kubectl krew install oidc-login
args:
executable: /usr/bin/fish
免责声明
对我来说,这看起来有点黑客风格,希望能有更多 ansible 风格的解决方案。
解决方案 7:
您还可以使用自定义的become 插件来设置环境
主机设置
ansible_become=yes
ansible_become_method=foo
成为_插件/foo.py
from ansible.plugins.become import BecomeBase
class BecomeModule(BecomeBase):
def build_become_command(self, cmd, shell):
cmd = 'PYTHONPATH="/foo/bar:$PYTHONPATH" ' + cmd
return cmd
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 项目管理必备:盘点2024年13款好用的项目管理软件