您好我正在尝试了解如何使用Ansible设置环境变量。
像这样简单的shell命令:
EXPORT LC_ALL=C
尝试shell命令并出错 尝试使用环境模块,没有任何事情发生。
我缺少什么
答案 0 :(得分:118)
有多种方法可以做到这一点,从你的问题来看,也不清楚你需要什么。
<强> 1。如果您需要定义环境变量PER TASK ONLY,请执行以下操作:
- 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
模块,并将所需的行添加到某个文件中。请查阅您的操作系统文档,了解将其添加到何处以使其永久化。
答案 1 :(得分:22)
我没有足够的声誉来评论,因此我添加了一个新答案。 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";
这样可以,但是我使用了个人资料文件。 mysql -e&#34;显示数据库&#34;会发生错误。
- 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 :(得分:9)
对于持久设置环境变量,您可以在Ansible Galaxy上使用现有角色之一。我推荐franklinkim.environment。
使用ansible-galaxy:
$ ansible-galaxy install franklinkim.environment
使用requirements.yml:
- src: franklinkim.environment
然后在你的剧本中:
- hosts: all
sudo: yes
roles:
- role: franklinkim.environment
environment_config:
NODE_ENV: staging
DATABASE_NAME: staging
答案 3 :(得分:4)
这是一项快速的本地任务,用于在/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
将显示新的环境变量。
答案 4 :(得分:2)
这是最佳选择。正如Michal Gasek(第一个回答)所说,由于合并了合并拉取请求(https://github.com/ansible/ansible/pull/8651), 我们可以按播放级别轻松设置永久环境变量。
- hosts: all
roles:
- php
- nginx
environment:
MY_ENV_VARIABLE: whatever_value
答案 5 :(得分:0)
您还可以使用自定义 become plugin
设置 env主机设置
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