首页 > 解决方案 > Ansible-VMware 如何循环任务并为键提供值?

问题描述

许多用于 Ansible 的 VMware 模块的结构与普通的 Ansible 模块略有不同。我遇到的是需要为模块提供主机名或集群名称。这不能很好地扩展,我正在寻找一种方法来循环一组主机,甚至是来自 vars 文件的集群(VMware 模块不使用普通的 /etc/hosts 文件)并提供该主机或集群名称到模块。在下面的代码中,我将为“esxi_hostname”提供一个主机名。

正如您从注释代码中看到的那样,我尝试了 with_items 选项,该选项不起作用,因为它对模块不可用。我曾像这样尝试过 jinja:'esxi_hostname: '{% for host in hosts %} {{ host }} {% endfor %} 以及 "loop: '{{ hosts }}'

---
- hosts: localhost
  vars_files:
    - credentials.yml
    - vars.yml
    - se1_hosts.yml

  tasks:
  - name: Manage Log level setting for an ESXi host
    vmware_host_config_manager:
      hostname: 'vcsa.host.se1.somewhere.com'
      username: '{{ vc_username }}'
      password: '{{ vc_pass }}'   
      esxi_hostname:  'hostname'
      # with_items: 
      #   - 'c05n06.esx.se1.csnzoo.com'
      # loop: '{{ hosts }}'
      validate_certs: False
      options:
          'Config.HostAgent.log.level': 'info'
    delegate_to: localhost

我希望我可以为 esxi_hostname 提供一个 var 以供使用,并且正在寻找一种通过循环来做到这一点的方法,因此它针对 host1、host2、host3 等运行。

提前致谢!

标签: ansiblevmware

解决方案


循环可以应用于模块(在本例中为模块 vmware_host_config_manager),因此循环关键字应具有相同的缩进级别:

- name: Manage Log level setting for an ESXi host
  vmware_host_config_manager:
    hostname: '{{ vcenter_hostname }}'
    username: '{{ vcenter_username }}'
    password: '{{ vcenter_password }}'
    esxi_hostname: '{{ item }}'
    options:
        'Config.HostAgent.log.level': 'info'
  loop: "{{ groups['esxi'] }}"
  delegate_to: localhost

推荐阅读