Does icinga2 REST API for HostGroup support assign_where or assign_rules inside "attrs"?

Hello, I want to use assign_where in our icinga2 when create HostGroup by REST API by ansible uri tasks. But seems it’s not supported. It works by static configure as below shows. So my question is does icinga2 version: 2.13.2-1 support assign conditions in REST API for hostgroup? Any official document clarify this?

icinga2 statis config works

object Host “Rocky8 (with icinga2 predeployed)” {
import “generic-host”
zone = “test_usmidet”
address = “10.192.230.10”
groups = [“icinga_mas”, “plcyf”]
}

object HostGroup “icinga_mas” {
display_name = “icinga_mas”
assign where host.groups.contains(“icinga_mas”)
}

object HostGroup “plcyf” {
display_name = “plcyf”
assign where host.groups.contains(“plcyf”)
}

REST api for creating HostGroup doesn’t work:

  • name: collect_HostGroup_yml_update_icinga2_hostgroup

    uri:

    use_proxy: false

    url: “https://{{ icinga.ip }}:{{ icinga.port }}/v1/objects/hostgroups/{{ item }}”

    method: “{{ ‘PUT’ if hostgroup_check.results[loop_index].status == 404 else ‘POST’ }}”

    user: “{{ icinga.api_user }}”

    password: “{{ icinga.api_password }}”

    force_basic_auth: yes

    validate_certs: false

    body_format: json

    status_code: [200, 201]

    return_content: yes

    headers:

    Content-Type: "application/json"
    
    Accept: "application/json"
    

    body:

    attrs:
    
      display_name: "{{ item }}"
    
      \# assign_where: "host.groups.contains(\\"{{ item }}\\")"
    

    loop: “{{ group_names | unique }}”

    loop_control:

    index_var: loop_index

    register: api_result

    when:

    • group_names is defined and group_names | length > 0

    • hostgroup_check is defined
      +++++++++++++++++++++++++++++++++++++++++++++++++++

  • Version used (icinga2 --version) 2.13.2-1
  • Operating System and version Rocky Linux release 8.9
  • Enabled features (icinga2 feature list) api checker icingadb ido-mysql mainlog notification syslog
  • Icinga Web 2 version and modules (System - About) not installed
  • Config validation (icinga2 daemon -C)
    [root@localhost ~]# icinga2 daemon -C
    [2025-12-16 03:34:05 +0000] information/cli: Icinga application loader (version: 2.13.2-1)
    [2025-12-16 03:34:05 +0000] information/cli: Loading configuration file(s).
    [2025-12-16 03:34:05 +0000] information/ConfigItem: Committing config item(s).
    [2025-12-16 03:34:05 +0000] information/ApiListener: My API identity: localhost.localdomain
    [2025-12-16 03:34:06 +0000] information/ConfigItem: Instantiated 1 SyslogLogger.
    [2025-12-16 03:34:06 +0000] information/ConfigItem: Instantiated 1 NotificationComponent.
    [2025-12-16 03:34:06 +0000] information/ConfigItem: Instantiated 1 IdoMysqlConnection.
    [2025-12-16 03:34:06 +0000] information/ConfigItem: Instantiated 1 CheckerComponent.
    [2025-12-16 03:34:06 +0000] information/ConfigItem: Instantiated 1 User.
    [2025-12-16 03:34:06 +0000] information/ConfigItem: Instantiated 1 UserGroup.
    [2025-12-16 03:34:06 +0000] information/ConfigItem: Instantiated 3 ServiceGroups.
    [2025-12-16 03:34:06 +0000] information/ConfigItem: Instantiated 3 TimePeriods.
    [2025-12-16 03:34:06 +0000] information/ConfigItem: Instantiated 753 Services.
    [2025-12-16 03:34:06 +0000] information/ConfigItem: Instantiated 3 Zones.
    [2025-12-16 03:34:06 +0000] information/ConfigItem: Instantiated 1 ScheduledDowntime.
    [2025-12-16 03:34:06 +0000] information/ConfigItem: Instantiated 2 NotificationCommands.
    [2025-12-16 03:34:06 +0000] information/ConfigItem: Instantiated 4 HostGroups.
    [2025-12-16 03:34:06 +0000] information/ConfigItem: Instantiated 12 Notifications.
    [2025-12-16 03:34:06 +0000] information/ConfigItem: Instantiated 1 Downtime.
    [2025-12-16 03:34:06 +0000] information/ConfigItem: Instantiated 1 IcingaApplication.
    [2025-12-16 03:34:06 +0000] information/ConfigItem: Instantiated 450 Hosts.
    [2025-12-16 03:34:06 +0000] information/ConfigItem: Instantiated 1 Endpoint.
    [2025-12-16 03:34:06 +0000] information/ConfigItem: Instantiated 1 IcingaDB.
    [2025-12-16 03:34:06 +0000] information/ConfigItem: Instantiated 1 FileLogger.
    [2025-12-16 03:34:06 +0000] information/ConfigItem: Instantiated 3 ApiUsers.
    [2025-12-16 03:34:06 +0000] information/ConfigItem: Instantiated 256 CheckCommands.
    [2025-12-16 03:34:06 +0000] information/ConfigItem: Instantiated 1 ApiListener.
    [2025-12-16 03:34:06 +0000] information/ScriptGlobal: Dumping variables to file ‘/var/cache/icinga2/icinga2.vars’
    [2025-12-16 03:34:06 +0000] information/cli: Finished validating the configuration file(s).
  • If you run multiple Icinga 2 instances, the zones.conf file (or icinga2 object list --type Endpoint and icinga2 object list --type Zone) from all affected nodes

[root@localhost ~]# icinga2 object list --type Endpoint
Object ‘localhost.localdomain’ of type ‘Endpoint’:
% declared in ‘/etc/icinga2/zones.conf’, lines 4:1-4:39

  • __name = “localhost.localdomain”

  • host = “”

  • log_duration = 86400

  • name = “localhost.localdomain”

  • package = “_etc”

  • port = “5665”

  • source_location

    • first_column = 1
    • first_line = 4
    • last_column = 39
    • last_line = 4
    • path = “/etc/icinga2/zones.conf”
  • templates = [ “localhost.localdomain” ]
    % = modified in ‘/etc/icinga2/zones.conf’, lines 4:1-4:39

  • type = “Endpoint”

  • zone = “”

    [root@localhost ~]# icinga2 object list --type Zone
    Object ‘test_usmidet’ of type ‘Zone’:
    % declared in ‘/etc/icinga2/zones.conf’, lines 7:1-7:26

    • __name = “test_usmidet”
    • endpoints = [ “localhost.localdomain” ]
      % = modified in ‘/etc/icinga2/zones.conf’, lines 8:3-8:41
    • global = false
    • name = “test_usmidet”
    • package = “_etc”
    • parent = “”
    • source_location
      • first_column = 1
      • first_line = 7
      • last_column = 26
      • last_line = 7
      • path = “/etc/icinga2/zones.conf”
    • templates = [ “test_usmidet” ]
      % = modified in ‘/etc/icinga2/zones.conf’, lines 7:1-7:26
    • type = “Zone”
    • zone = “”

    Object ‘global-templates’ of type ‘Zone’:
    % declared in ‘/etc/icinga2/zones.conf’, lines 11:1-11:30

    • __name = “global-templates”
    • endpoints = null
    • global = true
      % = modified in ‘/etc/icinga2/zones.conf’, lines 12:9-12:21
    • name = “global-templates”
    • package = “_etc”
    • parent = “”
    • source_location
      • first_column = 1
      • first_line = 11
      • last_column = 30
      • last_line = 11
      • path = “/etc/icinga2/zones.conf”
    • templates = [ “global-templates” ]
      % = modified in ‘/etc/icinga2/zones.conf’, lines 11:1-11:30
    • type = “Zone”
    • zone = “”

    Object ‘director-global’ of type ‘Zone’:
    % declared in ‘/etc/icinga2/zones.conf’, lines 15:1-15:29

    • __name = “director-global”
    • endpoints = null
    • global = true
      % = modified in ‘/etc/icinga2/zones.conf’, lines 16:9-16:21
    • name = “director-global”
    • package = “_etc”
    • parent = “”
    • source_location
      • first_column = 1
      • first_line = 15
      • last_column = 29
      • last_line = 15
      • path = “/etc/icinga2/zones.conf”
    • templates = [ “director-global” ]
      % = modified in ‘/etc/icinga2/zones.conf’, lines 15:1-15:29
    • type = “Zone”
    • zone = “”

In one word: no.

It’s not supported. assign where expects a DSL expression, not a simple value. Not to mention, it’s not an attribute as such.