设置远程环境

版本 1.1 中新增。

您可以在 play、块或任务级别使用 environment 关键字为远程主机上的操作设置环境变量。使用此关键字,您可以启用为执行 http 请求的任务使用代理,设置特定于语言的版本管理器所需的環境變數,等等。

当您在 play 或块级别使用 environment: 设置值时,它仅对由同一用户执行的 play 或块内的任务可用。 environment: 关键字不会影响 Ansible 本身、Ansible 配置设置、其他用户的环境或其他插件(如查找和过滤器)的执行。使用 environment: 设置的变量不会自动成为 Ansible 事实,即使您在 play 级别设置它们也是如此。您必须在剧本中包含一个显式的 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

您可以通过在 playbook 中将环境设置定义为变量并像访问任何存储的 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 文件中定义环境设置来存储它们以便在多个 playbook 中重复使用。

---
# 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

您可以在 play 级别设置远程环境。

- hosts: testing

  roles:
     - php
     - nginx

  environment:
    http_proxy: http://proxy.example.com:8080

这些示例显示了代理设置,但您可以通过这种方式提供任意数量的设置。

使用特定于语言的版本管理器

某些特定于语言的版本管理器(如 rbenvnvm)要求您在使用这些工具时设置环境变量。手动使用这些工具时,通常会从脚本或添加到 shell 配置文件中的行中获取一些环境变量。在 Ansible 中,您可以使用 play 级别上的 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 通讯指南