diff --git a/nova/core/galaxy.yml b/nova/core/galaxy.yml index 4b2d37f55..4d524f717 100644 --- a/nova/core/galaxy.yml +++ b/nova/core/galaxy.yml @@ -1,6 +1,6 @@ namespace: nova name: core -version: 11.0.3 +version: 11.1.0 readme: README.md authors: - https://github.com/novateams diff --git a/nova/core/plugins/inventory/providentia_v3.py b/nova/core/plugins/inventory/providentia_v3.py index 3b906cfb0..db349dcfd 100644 --- a/nova/core/plugins/inventory/providentia_v3.py +++ b/nova/core/plugins/inventory/providentia_v3.py @@ -230,56 +230,53 @@ async def fetch_from_providentia(self, endpoint=""): def fetch_creds(self): """ Retrieve deployer credentials from Ansible Vault in the following order of precedence: - 1. Environment and project specific credentials eg. dev_projectA_providentia_api_token or dev_projectA_deployer_username and dev_projectA_deployer_password - 2. Project specific credentials eg. projectA_providentia_api_token or projectA_deployer_username and projectA_deployer_password - 3. Environment specific credentials eg. dev_providentia_api_token or dev_deployer_username and dev_deployer_password - - 4. Default credentials eg. providentia_api_token or deployer_username and deployer_password - - API token is preferred over username/password when both are available. + 1. env_project_providentia_api_token + 2. project_providentia_api_token + 3. env_providentia_api_token + 4. env_project_deployer_username + env_project_deployer_password + 5. project_deployer_username + project_deployer_password + 6. env_deployer_username + env_deployer_password + 7. providentia_api_token + 8. deployer_username + deployer_password + + API token is preferred at each prefixed level, but falls back to all prefixed + credential pairs before the unprefixed api token. + Username and password must both be defined at the same prefix level. """ - # Build prefixes in precedence order + prefixes = [] if self.environment and self.project: - prefixes.append((f"{self.environment}_{self.project}_", 'project_')) + prefixes.append(f"{self.environment}_{self.project}_") if self.project: - prefixes.append((f"{self.project}_", 'project_')) + prefixes.append(f"{self.project}_") if self.environment: - prefixes.append((f"{self.environment}_", 'env_')) + prefixes.append(f"{self.environment}_") - # Check for API token first (preferred over username/password) - for option_prefix, inv_prefix in prefixes: - api_token = self._options.get(f"{option_prefix}providentia_api_token") - if api_token is not None: - self.inventory.set_variable("all", f"{inv_prefix}providentia_api_token", api_token) + for prefix in prefixes: + api_token = self._options.get(f"{prefix}providentia_api_token") + if api_token: return {'api_token': api_token} - default_api_token = self._options.get('providentia_api_token') - if default_api_token is not None: - return {'api_token': default_api_token} - - # Fall back to username/password credentials - for option_prefix, inv_prefix in prefixes: - username = self._options.get(f"{option_prefix}deployer_username") - password = self._options.get(f"{option_prefix}deployer_password") - if username is not None and password is not None: - self.inventory.set_variable("all", f"{inv_prefix}deployer_username", username) - self.inventory.set_variable("all", f"{inv_prefix}deployer_password", password) + for prefix in prefixes: + username = self._options.get(f"{prefix}deployer_username") + password = self._options.get(f"{prefix}deployer_password") + if username and password: return {'username': username, 'password': password} - default_username = self.get_option('deployer_username') - default_password = self.get_option('deployer_password') + api_token = self._options.get("providentia_api_token") + if api_token: + return {'api_token': api_token} - if default_username is None: - raise AnsibleParserError('Error - deployer_username not found in Ansible vault') + username = self._options.get("deployer_username") + password = self._options.get("deployer_password") + if username and password: + return {'username': username, 'password': password} - if default_password is None: - raise AnsibleParserError('Error - deployer_password not found in Ansible vault') - - return { - 'username': default_username, - 'password': default_password - } + raise AnsibleParserError( + 'Error - No valid Providentia credentials found in Ansible vault, ' + 'please provide a minimum of:\n' + 'providentia_api_token or deployer_username and deployer_password' + ) def fetch_access_token(self, creds): if 'api_token' in creds: diff --git a/nova/core/roles/cleanup/tasks/routeros.yml b/nova/core/roles/cleanup/tasks/routeros.yml index 24b1de1ce..02451a2c2 100644 --- a/nova/core/roles/cleanup/tasks/routeros.yml +++ b/nova/core/roles/cleanup/tasks/routeros.yml @@ -2,3 +2,4 @@ - name: Cleaning up RouterOS... community.routeros.command: commands: "{{ cleanup_routeros_commands }}" + retries: 3 diff --git a/nova/core/roles/connection/tasks/main.yml b/nova/core/roles/connection/tasks/main.yml index a2aa92a6b..6e09f83ed 100644 --- a/nova/core/roles/connection/tasks/main.yml +++ b/nova/core/roles/connection/tasks/main.yml @@ -102,3 +102,14 @@ - ansible_facts.system | default('') == "Win32NT" - not role_only - not role_only_wp + +# Temporary workaround for Ubuntu 26.04 since the sudo.rs does not currently work with become in Ansible +# It's done here since it needs to happen at a very early stage of the deployment +# https://github.com/ansible/ansible/pull/86905 +- name: Setting sudo.ws as default for {{ ansible_facts.distribution_release | default('') }}... + ansible.builtin.command: update-alternatives --set sudo /usr/bin/sudo.ws + changed_when: true + when: + - ansible_facts.distribution_release | default('') == "resolute" + - fresh_deploy | bool + - sudo_requires_password | bool diff --git a/nova/core/roles/deploy_vars/README.md b/nova/core/roles/deploy_vars/README.md index ffe58a51e..51b226157 100644 --- a/nova/core/roles/deploy_vars/README.md +++ b/nova/core/roles/deploy_vars/README.md @@ -10,21 +10,16 @@ none Refer to the [defaults/main.yml](https://github.com/novateams/nova.core/blob/main/nova/core/roles/deploy_vars/defaults/main.yml) file for a list and description of the variables used in this role. -Pre-built variables that come from the Providentia inventory plugin if it's used. These can be useful when working with multiple projects with the same name. To avoid using incorrect information for projects, the deployer username and password can be prefixed with either `project` or `project` and `environment` to make them unique. +Pre-built variables that come from the Providentia inventory plugin if it's used. These can be useful when working with multiple projects with the same name. To avoid using incorrect information for projects, the deployer username and password can be prefixed with either `environment` + `project`, `project` or `environment` to make them unique when multiple projects with the same name are used in different environments. -The username and password of the deployer for a specific project in a specific environment. When both `project` and `environment` are defined in the Providentia inventory configuration. - -`env_project_deployer_username` -`env_project_deployer_password` - -For the following example Providentia inventory configuration the variables in Ansible Vault can be `test_testing_deployer_username` and `test_testing_deployer_password`. +For the following example Providentia inventory configuration the variables in Ansible Vault can be `test1_testing_deployer_username` and `test1_testing_deployer_password`. ```yaml --- plugin: nova.core.providentia_v3 providentia_host: https://providentia.example.com project: testing -environment: test +environment: test1 sso_token_url: https://keycloak.example.com/realms/Apps/protocol/openid-connect/token ``` diff --git a/nova/core/roles/deploy_vars/defaults/main.yml b/nova/core/roles/deploy_vars/defaults/main.yml index 7818a87cd..4b1592b7e 100644 --- a/nova/core/roles/deploy_vars/defaults/main.yml +++ b/nova/core/roles/deploy_vars/defaults/main.yml @@ -80,6 +80,25 @@ mgmt_ipv4_with_prefix: "{{ interfaces | nova.core.addresses('mgmt_ipv4') | first mgmt_ipv6: "{{ interfaces | nova.core.addresses('mgmt_ipv6') | first | ansible.utils.ipaddr('address') }}" mgmt_ipv6_with_prefix: "{{ interfaces | nova.core.addresses('mgmt_ipv6') | first }}" +############### +# Credentials # +############### + +# Project deployer credentials that are calculated from the project_fullname and environment_name variables. +# These can be useful when managing multiple projects and environments with different deployer accounts and passwords. +# In that case the project_deployer_* variables always give the correct credentials for a specific project + +project_deployer_username: + "{{ lookup('vars', environment_name | default('') ~ '_' ~ project_fullname | default('') ~ '_deployer_username') + | default(lookup('vars', project_fullname | default('') ~ '_deployer_username')) + | default(lookup('vars', environment_name | default('') ~ '_deployer_username')) + | default(deployer_username) | default('') }}" +project_deployer_password: + "{{ lookup('vars', environment_name | default('') ~ '_' ~project_fullname | default('') ~ '_deployer_password') + | default(lookup('vars', project_fullname | default('') ~ '_deployer_password')) + | default(lookup('vars', environment_name | default('') ~ '_deployer_password')) + | default(deployer_password) | default('') }}" + ######### # Vault # ######### @@ -98,12 +117,13 @@ deploy_vars_vault_auth_method: ldap # Method used to authenticate to Vault. Can deploy_vars_vault_mount_point: "{{ omit }}" # The mount point for the secrets engine in Vault will be omitted if empty vault_ca_cert: "{{ omit }}" # The path to the CA certificate file which is used to validate the Vault server certificate vault_auth_method: ldap # Currently in this role ldap or userpass are supported -vault_username: "{{ env_deployer_username | default(project_deployer_username) | default(env_project_deployer_username) | default(deployer_username) }}" -vault_password: "{{ env_deployer_password | default(project_deployer_password) | default(env_project_deployer_password) | default(deployer_password) }}" validate_vault_certs: true vault_access_token: "{{ deploy_vars_vault_token.login.auth.client_token }}" # Comes from Vault token generation task in main.yml vault_lookup_fragment: "url={{ vault_address }} token={{ vault_access_token }} " # The space before the ending quote is required +vault_username: "{{ project_deployer_username }}" +vault_password: "{{ project_deployer_password }}" + ########## # VMware # ########## @@ -112,46 +132,18 @@ validate_vmware_certs: true vmware_defaults: hostname: "{{ vcenter_hostname | default('') }}" - username: "{{ vcenter_username - | default(env_deployer_username) - | default(project_deployer_username) - | default(env_project_deployer_username) - | default(deployer_username) - | default('') }}" - password: "{{ vcenter_password - | default(env_deployer_password) - | default(project_deployer_password) - | default(env_project_deployer_password) - | default(deployer_password) - | default('') }}" + username: "{{ vcenter_username | default(project_deployer_username) }}" + password: "{{ vcenter_password | default(project_deployer_password) }}" validate_certs: "{{ validate_vmware_certs }}" vmware_rest_defaults: vcenter_hostname: "{{ vcenter_hostname | default('') }}" - vcenter_username: "{{ vcenter_username - | default(env_deployer_username) - | default(project_deployer_username) - | default(env_project_deployer_username) - | default(deployer_username) - | default('') }}" - vcenter_password: "{{ vcenter_password - | default(env_deployer_password) - | default(project_deployer_password) - | default(env_project_deployer_password) - | default(deployer_password) - | default('') }}" + vcenter_username: "{{ vcenter_username | default(project_deployer_username) }}" + vcenter_password: "{{ vcenter_password | default(project_deployer_password) }}" vcenter_validate_certs: "{{ validate_vmware_certs }}" -nsx_deployer_username: "{{ nsx_username - | default(env_deployer_username) - | default(project_deployer_username) - | default(env_project_deployer_username) - | default(deployer_username | default('') + '@' + ldap_auth_domain | default('')) }}" -nsx_deployer_password: "{{ nsx_password - | default(env_deployer_password) - | default(project_deployer_password) - | default(env_project_deployer_password) - | default(deployer_password | default('')) }}" +nsx_deployer_username: "{{ nsx_username | default(project_deployer_username ~ '@' ~ ldap_auth_domain | default('')) }}" +nsx_deployer_password: "{{ nsx_password | default(project_deployer_password) }}" vmware_workstation: connection: ssh @@ -182,20 +174,20 @@ aws_role_arn: {} aws_defaults: region: "{{ aws_region | default('eu-north-1') }}" # Default is Stockholm - access_key: - "{{ aws_assumed_role.sts_creds.access_key | default(lookup('vars', environment_name | default('') ~ '_aws_access_key_id')) - | default(lookup('vars', project_fullname | default('') ~ '_aws_access_key_id')) + access_key: "{{ aws_assumed_role.sts_creds.access_key | default(lookup('vars', environment_name | default('') ~ '_' ~ project_fullname | default('') ~ '_aws_access_key_id')) + | default(lookup('vars', project_fullname | default('') ~ '_aws_access_key_id')) + | default(lookup('vars', environment_name | default('') ~ '_aws_access_key_id')) | default(aws_access_key_id) | default('') }}" - secret_key: - "{{ aws_assumed_role.sts_creds.secret_key | default(lookup('vars', environment_name | default('') ~ '_aws_access_key')) - | default(lookup('vars', project_fullname | default('') ~ '_aws_access_key')) + secret_key: "{{ aws_assumed_role.sts_creds.secret_key | default(lookup('vars', environment_name | default('') ~ '_' ~ project_fullname | default('') ~ '_aws_access_key')) + | default(lookup('vars', project_fullname | default('') ~ '_aws_access_key')) + | default(lookup('vars', environment_name | default('') ~ '_aws_access_key')) | default(aws_access_key) | default('') }}" - session_token: - "{{ aws_assumed_role.sts_creds.session_token | default(lookup('vars', environment_name | default('') ~ '_aws_session_token')) - | default(lookup('vars', project_fullname | default('') ~ '_aws_session_token')) + session_token: "{{ aws_assumed_role.sts_creds.session_token | default(lookup('vars', environment_name | default('') ~ '_' ~ project_fullname | default('') ~ '_aws_session_token')) + | default(lookup('vars', project_fullname | default('') ~ '_aws_session_token')) + | default(lookup('vars', environment_name | default('') ~ '_aws_session_token')) | default(aws_session_token) | default(omit) }}" ######### @@ -206,32 +198,36 @@ azure_resource_group: "{{ project_fullname | default('') }}" azure_location: westeurope azure_defaults: # Current subscription ID from https://portal.azure.com/#blade/Microsoft_Azure_Billing/SubscriptionsBlade - subscription_id: - "{{ lookup('vars', environment_name | default('') ~ '_azure_subscription_id') + subscription_id: "{{ + lookup('vars', environment_name | default('') ~ '_' ~ project_fullname | default('') ~ '_azure_subscription_id') | default(lookup('vars', project_fullname | default('') ~ '_azure_subscription_id')) - | default(lookup('vars', environment_name | default('') ~ '_' ~ project_fullname | default('') ~ '_azure_subscription_id')) - | default(azure_subscription_id) | default('') }}" + | default(lookup('vars', environment_name | default('') ~ '_azure_subscription_id')) + | default(azure_subscription_id) | default('') + }}" # The Service Principal Name's (Service Account used for deployment) ID from # https://portal.azure.com/#blade/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/RegisteredApps - client_id: - "{{ lookup('vars', environment_name | default('') ~ '_azure_client_id') + client_id: "{{ + lookup('vars', environment_name | default('') ~ '_' ~ project_fullname | default('') ~ '_azure_client_id') | default(lookup('vars', project_fullname | default('') ~ '_azure_client_id')) - | default(lookup('vars', environment_name | default('') ~ '_' ~ project_fullname | default('') ~ '_azure_client_id')) - | default(azure_client_id) | default('') }}" + | default(lookup('vars', environment_name | default('') ~ '_azure_client_id')) + | default(azure_client_id) | default('') + }}" # The current Tenant's ID from https://portal.azure.com/#blade/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/RegisteredApps tenant: - "{{ lookup('vars', environment_name | default('') ~ '_azure_tenant_id') + "{{ lookup('vars', environment_name | default('') ~ '_' ~ project_fullname | default('') ~ '_azure_tenant_id') | default(lookup('vars', project_fullname | default('') ~ '_azure_tenant_id')) - | default(lookup('vars', environment_name | default('') ~ '_' ~ project_fullname | default('') ~ '_azure_tenant_id')) - | default(azure_tenant_id) | default('') }}" + | default(lookup('vars', environment_name | default('') ~ '_azure_tenant_id')) + | default(azure_tenant_id) | default('') + }}" - secret: - "{{ lookup('vars', environment_name | default('') ~ '_azure_service_principal_secret') + secret: "{{ + lookup('vars', environment_name | default('') ~ '_' ~ project_fullname | default('') ~ '_azure_service_principal_secret') | default(lookup('vars', project_fullname | default('') ~ '_azure_service_principal_secret')) - | default(lookup('vars', environment_name | default('') ~ '_' ~ project_fullname | default('') ~ '_azure_service_principal_secret')) - | default(azure_service_principal_secret) | default('') }}" + | default(lookup('vars', environment_name | default('') ~ '_azure_service_principal_secret')) + | default(azure_service_principal_secret) | default('') + }}" ########### # Proxmox # @@ -242,21 +238,24 @@ proxmox_api_url: https://{{ proxmox_defaults.api_host }}:8006/api2/json proxmox_defaults: api_host: "{{ proxmox_api_host | default('') }}" - api_user: - "{{ lookup('vars', environment_name | default('') ~ '_proxmox_api_user') + api_user: "{{ + lookup('vars', environment_name | default('') ~ '_' ~ project_fullname | default('') ~ '_proxmox_api_user') | default(lookup('vars', project_fullname | default('') ~ '_proxmox_api_user')) - | default(lookup('vars', environment_name | default('') ~ '_' ~ project_fullname | default('') ~ '_proxmox_api_user')) - | default(proxmox_api_user) | default('') }}" - api_token_id: - "{{ lookup('vars', environment_name | default('') ~ '_proxmox_api_token_id') + | default(lookup('vars', environment_name | default('') ~ '_proxmox_api_user')) + | default(proxmox_api_user) | default('') + }}" + api_token_id: "{{ + lookup('vars', environment_name | default('') ~ '_' ~ project_fullname | default('') ~ '_proxmox_api_token_id') | default(lookup('vars', project_fullname | default('') ~ '_proxmox_api_token_id')) - | default(lookup('vars', environment_name | default('') ~ '_' ~ project_fullname | default('') ~ '_proxmox_api_token_id')) - | default(proxmox_api_token_id) | default('') }}" - api_token_secret: - "{{ lookup('vars', environment_name | default('') ~ '_proxmox_api_token_secret') + | default(lookup('vars', environment_name | default('') ~ '_proxmox_api_token_id')) + | default(proxmox_api_token_id) | default('') + }}" + api_token_secret: "{{ + lookup('vars', environment_name | default('') ~ '_' ~ project_fullname | default('') ~ '_proxmox_api_token_secret') | default(lookup('vars', project_fullname | default('') ~ '_proxmox_api_token_secret')) - | default(lookup('vars', environment_name | default('') ~ '_' ~ project_fullname | default('') ~ '_proxmox_api_token_secret')) - | default(proxmox_api_token_secret) | default('') }}" + | default(lookup('vars', environment_name | default('') ~ '_proxmox_api_token_secret')) + | default(proxmox_api_token_secret) | default('') + }}" validate_certs: "{{ proxmox_validate_certs }}" api_timeout: "{{ proxmox_api_timeout }}" @@ -274,18 +273,8 @@ proxmox_api_timeout: 30 openstack_defaults: auth: auth_url: "{{ openstack_auth_url | default('') }}" - username: "{{ openstack_username - | default(env_deployer_username) - | default(project_deployer_username) - | default(env_project_deployer_username) - | default(deployer_username) - | default('') }}" - password: "{{ openstack_password - | default(env_deployer_password) - | default(project_deployer_password) - | default(env_project_deployer_password) - | default(deployer_password) - | default('') }}" + username: "{{ openstack_username | default(project_deployer_username) }}" + password: "{{ openstack_password | default(project_deployer_password) }}" project_id: "{{ lookup('vars', environment_name | default('') ~ '_openstack_project_id') | default(lookup('vars', project_fullname | default('') ~ '_openstack_project_id')) @@ -311,10 +300,10 @@ openstack_defaults: # The content of the service account is the base64 encoded in the json file downloaded from Google Cloud Console. # Use base64 -w 0 to encode the file content to base64 and then save it to Ansible Vault -google_cloud_service_account: - "{{ lookup('vars', environment_name | default('') ~ '_gc_service_account') +google_cloud_service_account: "{{ + lookup('vars', environment_name | default('') ~ '_' ~ project_fullname | default('') ~ '_gc_service_account') | default(lookup('vars', project_fullname | default('') ~ '_gc_service_account')) - | default(lookup('vars', environment_name | default('') ~ '_' ~ project_fullname | default('') ~ '_gc_service_account')) + | default(lookup('vars', environment_name | default('') ~ '_gc_service_account')) | default(gc_service_account) | default('') }}" # Zone and Region are not in module_defaults since not all modules require them and these modules fail if they are in defaults diff --git a/nova/core/roles/docker/tasks/debian_os_default.yml b/nova/core/roles/docker/tasks/debian_os_default.yml index 61d99e4ae..366873e79 100644 --- a/nova/core/roles/docker/tasks/debian_os_default.yml +++ b/nova/core/roles/docker/tasks/debian_os_default.yml @@ -9,9 +9,16 @@ mode: "0644" timeout: 60 + - name: Getting {{ inventory_hostname }} architecture... + ansible.builtin.command: dpkg --print-architecture + changed_when: false + register: dpkg_architecture + - name: Adding Docker repository for {{ ansible_facts.distribution }}... ansible.builtin.deb822_repository: name: docker + architectures: + - "{{ dpkg_architecture.stdout }}" types: [deb] uris: "{{ docker_apt_proxy | lower }}" suites: ["{{ ansible_facts.distribution_release | lower }}"] diff --git a/nova/core/roles/docker/tasks/debian_os_non_default.yml b/nova/core/roles/docker/tasks/debian_os_non_default.yml index c263b4982..270d25cc8 100644 --- a/nova/core/roles/docker/tasks/debian_os_non_default.yml +++ b/nova/core/roles/docker/tasks/debian_os_non_default.yml @@ -11,9 +11,16 @@ distribution_release: trixie distribution: debian +- name: Getting {{ inventory_hostname }} architecture... + ansible.builtin.command: dpkg --print-architecture + changed_when: false + register: dpkg_architecture + - name: Adding Docker repository for {{ ansible_facts.distribution }}... ansible.builtin.deb822_repository: name: docker + architectures: + - "{{ dpkg_architecture.stdout }}" types: [deb] uris: "{{ docker_apt_proxy | lower }}" suites: ["{{ ansible_facts.distribution_release | lower }}"] diff --git a/nova/core/roles/gitlab/defaults/main.yml b/nova/core/roles/gitlab/defaults/main.yml index d467407aa..0a92e6780 100644 --- a/nova/core/roles/gitlab/defaults/main.yml +++ b/nova/core/roles/gitlab/defaults/main.yml @@ -1,6 +1,6 @@ --- ### gitlab general -gitlab_version: 19.1.1-ee.0 +gitlab_version: 19.1.2-ee.0 gitlab_ssh_port: 10022 # Increase gitlab ssh MaxAuthTries to avoid connection issues for users with more than 6 keys in their SSH agent set to {} to disable gitlab_ssh_max_auth_tries: 20 diff --git a/nova/core/roles/gitlab/tasks/general-settings.yml b/nova/core/roles/gitlab/tasks/general-settings.yml index 3320a15e5..8304bcfba 100644 --- a/nova/core/roles/gitlab/tasks/general-settings.yml +++ b/nova/core/roles/gitlab/tasks/general-settings.yml @@ -10,7 +10,7 @@ gitlab_product_usage_data_enabled: "{{ gitlab_general_settings_product_usage_data_enabled | default(false) }}" return_content: true status_code: [200, 201] - timeout: 120 # For some reason this sometimes returns -1 on fresh deploy and update + timeout: 120 when: gitlab_general_settings_product_usage_data_enabled is defined - name: Set version check ping settings.. @@ -24,6 +24,7 @@ version_check_enabled: "{{ gitlab_general_settings_version_check_enabled | default(false) }}" return_content: true status_code: [200, 201] + timeout: 120 when: gitlab_general_settings_version_check_enabled is defined - name: Set usage ping settings.. @@ -37,6 +38,7 @@ usage_ping_enabled: "{{ gitlab_general_settings_usage_ping_enabled | default(false) }}" return_content: true status_code: [200, 201] + timeout: 120 when: gitlab_general_settings_usage_ping_enabled is defined - name: Set gravatar_enabled {{ gitlab_general_settings_gravatar_enabled }}... @@ -50,6 +52,7 @@ gravatar_enabled: "{{ gitlab_general_settings_gravatar_enabled }}" return_content: true status_code: [200, 201] + timeout: 120 when: gitlab_general_settings_gravatar_enabled is defined - name: Set signup_enabled {{ gitlab_general_settings_signup_enabled }}... @@ -63,6 +66,7 @@ signup_enabled: "{{ gitlab_general_settings_signup_enabled }}" return_content: true status_code: [200, 201] + timeout: 120 when: gitlab_general_settings_signup_enabled is defined - name: Set CICD Maximum Artifacts Size to {{ gitlab_general_settings_max_artifacts_size }}... @@ -76,4 +80,5 @@ max_artifacts_size: "{{ gitlab_general_settings_max_artifacts_size }}" return_content: true status_code: [200, 201] + timeout: 120 when: gitlab_general_settings_max_artifacts_size is defined diff --git a/nova/core/roles/keycloak/defaults/main.yml b/nova/core/roles/keycloak/defaults/main.yml index f0a2e0ea2..e152cd487 100644 --- a/nova/core/roles/keycloak/defaults/main.yml +++ b/nova/core/roles/keycloak/defaults/main.yml @@ -1,6 +1,6 @@ --- # The Keycloak version and the Keycloak Config CLI version should be compatible -keycloak_version: 26.6.4 +keycloak_version: 26.7.0 # https://github.com/adorsys/keycloak-config-cli # https://hub.docker.com/r/adorsys/keycloak-config-cli/tags diff --git a/nova/core/roles/machine_operations/tasks/proxmox/create.yml b/nova/core/roles/machine_operations/tasks/proxmox/create.yml index 8bb578963..f016ec367 100644 --- a/nova/core/roles/machine_operations/tasks/proxmox/create.yml +++ b/nova/core/roles/machine_operations/tasks/proxmox/create.yml @@ -161,7 +161,9 @@ hotplug: "{{ machine_operations_proxmox_hotplug | join(',') }}" memory: "{{ omit if not hardware_ram else (hardware_ram * 1024) }}" name: "{{ custom_vm_name | default(vm_name) }}" - node: "{{ proxmox_node }}" + node: + "{{ proxmox_node if fresh_deploy or not machine_operations_proxmox_enable_ha + else proxmox_vm_exists.proxmox_vms[0].node }}" onboot: "{{ machine_operations_proxmox_vm_start_on_boot }}" timeout: "{{ proxmox_machine_operations_operation_timeout }}" update: true @@ -246,8 +248,8 @@ - name: Checking if {{ custom_vm_name | default(vm_name) }} has pending configuration... ansible.builtin.uri: url: - "{{ proxmox_api_url }}/nodes/{{ proxmox_vm_exists.proxmox_vms[0].node }}/qemu/{{ - proxmox_vm_exists.proxmox_vms[0].vmid | default(machine_operations_proxmox_vmid) }}/pending" + "{{ proxmox_api_url }}/nodes/{{ proxmox_node if fresh_deploy or not machine_operations_proxmox_enable_ha + else proxmox_vm_exists.proxmox_vms[0].node }}/qemu/{{ proxmox_vm_exists.proxmox_vms[0].vmid | default(machine_operations_proxmox_vmid) }}/pending" headers: Authorization: PVEAPIToken={{ proxmox_defaults.api_user }}!{{ proxmox_defaults.api_token_id }}={{ proxmox_defaults.api_token_secret }} method: GET diff --git a/nova/core/roles/machine_operations/templates/google_cloud_linux_startup_script.yml b/nova/core/roles/machine_operations/templates/google_cloud_linux_startup_script.yml index 9e892c7ac..76740bcc1 100644 --- a/nova/core/roles/machine_operations/templates/google_cloud_linux_startup_script.yml +++ b/nova/core/roles/machine_operations/templates/google_cloud_linux_startup_script.yml @@ -12,8 +12,3 @@ startup-script: | # Needed during os_configuration role apt install locales -y - - # Changing sudo for Ubuntu 26.04 since the sudo.rs does not currently work with become in Ansible for GCP images - if grep -q resolute /etc/os-release; then - update-alternatives --set sudo /usr/bin/sudo.ws - fi diff --git a/nova/core/roles/nexus/defaults/main.yml b/nova/core/roles/nexus/defaults/main.yml index c7b553e5d..35193493f 100644 --- a/nova/core/roles/nexus/defaults/main.yml +++ b/nova/core/roles/nexus/defaults/main.yml @@ -9,7 +9,7 @@ nexus_configure_ldap: false # Set to true to also configure LDAP after installat nexus_create_repos: false # Set to true to also create default repositories after installation nexus_allow_anonymous_access: true # Set to false to disable anonymous access nexus_active_encryption_key_id: Primary Encryption Key # Name of the active encryption key that comes with this role -nexus_version: 3.93.2 # Nexus version to install +nexus_version: 3.94.0 # Nexus version to install # Default is the built-in Nexus admin user. If set to a different value than admin, the role will create the user. nexus_admin_username: admin diff --git a/nova/core/roles/outline/defaults/main.yml b/nova/core/roles/outline/defaults/main.yml index ad6f93cb3..23f366759 100644 --- a/nova/core/roles/outline/defaults/main.yml +++ b/nova/core/roles/outline/defaults/main.yml @@ -1,5 +1,5 @@ --- -outline_version: 1.8.1 +outline_version: 1.9.1 outline_postgres_version: 17 # POSTGRES_VERSION_TAG # Pre-generated secret key for Outline