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

2024-10-12 10:28:00
admin
原创
110
摘要:问题描述:你好,我正在尝试找出如何使用 Ansible 设置环境变量。像这样的一个简单的 shell 命令:EXPORT LC_ALL=C 尝试作为 shell 命令并出现错误,尝试使用环境模块但什么也没有发生。我错过了什么解决方案 1:有多种方法可以做到这一点,但从您的问题来看并不清楚您需要什么。1. 如果...

问题描述:

你好,我正在尝试找出如何使用 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 中设置环境变量时,您只需使用lineinfileAnsible 中的模块并将所需的行添加到某个文件即可。查阅您的操作系统文档以了解将其添加到何处以使其永久生效。

解决方案 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 的插件ansibleFish要安装插件,我想使用我在 中的上一个任务中设置的 $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"

解决方案

  1. 添加一行声明 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
  1. 然后,使用该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
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   681  
  在项目管理领域,集成产品开发(IPD)流程以其高效、协同的特点,被众多企业视为提升产品竞争力的关键。IPD流程强调跨部门、跨职能的紧密合作,以确保产品从概念到市场各个环节的无缝衔接。然而,实现这一目标并非易事,它需要企业深刻理解并掌握IPD流程中的跨部门协作艺术。本文将深入探讨IPD流程中跨部门协作的三个关键点,旨在为...
IPD项目管理咨询   9  
  掌握IPD流程图:提升团队协作的关键路径在当今快速变化的商业环境中,团队协作的效率与效果直接关系到项目的成功与否。集成产品开发(Integrated Product Development,简称IPD)作为一种先进的研发管理理念,通过跨部门、跨领域的协同工作,能够显著提升产品开发的速度与质量。而IPD流程图,则是这一理...
IPD流程阶段   9  
  IPD流程概述:理解其核心价值与实施背景集成产品开发(Integrated Product Development,简称IPD)是一种先进的产品开发管理理念,它强调跨部门协作、市场导向和快速响应变化的能力。IPD流程不仅关注产品本身的技术创新,更注重将市场、研发、生产、销售等各个环节紧密集成,以实现产品从概念到市场的高...
华为IPD是什么   7  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程以其跨部门协作、高效决策和快速响应市场变化的特点,被众多企业视为提升竞争力的关键。然而,实践IPD流程并非易事,项目管理中的种种错误往往阻碍了其效果的充分发挥。本文旨在深入探讨如何在实施IPD流程时避免这些常见错误,...
IPD框架   7  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用