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

How to set Linux environment variables with Ansible

您好,我正在尝试了解如何使用 Ansible 设置环境变量。

像这样的简单 shell 命令:

EXPORT LC_ALL=C

尝试使用 shell 命令但出现错误 尝试使用环境模块但没有任何反应。

我错过了什么

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

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

毕竟在ex中设置环境变量。 Ubuntu 你可以只使用 Ansible 中的 lineinfile 模块并将所需的行添加到特定文件。请查阅您的 OS 文档以了解将其添加到何处以使其永久化。

我没有足够的声誉来发表评论,因此我添加了一个新答案。
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";

如果我们将所有这些任务都放在同一个剧本中,这将无法工作

要持续设置环境变量,您可以使用 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

这是一个在 /etc/environment 上永久设置 key/values 的快速本地任务(在系统范围内,所有用户):

- 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

而且,是的,如果您退出并重新登录,env 会显示新的环境变量。

p.s。它曾经是 dest 如:

    dest: "/etc/environment"

但看到评论

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

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

您还可以使用自定义设置环境 become plugin

主机设置

ansible_become=yes
ansible_become_method=foo

become_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