如何使用 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
您好,我正在尝试了解如何使用 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