设置远程环境
1.1 版新增功能。
您可以在剧本、块或任务级别使用environment
关键字为远程主机上的操作设置环境变量。使用此关键字,您可以启用对执行http请求的任务使用代理,设置特定于语言的版本管理器所需的 环境变量,等等。
当您在剧本或块级别使用environment:
设置值时,它仅对在剧本或块内由同一用户执行的任务可用。environment:
关键字不会影响 Ansible 本身、Ansible 配置设置、其他用户的环境或其他插件(如查找和过滤器)的执行。使用environment:
设置的变量不会自动成为 Ansible 事实,即使您在剧本级别设置它们也是如此。您必须在您的剧本中包含一个显式的gather_facts
任务,并在该任务上设置environment
关键字才能将这些值转换为 Ansible 事实。
在任务中设置远程环境
您可以直接在任务级别设置环境。
- hosts: all
remote_user: root
tasks:
- name: Install cobbler
ansible.builtin.package:
name: cobbler
state: present
environment:
http_proxy: http://proxy.example.com:8080
您可以通过在您的剧本中将环境设置定义为变量并在任务中像访问任何存储的 Ansible 变量一样访问它们来重用环境设置。
- hosts: all
remote_user: root
# create a variable named "proxy_env" that is a dictionary
vars:
proxy_env:
http_proxy: http://proxy.example.com:8080
tasks:
- name: Install cobbler
ansible.builtin.package:
name: cobbler
state: present
environment: "{{ proxy_env }}"
您可以通过在 group_vars 文件中定义它们来存储可在多个剧本中重用的环境设置。
---
# file: group_vars/boston
ntp_server: ntp.bos.example.com
backup: bak.bos.example.com
proxy_env:
http_proxy: http://proxy.bos.example.com:8080
https_proxy: http://proxy.bos.example.com:8080
您可以在剧本级别设置远程环境。
- hosts: testing
roles:
- php
- nginx
environment:
http_proxy: http://proxy.example.com:8080
这些示例显示了代理设置,但您可以通过这种方式提供任意数量的设置。
使用特定于语言的版本管理器
某些特定于语言的版本管理器(例如rbenv
和nvm
)要求您在使用这些工具时设置环境变量。手动使用这些工具时,您通常会从脚本或添加到 shell 配置文件中的行中获取一些环境变量。在 Ansible 中,您可以使用剧本级别的 environment 关键字来实现。
---
### A playbook demonstrating a common npm workflow:
# - Check for package.json in the application directory
# - If package.json exists:
# * Run npm prune
# * Run npm install
- hosts: application
become: false
vars:
node_app_dir: /var/local/my_node_app
environment:
NVM_DIR: /var/local/nvm
PATH: /var/local/nvm/versions/node/v4.2.1/bin:{{ ansible_env.PATH }}
tasks:
- name: Check for package.json
ansible.builtin.stat:
path: '{{ node_app_dir }}/package.json'
register: packagejson
- name: Run npm prune
ansible.builtin.command: npm prune
args:
chdir: '{{ node_app_dir }}'
when: packagejson.stat.exists
- name: Run npm install
community.general.npm:
path: '{{ node_app_dir }}'
when: packagejson.stat.exists
注意
上面的示例使用ansible_env
作为 PATH 的一部分。基于ansible_env
的变量是危险的。Ansible 通过收集事实来填充ansible_env
值,因此变量的值取决于收集这些事实时 Ansible 使用的 remote_user 或 become_user。如果您更改 remote_user/become_user,ansible_env
中的值可能并非您期望的值。
警告
环境变量通常以明文形式传递(取决于 shell 插件),因此不建议将其作为将密钥传递给正在执行的模块的方法。
您也可以在任务级别指定环境。
---
- name: Install ruby 2.3.1
ansible.builtin.command: rbenv install {{ rbenv_ruby_version }}
args:
creates: '{{ rbenv_root }}/versions/{{ rbenv_ruby_version }}/bin/ruby'
vars:
rbenv_root: /usr/local/rbenv
rbenv_ruby_version: 2.3.1
environment:
CONFIGURE_OPTS: '--disable-install-doc'
RBENV_ROOT: '{{ rbenv_root }}'
PATH: '{{ rbenv_root }}/bin:{{ rbenv_root }}/shims:{{ rbenv_plugins }}/ruby-build/bin:{{ ansible_env.PATH }}'
另请参阅
- Ansible 剧本
剧本简介
- 通讯
有问题?需要帮助?想分享您的想法?请访问 Ansible 通信指南