diff --git a/ansible/roles/semaphore/tasks/configure.yml b/ansible/roles/semaphore/tasks/configure.yml index 770829e..79dc539 100644 --- a/ansible/roles/semaphore/tasks/configure.yml +++ b/ansible/roles/semaphore/tasks/configure.yml @@ -103,8 +103,7 @@ loop_control: label: "{{ item.name }}" when: item.name not in (_semaphore_keys.json | map(attribute='name') | list) - # no_log temporarily disabled for debugging - no_log: false + no_log: true - name: Re-list keys with assigned ids ansible.builtin.uri: @@ -140,12 +139,20 @@ headers: "{{ _semaphore_headers }}" validate_certs: "{{ semaphore_api_validate_certs }}" body_format: json - body: - name: "{{ item.name }}" - project_id: "{{ _semaphore_project_id | int }}" - git_url: "{{ item.git_url }}" - git_branch: "{{ item.git_branch | default('main') }}" - ssh_key_id: "{{ _semaphore_key_ids[item.ssh_key] | int }}" + # Build the body via Jinja so integer fields stay integers (the uri + # module preserves dict value types from a Jinja expression but + # coerces quoted "{{ ... }}" tokens in inline YAML to strings, + # which Semaphore rejects with a 400). + body: >- + {{ + { + 'name': item.name, + 'project_id': _semaphore_project_id | int, + 'git_url': item.git_url, + 'git_branch': item.git_branch | default('main'), + 'ssh_key_id': _semaphore_key_ids[item.ssh_key] | int + } + }} status_code: [201, 204] loop: "{{ semaphore_config.repositories }}" loop_control: @@ -185,14 +192,18 @@ headers: "{{ _semaphore_headers }}" validate_certs: "{{ semaphore_api_validate_certs }}" body_format: json - body: - name: "{{ item.name }}" - project_id: "{{ _semaphore_project_id | int }}" - type: "{{ item.type | default('file') }}" - inventory: "{{ item.inventory_file }}" - repository_id: "{{ _semaphore_repo_ids[item.repository] | int }}" - ssh_key_id: "{{ _semaphore_key_ids[item.ssh_key] | int }}" - become_key_id: "{{ _semaphore_key_ids[item.become_key | default(item.ssh_key)] | int }}" + body: >- + {{ + { + 'name': item.name, + 'project_id': _semaphore_project_id | int, + 'type': item.type | default('file'), + 'inventory': item.inventory_file, + 'repository_id': _semaphore_repo_ids[item.repository] | int, + 'ssh_key_id': _semaphore_key_ids[item.ssh_key] | int, + 'become_key_id': _semaphore_key_ids[item.become_key | default(item.ssh_key)] | int + } + }} status_code: [201, 204] loop: "{{ semaphore_config.inventories }}" loop_control: @@ -231,14 +242,15 @@ headers: "{{ _semaphore_headers }}" validate_certs: "{{ semaphore_api_validate_certs }}" body_format: json - body: - name: "{{ item.name }}" - project_id: "{{ _semaphore_project_id | int }}" - # Semaphore stores both env (process env vars) and json (extra - # variables). Pass an empty object for json unless someone - # extends the schema later. - env: "{{ item.env | default({}) | to_json }}" - json: "{{ item.extra_vars | default({}) | to_json }}" + body: >- + {{ + { + 'name': item.name, + 'project_id': _semaphore_project_id | int, + 'env': (item.env | default({}) | to_json), + 'json': (item.extra_vars | default({}) | to_json) + } + }} status_code: [201, 204] loop: "{{ semaphore_config.environments }}" loop_control: @@ -277,19 +289,26 @@ headers: "{{ _semaphore_headers }}" validate_certs: "{{ semaphore_api_validate_certs }}" body_format: json - body: - project_id: "{{ _semaphore_project_id | int }}" - name: "{{ item.name }}" - description: "{{ item.description | default('') }}" - app: "{{ item.app | default('ansible') }}" - playbook: "{{ item.playbook }}" - arguments: "{{ item.arguments | default('[]') }}" - allow_override_args_in_task: "{{ item.allow_override_args | default(false) }}" - inventory_id: "{{ _semaphore_inv_ids[item.inventory] | int }}" - repository_id: "{{ _semaphore_repo_ids[item.repository] | int }}" - environment_id: "{{ _semaphore_env_ids[item.environment] | int }}" - vault_key_id: "{{ _semaphore_key_ids[item.vault_password] | int if item.vault_password is defined else omit }}" - survey_vars: "{{ item.survey_vars | default([]) }}" + body: >- + {{ + { + 'project_id': _semaphore_project_id | int, + 'name': item.name, + 'description': item.description | default(''), + 'app': item.app | default('ansible'), + 'playbook': item.playbook, + 'arguments': item.arguments | default('[]'), + 'allow_override_args_in_task': item.allow_override_args | default(false), + 'inventory_id': _semaphore_inv_ids[item.inventory] | int, + 'repository_id': _semaphore_repo_ids[item.repository] | int, + 'environment_id': _semaphore_env_ids[item.environment] | int, + 'survey_vars': item.survey_vars | default([]) + } + | combine( + {'vault_key_id': _semaphore_key_ids[item.vault_password] | int} + if item.vault_password is defined else {} + ) + }} status_code: [201, 204] loop: "{{ semaphore_config.templates }}" loop_control: