0

所以我对 Ansible 还很陌生。我正在尝试从我的库存中获取 IP 地址和主机名:

- set_fact:
    ip_out: "{{hostvars[inventory_hostname].ansible_default_ipv4.address }}"
    host_out: "{{hostvars[inventory_hostname].inventory_hostname}}"

然后想通过API将它添加到我的监控系统中。我只是不确定如何使我的循环工作。它在一次添加一个主机但不是多个主机时有效。

- name: Add host to Check_MK site via WebAPI
  uri:
    url: '{{ cmkclient__connection_string }}?action=add_host&_username={{ cmkclient_api_user }}&_secret={{ cmkclient_api_password }}&output_format=json'
    method: 'POST'
    body: 'request={"attributes":{"alias": "Test", "ipaddress": "{{item[0]}}", "hostname": "{{item[1]}}", "create_folders": "0", "folder": "" }'
    return_content: yes
  delegate_to: localhost
  when: '"No such host" in cmkclient__host_query.json.result'
  register: cmkclient__host_add
  changed_when: (cmkclient__host_add.json is defined) and
                (cmkclient__host_add.json.result_code == 0)
  failed_when: (cmkclient__host_add.json is not defined) or
               (cmkclient__host_add.json.result_code != 0)
  with_nested:
     - "{{ip_out}}"
     - "{{host_out}}"

我收到 JSON 解析错误。任何想法都会有所帮助。

谢谢!

4

1 回答 1

0

您似乎想使用目标组下主机的 IP 地址和主机名来body进行 API 请求。我们可以在 localhost 上运行,而不是将这个任务委托给 localhost,例如:

# gather required facts from all hosts
- hosts: all
  gather_facts: false

  tasks:
    - setup:
        gather_subset: network

- hosts: localhost
  connection: local
  gather_facts: false

  tasks:
    - debug:
        msg: "ipaddress: {{ ip_address }}, hostname: {{ host_name }}"
      vars:
        ip_address: "{{ hostvars[item]['ansible_default_ipv4']['address'] }}"
        host_name: "{{ hostvars[item]['inventory_hostname'] }}"
      loop: "{{ groups['all'] }}"

我使用了一个debug任务,但相同loopvars也可以应用于您的uri任务。

笔记:

如果您uri在(或所有)主机上运行任务my_group,那么您应该能够直接引用所需的变量,而无需委托。在这种情况下,任务将使用其 IP 地址和主机名在组的每个主机上运行。

body: 'request={"attributes":{"alias": "Test", "ipaddress": "{{ ansible_default_ipv4['address'] }}", "hostname": "{{ inventory_hostname }}", "create_folders": "0", "folder": "" }'
于 2021-11-02T13:08:12.320 回答