--- - name: "Include OS-specific variables" ansible.builtin.include_vars: "{{ ansible_facts['os_family'] | lower }}.yml" - name: "Ensure locales package is installed" become: true ansible.builtin.package: name: "{{ locales_package }}" state: "present" - name: "Read locale.gen file" ansible.builtin.slurp: src: "/etc/locale.gen" register: locales_content - name: "Validate locale entries exist in locale.gen" ansible.builtin.assert: that: - "item in (locales_content.content | b64decode)" fail_msg: "Locale '{{ item }}' not found in /etc/locale.gen." loop: "{{ locales }}" - name: "Check if required locales are generated" ansible.builtin.shell: | set -o pipefail locale -a | grep 'utf8$' | sed 's/.utf8$/.UTF-8 UTF-8/' args: executable: /bin/bash register: locales_available changed_when: false - name: "Generate locales if missing" become: true when: locales | difference(locales_available.stdout_lines) | length > 0 block: - name: "Update locale.gen" ansible.builtin.lineinfile: dest: "/etc/locale.gen" mode: "0644" regexp: "^#{{ item }}" line: "{{ item }}" loop: "{{ locales }}" - name: "Generate locales" ansible.builtin.command: cmd: "locale-gen" changed_when: true - name: "Update locale.conf" become: true ansible.builtin.copy: dest: "/etc/locale.conf" mode: "0644" content: | LANG={{ locales_lang }} LANGUAGE={{ locales_language }} LC_CTYPE={{ locales_lc_ctype }} LC_NUMERIC={{ locales_lc_numeric }} LC_TIME={{ locales_lc_time }} LC_COLLATE={{ locales_lc_collate }} LC_MONETARY={{ locales_lc_monetary }} LC_MESSAGES={{ locales_lc_messages }} LC_PAPER={{ locales_lc_paper }} LC_NAME={{ locales_lc_name }} LC_ADDRESS={{ locales_lc_address }} LC_TELEPHONE={{ locales_lc_telephone }} LC_MEASUREMENT={{ locales_lc_measurement }} LC_IDENTIFICATION={{ locales_lc_identification }}