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


97

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

像这样的简单shell命令:

EXPORT LC_ALL=C

作为shell命令尝试,并在使用环境模块尝试时遇到错误,未发生任何事情。

我在想什么


1
您需要在特定帐户中设置它($ HOME / .profile,默认值(/ etc / profile)还是在安装或运行应用程序之前使其可用?)
BMW

我需要将其设置为可以使用mongodb控制台。举起机器后,我无法进入控制台而不导出该变量
Gleeb'1

好的,您在谈论ansible中的mongodb模块,那么为什么在准备该模块(安装,设置配置文件或启动其服务)时不直接将其放置?
宝马

1
设置环境变量与mongodb模块有什么关系。而且我根本没有使用它。我想要的是安装mongo set env var并启动服务
Gleeb'1

所以您还没有准备好mongodb模块?那么您需要先花时间在上面,然后问题就不成问题了。
宝马

Answers:


159

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

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中,您可以只使用lineinfileAnsible中的模块,然后将所需的行添加到某些文件中。请查阅您的OS文档,以了解将其添加到哪里以使其永久存在。


6
第二个选择是我需要的。我自己找到了解决方案,但仅此而已。
Gleeb 2015年

2
快速更新:Ansible的拉取请求#8651已合并,因此现在也可以在播放级别上执行此操作。
Michal Gasek 2015年

8
因此,没有办法通过Ansible设置持久性环境变量吗?
垃圾收集器

1
@DumpHole为此,我使用了Ansible Galaxy的“ franklinkim.environment”角色。
Ates Goral

1
如果只想为当前bash shell设置环境变量怎么办?例如,可以通过这种方式使用解密的密码。
openCivilisation

30

我没有足够的声誉来发表评论,因此添加了一个新答案。
Gasek的答案很正确。只是一件事:如果您正在更新.bash_profile文件或/etc/profile,则这些更改仅在您重新登录后才会反映出来。如果要设置env变量,然后在同一剧本的后续任务中使用它,请考虑在.bashrc文件中添加这些环境变量。
我想这背后的原因是登录和非登录外壳。
Ansible在执行不同的任务时,将从.bashrc文件而不是the .bash_profile或the中读取参数/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";

如果我们在同一个剧本中拥有所有这些任务则此任务将无效


2
如果默认外壳为sh,则源代码可能无法工作。而不是source file. file
Cloverr

13

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

- name: populate /etc/environment
  lineinfile:
    dest: "/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显示新的环境变量。


dest被替换为path,但根据docs仍然可以使用。如果不是,请切换到path
guessimtoolate

9

要永久设置环境变量,可以在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

@openCivilisation更新!
Ates Goral

注意:weareinteractive.environment写入/ etc / environment
simohe

5

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

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

2
环境在角色之前运行吗?因为我的查询仍然是空的。
EvgenyKolyakov

即使我的查找是顺序空不论
AhmFM

唯一需要注意的是,在运行Playbook之前,将解决Playbook级别的环境。如果您事先知道所有值,这将很有用,但是如果您想动态添加一个值,我建议遵循JL Peyret的回答
Bubzsan,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.