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

2024-10-12 10:28:00
admin
原创
88
摘要:问题描述:你好,我正在尝试找出如何使用 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
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用