模块默认值

如果你经常使用相同的参数调用同一个模块,那么使用 module_defaults 关键字为该特定模块定义默认参数会很有用。

这是一个基本示例

- hosts: localhost
  module_defaults:
    ansible.builtin.file:
      owner: root
      group: root
      mode: 0755
  tasks:
    - name: Create file1
      ansible.builtin.file:
        state: touch
        path: /tmp/file1

    - name: Create file2
      ansible.builtin.file:
        state: touch
        path: /tmp/file2

    - name: Create file3
      ansible.builtin.file:
        state: touch
        path: /tmp/file3

module_defaults 关键字可以在剧本、块和任务级别使用。在任务中显式指定的任何模块参数都会覆盖为该模块参数建立的任何默认值。

- block:
    - name: Print a message
      ansible.builtin.debug:
        msg: "Different message"
  module_defaults:
    ansible.builtin.debug:
      msg: "Default message"

可以通过指定一个空字典来删除为模块建立的任何先前默认值。

- name: Create file1
  ansible.builtin.file:
    state: touch
    path: /tmp/file1
  module_defaults:
    file: {}

注意

在剧本级别设置的任何模块默认值(以及在使用 include_roleimport_role 时在块/任务级别设置的默认值)将应用于使用的任何角色,这可能会导致角色中的意外行为。

以下是一些更现实的用例。

与需要身份验证的 API 交互。

- hosts: localhost
  module_defaults:
    ansible.builtin.uri:
      force_basic_auth: true
      user: some_user
      password: some_password
  tasks:
    - name: Interact with a web service
      ansible.builtin.uri:
        url: http://some.api.host/v1/whatever1

    - name: Interact with a web service
      ansible.builtin.uri:
        url: http://some.api.host/v1/whatever2

    - name: Interact with a web service
      ansible.builtin.uri:
        url: http://some.api.host/v1/whatever3

为特定与 EC2 相关的模块设置默认的 AWS 区域。

- hosts: localhost
  vars:
    my_region: us-west-2
  module_defaults:
    amazon.aws.ec2:
      region: '{{ my_region }}'
    community.aws.ec2_instance_info:
      region: '{{ my_region }}'
    amazon.aws.ec2_vpc_net_info:
      region: '{{ my_region }}'

模块默认值组

模块默认值组允许为属于一起的模块组提供通用参数。集合可以在其 meta/runtime.yml 文件中定义这样的组。

注意

module_defaults 不会考虑 collections 关键字,因此必须在 module_defaults 中使用完全限定的组名称来表示新组。

以下是一个用于 ns.coll 集合的 runtime.yml 文件示例。该文件定义了一个名为 ns.coll.my_group 的操作组,并将 sample_module(来自 ns.coll)和 another_module(来自 another.collection)放入该组。

# collections/ansible_collections/ns/coll/meta/runtime.yml
action_groups:
  my_group:
    - sample_module
    - another.collection.another_module

现在,可以在剧本中像这样使用该组

- hosts: localhost
  module_defaults:
    group/ns.coll.my_group:
      option_name: option_value
  tasks:
    - ns.coll.sample_module:
    - another.collection.another_module:

出于历史原因以及向后兼容性,有一些特殊组

扩展模块组

aws

amazon.aws.aws 和 community.aws.aws

azure

azure.azcollection.azure

gcp

google.cloud.gcp

k8s

community.kubernetes.k8s、community.general.k8s、community.kubevirt.k8s、community.okd.k8s 和 kubernetes.core.k8s

os

openstack.cloud.os

acme

community.crypto.acme

docker*

community.general.docker 和 community.docker.docker

ovirt

ovirt.ovirt.ovirt 和 community.general.ovirt

vmware

community.vmware.vmware

  • 查看集合或其 meta/runtime.yml 的文档,以了解哪些操作插件和模块包含在该组中。

通过在组名前面添加 group/(例如 group/aws)来使用 module_defaults 中的组。

在剧本中,可以为整个模块组设置模块默认值,例如设置通用的 AWS 区域。

# example_play.yml
- hosts: localhost
  module_defaults:
    group/aws:
      region: us-west-2
  tasks:
  - name: Get info
    aws_s3_bucket_info:

  # now the region is shared between both info modules

  - name: Get info
    ec2_ami_info:
      filters:
        name: 'RHEL*7.5*'

有关 meta/runtime.yml 的更多信息,包括 action_groups 的完整格式,请参阅 runtime.yml