Help with a loop

I’m trying to use a loop to build out (Datadog agent) configuration using a role, but each item in the loop overwrites the previous, resulting in configuration for just the last item. Can I please get a second set of eyes to determine how I should restructure my code?

  • name: Configure Datadog agent
    include_role:
    name: datadog.datadog
    apply:
    become: true
    loop_control:
    label: “{{ dd_item.item.oracle_db_name }}”
    loop_var: dd_item
    vars:
    datadog_api_key: “yyy”
    db_domain: “{{ dd_item.item.db_domain }}”
    env: “{{ dd_item.item.env_type }}”
    interval_for_default_metrics: 3600
    interval_for_custom_metrics: 3600
    oracledb_datadog_password: “yyy”
    oracledb_datadog_username: “yyy”
    oracle_db_name: “{{ dd_item.item.oracle_db_name }}”
    oracle_server_name: “{{ dd_item.query_result.0.oracle_server_name }}”
    oracle_server_fqdn: “{{ oracle_server_name }}-scan.{{ db_domain }}”
    oracle_service_name: “{{ oracle_db_name }}.{{ db_domain }}”
    datadog_checks:
    oracle:
    init_config:
    instances:

Default checks

  • server: “{{ oracle_server_fqdn }}:1521”
    service_name: “{{ oracle_service_name }}”
    protocol: TCP
    username: “{{ oracledb_datadog_username }}”
    password: “{{ oracledb_datadog_password }}”
    use_global_custom_queries: ‘false’
    tags:
  • “dbname:{{ oracle_db_name }}”
  • ansible_env:testing
  • “oracle_exaname:{{ oracle_server_name }}”
    min_collection_interval: “{{ interval_for_default_metrics }}”
    empty_default_hostname: true
    loop: “{{ server_metadata.results }}”

Hard to tell without knowing the contents of the server_metadata.results list.

Walter

Ah, good point. Here you go:

“server_metadata.results”: [
{
“ansible_loop_var”: “item”,
“changed”: false,
“failed”: false,
“invocation”: {
“module_args”: {
“as_single_query”: true,
“autocommit”: false,
“ca_cert”: null,
“db”: “inventorydb”,
“encoding”: null,
“login_host”: “”,
“login_password”: “”,
“login_unix_socket”: “”,
“login_user”: “yyy”,
“named_args”: null,
“path_to_script”: null,
“port”: 5432,
“positional_args”: null,
“query”: “SELECT oracle_server_name from oracle_dg_member WHERE database_role = ‘primary’ and oracle_db_name = ‘db1’”,
“search_path”: [
“inventory”
],
“session_role”: null,
“ssl_mode”: “prefer”,
“trust_input”: true
}
},
“item”: {
“db_domain”: “example.com”,
“env_type”: “prod”,
“oracle_db_name”: “db1”
},
“query”: “SELECT oracle_server_name from oracle_dg_member WHERE database_role = ‘primary’ and oracle_db_name = ‘db1’”,
“query_all_results”: [
[
{
“oracle_server_name”: “ax1”
}
]
],
“query_list”: [
“SELECT oracle_server_name from oracle_dg_member WHERE database_role = ‘primary’ and oracle_db_name = ‘db1’”
],
“query_result”: [
{
“oracle_server_name”: “ax1”
}
],
“rowcount”: 1,
“statusmessage”: “SELECT 1”
},
{
“ansible_loop_var”: “item”,
“changed”: false,
“failed”: false,
“invocation”: {
“module_args”: {
“as_single_query”: true,
“autocommit”: false,
“ca_cert”: null,
“db”: “inventorydb”,
“encoding”: null,
“login_host”: “”,
“login_password”: “”,
“login_unix_socket”: “”,
“login_user”: “yyy”,
“named_args”: null,
“path_to_script”: null,
“port”: 5432,
“positional_args”: null,
“query”: “SELECT oracle_server_name from oracle_dg_member WHERE database_role = ‘primary’ and oracle_db_name = ‘db2’”,
“search_path”: [
“inventory”
],
“session_role”: null,
“ssl_mode”: “prefer”,
“trust_input”: true
}
},
“item”: {
“db_domain”: “example.com”,
“env_type”: “prod”,
“oracle_db_name”: “db2”
},
“query”: “SELECT oracle_server_name from oracle_dg_member WHERE database_role = ‘primary’ and oracle_db_name = ‘db2’”,
“query_all_results”: [
[
{
“oracle_server_name”: “ax1”
}
]
],
“query_list”: [
“SELECT oracle_server_name from oracle_dg_member WHERE database_role = ‘primary’ and oracle_db_name = ‘db2’”
],
“query_result”: [
{
“oracle_server_name”: “ax1”
}
],
“rowcount”: 1,
“statusmessage”: “SELECT 1”
}
]
}