Configuring "locales" in Debian and Ubuntu, using Ansible - Reloaded

Posted by ads' corner on Wednesday, 2017-02-22
Posted in [Ansible][Linux]

Last year I posted about how to configure “locales” in Debian or Ubuntu, using Ansible. Back then I did not know that there is an Ansible debconf module available, and I have no idea how I could miss it. Anyway, this makes things a bit easier, but not much.

First of all, the module let’s you both set and query values. However because the locales package does not use debconf for the list of locales, but stores this list in /etc/locale.gen, things are still unnecessary complicated. But I managed to get it working without having to use an additional file as flag if this step was completed before.

The initial situation is still the following problem:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
ads@ansible-ubuntu-03:~$ perl --version
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
        LANGUAGE = "en_US:en",
        LC_ALL = (unset),
        LC_PAPER = "de_DE.UTF-8",
        LC_ADDRESS = "de_DE.UTF-8",
        LC_MONETARY = "de_DE.UTF-8",
        LC_NUMERIC = "de_DE.UTF-8",
        LC_TELEPHONE = "de_DE.UTF-8",
        LC_IDENTIFICATION = "de_DE.UTF-8",
        LC_MEASUREMENT = "de_DE.UTF-8",
        LC_TIME = "de_DE.UTF-8",
        LC_NAME = "de_DE.UTF-8",
        LANG = "en_US.UTF-8"
    are supported and installed on your system.
perl: warning: Falling back to a fallback locale ("en_US.UTF-8").

But this time the first part of the configuration is done using the debconf module:

1
2
3
4
5
6
7
8
- name: select default locale
  debconf:
    name: locales
    question: locales/default_environment_locale
    value: en_US.UTF-8
    vtype: select
  notify:
    - rebuild locales database

This task selects the default locale for the system. Next step is selecting all the locales inĀ /etc/locale.gen:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
- name: /etc/locale.gen
  lineinfile:
    dest: /etc/locale.gen
    regexp: "{{ item.regexp }}"
    line: "{{ item.line }}"
    state: "{{ item.state }}"
  with_items:
    - { regexp: '^#? ?de_DE ISO-8859-1', line: 'de_DE ISO-8859-1', state: present }
    - { regexp: '^#? ?de_DE.UTF-8 UTF-8', line: 'de_DE.UTF-8 UTF-8', state: present }
    - { regexp: '^#? ?de_DE@euro ISO-8859-15', line: 'de_DE@euro ISO-8859-15', state: present }
    - { regexp: '^#? ?en_GB ISO-8859-1', line: 'en_GB ISO-8859-1', state: present }
    - { regexp: '^#? ?en_GB.ISO-8859-15 ISO-8859-15', line: 'en_GB.ISO-8859-15 ISO-8859-15', state: present }
    - { regexp: '^#? ?en_GB.UTF-8 UTF-8', line: 'en_GB.UTF-8 UTF-8', state: present }
    - { regexp: '^#? ?en_US ISO-8859-1', line: 'en_US ISO-8859-1', state: present }
    - { regexp: '^#? ?en_US.ISO-8859-15 ISO-8859-15', line: 'en_US.ISO-8859-15 ISO-8859-15', state: present }
    - { regexp: '^#? ?en_US.UTF-8 UTF-8', line: 'en_US.UTF-8 UTF-8', state: present }
  notify:
    - rebuild locales database

Most entries - if not all - should be already in the file, but commented out. This task will remove the comment in front of the selected entry, or add a new line if the line is not in the file. It is possible to add additional locales, Ansible will not touch them. All it does it make sure that the selected locales are build.

Both tasks notify a trigger if they change something on the system:

1
2
3
4
5
- name: rebuild locales database
  command: "{{ item }}"
  with_items:
    - dpkg-reconfigure locales -f noninteractive
    - /usr/sbin/locale-gen

The trigger will in turn also update the debconf database.


Categories: [Ansible] [Linux]