嗨,我试图找出如何使用Ansible设置环境变量。
像这样的简单shell命令:
EXPORT LC_ALL=C
作为shell命令尝试,并在使用环境模块尝试时遇到错误,未发生任何事情。
我在想什么
嗨,我试图找出如何使用Ansible设置环境变量。
像这样的简单shell命令:
EXPORT LC_ALL=C
作为shell命令尝试,并在使用环境模块尝试时遇到错误,未发生任何事情。
我在想什么
Answers:
有多种方法可以做到这一点,而且从您的问题中也不清楚您需要什么。
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中,您可以只使用lineinfile
Ansible中的模块,然后将所需的行添加到某些文件中。请查阅您的OS文档,以了解将其添加到哪里以使其永久存在。
我没有足够的声誉来发表评论,因此添加了一个新答案。
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";
如果我们在同一个剧本中拥有所有这些任务,则此任务将无效。
source file
做. file
这是一项快速的本地任务,用于永久设置键/值/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
显示新的环境变量。
要永久设置环境变量,可以在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
这是最好的选择。正如Michal Gasek(第一个回答)所说,由于合并了拉取请求(https://github.com/ansible/ansible/pull/8651),因此我们能够轻松地根据游戏级别设置永久性环境变量。
- hosts: all
roles:
- php
- nginx
environment:
MY_ENV_VARIABLE: whatever_value