如何设置 Linux 环境变量与安赛尔

你好,我想知道如何与安塞尔设置环境变量。

一个简单的 shell 命令如下:

EXPORT LC_ALL=C

尝试使用 shell 命令,得到一个错误 尝试使用环境模块,但什么也没有发生。

我错过了什么

233411 次浏览

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

如果你只需要为每个任务定义环境变量,你可以这样做:

- 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也将可能在 游戏规则上,而不仅仅是上面的任务级别。 目前在安赛尔的 GitHub 上有一个关于这个特性的拉请求: < a href = “ https://GitHub.com/anable/anable/pull/8651”> 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 你只需要使用 Ansible 的 lineinfile模块,然后在某个文件中添加你想要的代码行。请咨询您的操作系统文档,以了解在哪里添加它以使其永久化。

我没有足够的声誉来评论,因此我增加了一个新的答案。
Gasek 的回答非常正确。只有一件事: 如果您正在更新 .bash_profile文件或 /etc/profile,那么这些更改只有在您重新登录之后才会反映出来。 如果您想设置 env 变量,然后在同一剧本的后续任务中使用它,可以考虑在 .bashrc文件中添加这些环境变量。
我想这背后的原因是登录和非登录 shell。
在执行不同的任务时,可以从 .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";

这将工作 ,< em > ,但是如果我使用配置文件这样做,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";

如果我们把所有这些任务都放在同一个剧本中,这个方法就不会起作用。

对于持久地设置环境变量,您可以使用安塞尔银河现有的角色之一。

使用安塞尔星系:

$ ansible-galaxy install weareinteractive.environment

返回文章页面使用要求译者:

- src: franklinkim.environment

然后在你的剧本里:

- hosts: all
sudo: yes
roles:
- role: franklinkim.environment
environment_config:
NODE_ENV: staging
DATABASE_NAME: staging

下面是一个在 /etc/environment上永久设置键/值的快速本地任务(系统范围内的所有用户) :

- name: populate /etc/environment
lineinfile:




path: "/etc/environment"


state: present
regexp: "^\{\{ item.key }}="
line: "\{\{ item.key }}=\{\{ item.value}}"
with_items: "\{\{ os_environment }}"

以及它的变种人:

os_environment:
- key: DJANGO_SETTINGS_MODULE
value : websec.prod_settings
- key: DJANGO_SUPER_USER
value : admin

而且,是的,如果您 ssh 出来并返回,env显示新的环境变量。

另外,以前是 dest的意思是:

    dest: "/etc/environment"

但请看评论

仅用于任务: 内联工程,有时候吧

ーーーーーーー

注意: 下面的内容更多的是一个观察/实验,而不是一个建议。 ーーーーーーー

第一个任务相当于迈克尔得票最多的答案。

第二种方法不起作用,但是 foo=1 echo $foo在 bash 中也不起作用(我怀疑这是因为 echo是内置的)。

第三个 确实有用与 bash 一样,只需要很少的工作量。当我尝试对 设置节点变量做这个操作时,它失败了,直到我使用了迈克尔的答案。

  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

这是最好的选择。正如 Michal Gasek (第一个回答)所说,由于拉请求被合并(https://github.com/ansible/ansible/pull/8651) , 我们可以根据游戏水平轻松设置 永久性环境变量永久性环境变量

- hosts: all
roles:
- php
- nginx
environment:
MY_ENV_VARIABLE: whatever_value

您还可以使用自定义 成为插件设置 env

主机设置

ansible_become=yes
ansible_become_method=foo

成为 _ plugins/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

我正在使用 ansibleFish shell 安装 krew插件管理器和它的一些插件。为了安装这些插件,我希望使用由我在 /.config/fish/config.fish中的上一个任务设置的 $PATH 值。

错误

使用 shell模块和 executable参数投掷:

stderr: |-
error: unknown command "krew" for "kubectl"
error: unknown command "krew" for "kubectl"
error: unknown command "krew" for "kubectl"

解决方案

  1. /.config/fish/config.fish中添加一行,声明到 krew bin 的路径

    - name: Add krew to $PATH
    lineinfile:
    path: '\{\{ home }}/.config/fish/config.fish'
    search_string: krew
    line: set --append --export --global PATH $HOME/.krew/bin
    
  2. 然后,使用 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
    

免责声明

看起来有点像黑客,想要更多可行的解决方案。