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

Gle*_*eeb 84 linux ansible

嗨,我试图找出如何使用Ansible设置环境变量.

像这样的简单shell命令的东西:

EXPORT LC_ALL=C
Run Code Online (Sandbox Code Playgroud)

尝试作为shell命令,并尝试使用环境模块,并没有发生任何事情.

我错过了什么

Mic*_*sek 134

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

1.如果您需要定义PER TASK ON的环境变量,请执行以下操作:

- 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"
Run Code Online (Sandbox Code Playgroud)

请注意,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": ""}
Run Code Online (Sandbox Code Playgroud)

希望很快就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你可以使用lineinfileAnsible中的模块并将所需的行添加到某个文件中.请查阅您的操作系统文档,了解将其添加到何处以使其永久化.

  • 那么无法通过Ansible设置持久环境变量? (8认同)
  • 第二种选择是我需要的.我自己也达成了解决方案,但就是那个. (5认同)
  • 快速更新:Ansible的拉请求#8651已合并,所以现在也可以在播放级别上执行此操作. (2认同)

gau*_*har 25

我没有足够的声誉来评论,因此我添加了一个新的答案.Gasek的回答是完全正确的.只有一件事,如果您要更新bash_profile文件或/ etc/profile,那么只有在您进行新登录后才会反映这些更改.如果您设置了env变量,然后想在同一个playbook中的后续任务中使用它.考虑在.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";
Run Code Online (Sandbox Code Playgroud)

这可以工作,但我完成使用配置文件.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";
Run Code Online (Sandbox Code Playgroud)

**如果我们在同一个剧本中完成所有这些任务,那么这个不会工作**

  • 如果默认 shell 是 sh,则源代码可能不起作用。而不是`源文件`做`。文件` (2认同)

Ate*_*ral 10

对于持久设置环境变量,您可以在Ansible Galaxy上使用现有角色之一.我推荐franklinkim.environment.

使用ansible-galaxy:

$ ansible-galaxy install franklinkim.environment
Run Code Online (Sandbox Code Playgroud)

使用requirements.yml:

- src: franklinkim.environment
Run Code Online (Sandbox Code Playgroud)

然后在你的剧本中:

- hosts: all
  sudo: yes
  roles:
    - role: franklinkim.environment
      environment_config:
        NODE_ENV: staging
        DATABASE_NAME: staging
Run Code Online (Sandbox Code Playgroud)


小智 8

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

- hosts: all
  roles:
     - php
     - nginx
  environment:
    MY_ENV_VARIABLE: whatever_value
Run Code Online (Sandbox Code Playgroud)

  • 是在角色之前运行的环境吗?因为我的查找仍然是空的。 (2认同)

JL *_*ret 6

这是一项快速的本地任务,用于永久设置键/值/etc/environment(在系统范围内,所有用户):

- name: populate /etc/environment
  lineinfile:
    dest: "/etc/environment"
    state: present
    regexp: "^{{ item.key }}"
    line: "{{ item.key }}={{ item.value}}"
  with_items: "{{ os_environment }}"
Run Code Online (Sandbox Code Playgroud)

和它的变量:

os_environment:
  - key: DJANGO_SETTINGS_MODULE 
    value : websec.prod_settings  
  - key: DJANGO_SUPER_USER 
    value : admin
Run Code Online (Sandbox Code Playgroud)

是的,如果您回头再退,将env显示新的环境变量。