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

2024-10-12 10:28:00
admin
原创
258
摘要:问题描述:你好,我正在尝试找出如何使用 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
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2577  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1553  
  IPD(Integrated Product Development)流程作为一种先进的产品开发管理模式,在众多企业中得到了广泛应用。其中,技术评审与决策评审是IPD流程中至关重要的环节,它们既有明显的区别,又存在紧密的协同关系。深入理解这两者的区别与协同,对于企业有效实施IPD流程,提升产品开发效率与质量具有重要意义...
IPD管理流程   26  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、ClickUp、Freshdesk、GanttPRO、Planview、Smartsheet、Asana、Nifty、HubPlanner、Teamwork。在当今快速变化的商业环境中,项目管理软件已成为企业提升效率、优化资源分配和确保项目按时交付的关键工具。然而...
项目管理系统   21  
  建设工程项目质量关乎社会公众的生命财产安全,也影响着企业的声誉和可持续发展。高质量的建设工程不仅能为使用者提供舒适、安全的环境,还能提升城市形象,推动经济的健康发展。在实际的项目操作中,诸多因素会对工程质量产生影响,从规划设计到施工建设,再到后期的验收维护,每一个环节都至关重要。因此,探寻并运用有效的方法来提升建设工程...
工程项目管理制度   18  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用