1
votes

Many of the VMware modules for Ansible are structured a bit differently than a normal Ansible module. What I'm running into is needing to supply either a hostname or cluster name to the module. This doesn't scale well and I'm looking for a way to loop over a set of hosts, or even clusters from a vars file (the VMware modules don't use the normal /etc/hosts file) and supply that host or cluster name to the module. In the code below, I would be supplying a hostname to "esxi_hostname".

As you can see by the commented code, I have tried the with_items option, which doesn't work because it's not available to the module. I have tried jinja like so: 'esxi_hostname: '{% for host in hosts %} {{ host }} {% endfor %} as well as "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

I would expect I can supply a var to esxi_hostname to be utlized, and am looking for a way to do that with a loop, so it runs against host1, host2, host3, etc..

Thanks in advance!

1

1 Answers

0
votes

loops can be applied to modules (in this case module vmware_host_config_manager) so loop keyword shall be at same indent level :

- 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