diff --git a/tasks/host-management.yml b/tasks/host-management.yml index 88c4e60..3204eb6 100644 --- a/tasks/host-management.yml +++ b/tasks/host-management.yml @@ -1,13 +1,6 @@ --- -- name: Retrieve checkmk version - uri: - method: GET - headers: - Authorization: Bearer {{ cmk_username }} {{ cmk_secret }} - Accept: application/json - url: '{{ cmk_omd_protocol }}://{{ cmk_omd_host }}/{{ cmk_omd_site }}/check_mk/api/1.0/version' - return_content: true - register: cmk_output + +- include_tasks: host-management/{{ ansible_os_family}}/check.yml - name: Set facts # noqa jinja[spacing] set_fact: @@ -24,12 +17,14 @@ debug: var: '{{ item }}' with_items: [cmk_major, cmk_minor, cmk_patch, cmk_edition] -- include_tasks: host-management/legacy.yml + +- include_tasks: host-management/{{ ansible_os_family}}/legacy.yml when: > cmk_add_host and (cmk_major | int <= 2 and cmk_minor | int < 2 or cmk_force_install) -- include_tasks: host-management/modern.yml + +- include_tasks: host-management/{{ ansible_os_family}}/modern.yml when: >- cmk_add_host and (cmk_major | int >= 2 and diff --git a/tasks/host-management/RedHat/check.yml b/tasks/host-management/RedHat/check.yml new file mode 100644 index 0000000..ab46ffd --- /dev/null +++ b/tasks/host-management/RedHat/check.yml @@ -0,0 +1,11 @@ +--- + +- name: Retrieve checkmk version + uri: + method: GET + headers: + Authorization: Bearer {{ cmk_username }} {{ cmk_secret }} + Accept: application/json + url: '{{ cmk_omd_protocol }}://{{ cmk_omd_host }}/{{ cmk_omd_site }}/check_mk/api/1.0/version' + return_content: true + register: cmk_output \ No newline at end of file diff --git a/tasks/host-management/RedHat/legacy.yml b/tasks/host-management/RedHat/legacy.yml new file mode 100644 index 0000000..102e9aa --- /dev/null +++ b/tasks/host-management/RedHat/legacy.yml @@ -0,0 +1,51 @@ +--- +- name: add host to omd (legacy) + uri: + method: POST + url: '{{ cmk_omd_protocol }}://{{ cmk_omd_host }}/{{ cmk_omd_site }}/check_mk/webapi.py?action=add_host{{ + cmk_auth }}' + body: | + request={ + "attributes": { + "tag_criticality": "prod", + "tag_agent": "cmk-agent", + "ipaddress": "{{ hostvars[inventory_hostname]['ansible_default_ipv4']['address'] }}" + }, + "folder": "{{ cmk_folder | default('Unsorted') }}", + "hostname": "{{ inventory_hostname | upper }}" + } + body_format: raw + return_content: true + register: res + become: false + when: > + cmk_add_host +- name: Parse result + set_fact: + output: '{{ res.content | from_json }}' + when: cmk_add_host + +- name: cmk_discovery (legacy) + uri: + method: POST + url: '{{ cmk_omd_protocol }}://{{ cmk_omd_host }}/{{ cmk_omd_site }}/check_mk/webapi.py?action=discover_services&mode=refresh{{ + cmk_auth }}' + body: request={"hostname":"{{ inventory_hostname }}"} + body_format: raw + status_code: 200 + become: false + when: > + cmk_add_host and output.result_code == 0 or cmk_force_install + +- name: cmk_apply (legacy) + uri: + method: POST + url: '{{ cmk_omd_protocol }}://{{ cmk_omd_host }}/{{ cmk_omd_site }}/check_mk/webapi.py?action=activate_changes&mode=specific{{ + cmk_auth }}' + body: request={"sites":["{{ cmk_omd_site }}"]} + body_format: raw + status_code: 200 + become: false + run_once: true + when: > + output.result_code == 0 or cmk_force_install diff --git a/tasks/host-management/RedHat/modern.yml b/tasks/host-management/RedHat/modern.yml new file mode 100644 index 0000000..fbe6935 --- /dev/null +++ b/tasks/host-management/RedHat/modern.yml @@ -0,0 +1,123 @@ +--- +- name: add host to omd (new) + uri: + method: POST + headers: + Authorization: Bearer {{ cmk_username }} {{ cmk_secret }} + Accept: application/json + url: '{{ cmk_api_url }}/domain-types/host_config/collections/all' + body: + folder: "{{ cmk_folder | default('~Unsorted') }}" + host_name: '{{ inventory_hostname | upper }}' + attributes: + tag_criticality: prod + tag_agent: cmk-agent + ipaddress: "{{ cmk_host_ip | default(hostvars[inventory_hostname]['ansible_default_ipv4']['address'], true) }}" + body_format: json + return_content: true + status_code: [200, 400] + register: res_add + become: false + delegate_to: localhost + when: > + cmk_add_host and cmk_major | int >= 2 and cmk_minor | int >= 2 + +- name: Parse result + set_fact: + output: '{{ res_add.content | from_json }}' + when: cmk_add_host + +- name: Host exists fetch etag (new) # noqa command-instead-of-module + shell: + cmd: | + curl \ + -G \ + -i \ + --request GET \ + --write-out "\nxxx-status_code=%{http_code}\n" \ + --header "Authorization: Bearer {{ cmk_username }} {{ cmk_secret }}" \ + --header "Accept: application/json" \ + "{{ cmk_omd_protocol }}://{{ cmk_omd_host }}/{{ cmk_omd_site }}/check_mk/api/v0/objects/host_config/{{ inventory_hostname | upper }}" + register: res_host_exists + become: false + delegate_to: localhost + when: > + cmk_add_host and (cmk_major | int >= 2 and cmk_minor | int >= 2) and + (res_add.status == 400 and output.fields.host_name | first | regex_search('already + exists.$')) + +- name: Unpick response + set_fact: + etag: "{{ res_host_exists.stdout | regex_search('.*etag:.\"(?P.+)\".*', '\\g') | first }}" + when: > + cmk_add_host and (cmk_major | int >= 2 and cmk_minor | int >= 2) and + (res_add.status == 400 and output.fields.host_name | first | regex_search('already + exists.$')) + +- name: Update host as already exists? (new) + uri: + method: PUT + headers: + Authorization: Bearer {{ cmk_username }} {{ cmk_secret }} + Accept: application/json + If-Match: '{{ etag }}' + url: '{{ cmk_omd_protocol }}://{{ cmk_omd_host }}/{{ cmk_omd_site }}/check_mk/api/v0/objects/host_config/{{ + inventory_hostname | upper }}' + body: + update_attributes: + ipaddress: "{{ hostvars[inventory_hostname]['ansible_default_ipv4']['address'] }}" + body_format: json + return_content: true + status_code: [200] + register: res + become: false + delegate_to: localhost + when: > + cmk_add_host and (cmk_major | int >= 2 and cmk_minor | int >= 2) and + (res_add.status == 400 and output.fields.host_name | first | regex_search('already + exists.$')) + +- name: Parse result + set_fact: + output: '{{ res_add.content | from_json }}' + when: cmk_add_host + +- name: cmk_discovery (new) + uri: + method: POST + headers: + Authorization: Bearer {{ cmk_username }} {{ cmk_secret }} + Accept: application/json + url: '{{ cmk_api_url }}/domain-types/service_discovery_run/actions/start/invoke' + body: + host_name: '{{ inventory_hostname | upper }}' + mode: fix_all + body_format: json + status_code: [200, 302] + become: false + delegate_to: localhost + when: > + cmk_add_host and cmk_major | int >= 2 and + cmk_minor | int >= 2 or + cmk_force_install + +- name: cmk_apply (new) + uri: + method: POST + headers: + Authorization: Bearer {{ cmk_username }} {{ cmk_secret }} + Accept: application/json + If-Match: "*" + url: '{{ cmk_api_url }}/domain-types/activation_run/actions/activate-changes/invoke' + body: + redirect: false + sites: + - "{{ cmk_omd_site }}" + force_foreign_changes: false + body_format: json + status_code: 200 + become: false + run_once: true + when: > + cmk_add_host and cmk_major | int >= 2 and + cmk_minor | int >= 2 or cmk_force_install diff --git a/tasks/host-management/Windows/check.yml b/tasks/host-management/Windows/check.yml new file mode 100644 index 0000000..50ff436 --- /dev/null +++ b/tasks/host-management/Windows/check.yml @@ -0,0 +1,11 @@ +--- + +- name: Retrieve checkmk version + win_uri: + method: GET + headers: + Authorization: Bearer {{ cmk_username }} {{ cmk_secret }} + Accept: application/json + url: '{{ cmk_omd_protocol }}://{{ cmk_omd_host }}/{{ cmk_omd_site }}/check_mk/api/1.0/version' + return_content: true + register: cmk_output \ No newline at end of file diff --git a/tasks/host-management/Windows/legacy.yml b/tasks/host-management/Windows/legacy.yml new file mode 100644 index 0000000..316b1f9 --- /dev/null +++ b/tasks/host-management/Windows/legacy.yml @@ -0,0 +1,51 @@ +--- +- name: add host to omd (legacy) + win_uri: + method: POST + url: '{{ cmk_omd_protocol }}://{{ cmk_omd_host }}/{{ cmk_omd_site }}/check_mk/webapi.py?action=add_host{{ + cmk_auth }}' + body: | + request={ + "attributes": { + "tag_criticality": "prod", + "tag_agent": "cmk-agent", + "ipaddress": "{{ hostvars[inventory_hostname]['ansible_default_ipv4']['address'] }}" + }, + "folder": "{{ cmk_folder | default('Unsorted') }}", + "hostname": "{{ inventory_hostname | upper }}" + } + body_format: raw + return_content: true + register: res + become: false + when: > + cmk_add_host +- name: Parse result + set_fact: + output: '{{ res.content | from_json }}' + when: cmk_add_host + +- name: cmk_discovery (legacy) + win_uri: + method: POST + url: '{{ cmk_omd_protocol }}://{{ cmk_omd_host }}/{{ cmk_omd_site }}/check_mk/webapi.py?action=discover_services&mode=refresh{{ + cmk_auth }}' + body: request={"hostname":"{{ inventory_hostname }}"} + body_format: raw + status_code: 200 + become: false + when: > + cmk_add_host and output.result_code == 0 or cmk_force_install + +- name: cmk_apply (legacy) + win_uri: + method: POST + url: '{{ cmk_omd_protocol }}://{{ cmk_omd_host }}/{{ cmk_omd_site }}/check_mk/webapi.py?action=activate_changes&mode=specific{{ + cmk_auth }}' + body: request={"sites":["{{ cmk_omd_site }}"]} + body_format: raw + status_code: 200 + become: false + run_once: true + when: > + output.result_code == 0 or cmk_force_install diff --git a/tasks/host-management/Windows/modern.yml b/tasks/host-management/Windows/modern.yml new file mode 100644 index 0000000..51d1256 --- /dev/null +++ b/tasks/host-management/Windows/modern.yml @@ -0,0 +1,136 @@ +--- +- name: add host to omd (new) + win_uri: + method: POST + headers: + Authorization: Bearer {{ cmk_username }} {{ cmk_secret }} + Accept: application/json + url: '{{ cmk_api_url }}/domain-types/host_config/collections/all' + body: + folder: "{{ cmk_folder | default('~Unsorted') }}" + host_name: '{{ inventory_hostname | upper }}' + attributes: + tag_criticality: prod + tag_agent: cmk-agent + ipaddress: "{{ cmk_host_ip | default(hostvars[inventory_hostname]['ansible_default_ipv4']['address'], true) }}" + body_format: json + return_content: true + status_code: [200, 400] + register: res_add + become: false + when: > + cmk_add_host and cmk_major | int >= 2 and cmk_minor | int >= 2 + +- name: Parse result + set_fact: + output: '{{ res_add.content | from_json }}' + when: cmk_add_host + +- name: Fetch etag (new) + win_uri: + method: GET + headers: + Authorization: Bearer {{ cmk_username }} {{ cmk_secret }} + Accept: application/json + url: "{{ cmk_omd_protocol }}://{{ cmk_omd_host }}/{{ cmk_omd_site }}/check_mk/api/v0/objects/host_config/{{ inventory_hostname | upper }}" + return_content: true + register: res_host_exists + become: false + when: > + cmk_add_host and (cmk_major | int >= 2 and cmk_minor | int >= 2) and + (res_add.status == 400 and output.fields.host_name | first | regex_search('already + exists.$')) + +# - name: Host exists fetch etag (new) # noqa command-instead-of-module +# shell: +# cmd: | +# curl \ +# -G \ +# -i \ +# --request GET \ +# --write-out "\nxxx-status_code=%{http_code}\n" \ +# --header "Authorization: Bearer {{ cmk_username }} {{ cmk_secret }}" \ +# --header "Accept: application/json" \ +# "{{ cmk_omd_protocol }}://{{ cmk_omd_host }}/{{ cmk_omd_site }}/check_mk/api/v0/objects/host_config/{{ inventory_hostname | upper }}" +# register: res_host_exists +# become: false +# when: > +# cmk_add_host and (cmk_major | int >= 2 and cmk_minor | int >= 2) and +# (res_add.status == 400 and output.fields.host_name | first | regex_search('already +# exists.$')) + +- name: Unpick response + set_fact: + etag: "{{ res_host_exists.stdout | regex_search('.*etag:.\"(?P.+)\".*', '\\g') | first }}" + when: > + cmk_add_host and (cmk_major | int >= 2 and cmk_minor | int >= 2) and + (res_add.status == 400 and output.fields.host_name | first | regex_search('already + exists.$')) + +- name: Update host as already exists? (new) + win_uri: + method: PUT + headers: + Authorization: Bearer {{ cmk_username }} {{ cmk_secret }} + Accept: application/json + If-Match: '{{ etag }}' + url: '{{ cmk_omd_protocol }}://{{ cmk_omd_host }}/{{ cmk_omd_site }}/check_mk/api/v0/objects/host_config/{{ + inventory_hostname | upper }}' + body: + update_attributes: + ipaddress: "{{ hostvars[inventory_hostname]['ansible_default_ipv4']['address'] }}" + body_format: json + return_content: true + status_code: [200] + register: res + become: false + delegate_to: localhost + when: > + cmk_add_host and (cmk_major | int >= 2 and cmk_minor | int >= 2) and + (res_add.status == 400 and output.fields.host_name | first | regex_search('already + exists.$')) + +- name: Parse result + set_fact: + output: '{{ res_add.content | from_json }}' + when: cmk_add_host + +- name: cmk_discovery (new) + win_uri: + method: POST + headers: + Authorization: Bearer {{ cmk_username }} {{ cmk_secret }} + Accept: application/json + url: '{{ cmk_api_url }}/domain-types/service_discovery_run/actions/start/invoke' + body: + host_name: '{{ inventory_hostname | upper }}' + mode: fix_all + body_format: json + status_code: [200, 302] + become: false + delegate_to: localhost + when: > + cmk_add_host and cmk_major | int >= 2 and + cmk_minor | int >= 2 or + cmk_force_install + +- name: cmk_apply (new) + win_uri: + method: POST + headers: + Authorization: Bearer {{ cmk_username }} {{ cmk_secret }} + Accept: application/json + If-Match: "*" + url: '{{ cmk_api_url }}/domain-types/activation_run/actions/activate-changes/invoke' + body: + redirect: false + sites: + - "{{ cmk_omd_site }}" + force_foreign_changes: false + body_format: json + status_code: 200 + become: false + run_once: true + when: > + cmk_add_host and cmk_major | int >= 2 and + cmk_minor | int >= 2 or cmk_force_install