--- - name: Check Node.js version command: node --version register: node_version_check changed_when: false failed_when: false check_mode: false - name: Get Node.js version number set_fact: nodejs_installed_version: "{{ node_version_check.stdout | regex_replace('v', '') | default('') }}" when: node_version_check.rc == 0 - name: Normalize Node.js version inputs set_fact: nodejs_version_major: "{{ nodejs_version | regex_replace('^([0-9]+).*', '\\1') }}" nodejs_version_pin: "{{ nodejs_version if nodejs_version is match('^\\d+\\.\\d+\\.\\d+$') else '' }}" - name: Get installed Node.js major version set_fact: nodejs_installed_major: "{{ nodejs_installed_version | regex_replace('^([0-9]+).*', '\\1') }}" when: node_version_check.rc == 0 - name: Decide if Node.js installation is required set_fact: nodejs_needs_install: "{{ (nodejs_version_pin != '' and (nodejs_installed_version | default('')) != nodejs_version_pin) or (nodejs_version_pin == '' and (nodejs_installed_major | default('')) != nodejs_version_major) }}" - name: Install prerequisites apt: name: - curl - wget - gnupg - ca-certificates state: present - name: Ensure apt keyrings directory exists file: path: /etc/apt/keyrings state: directory mode: '0755' - name: Remove old NodeSource repository list files file: path: "{{ item }}" state: absent loop: - /etc/apt/sources.list.d/nodesource.list - "/etc/apt/sources.list.d/nodesource-node{{ nodejs_version_major }}.list" when: nodejs_needs_install | default(true) - name: Add NodeSource GPG key get_url: url: "https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key" dest: /etc/apt/keyrings/nodesource.gpg mode: '0644' register: nodesource_key when: nodejs_needs_install | default(true) - name: Add NodeSource repository apt_repository: repo: "deb [signed-by=/etc/apt/keyrings/nodesource.gpg arch=amd64,arm64] https://deb.nodesource.com/node_{{ nodejs_version_major }}.x nodistro main" state: present filename: nodesource register: nodesource_repo when: nodejs_needs_install | default(true) - name: Update apt cache for NodeSource repository apt: update_cache: yes cache_valid_time: 3600 when: nodejs_needs_install | default(true) and (nodesource_key.changed or nodesource_repo.changed) - name: Install Node.js (exact version) apt: name: - "{{ 'nodejs=' + nodejs_version_pin + '-1nodesource1' if nodejs_version_pin != '' else 'nodejs' }}" state: present update_cache: yes when: nodejs_needs_install | default(true) - name: Verify npm is available command: npm --version register: npm_version_check changed_when: false failed_when: false check_mode: false - name: Get current Yarn version command: yarn --version register: yarn_version_check changed_when: false failed_when: false check_mode: false when: install_yarn | default(true) - name: Normalize desired Yarn version set_fact: yarn_desired_version: "{{ yarn_version | default('') }}" when: install_yarn | default(true) - name: Add Yarn GPG key get_url: url: https://dl.yarnpkg.com/debian/pubkey.gpg dest: /etc/apt/keyrings/yarn.asc mode: '0644' when: - install_yarn | default(true) - yarn_desired_version | length == 0 - name: Add Yarn repository apt_repository: repo: "deb [signed-by=/etc/apt/keyrings/yarn.asc] https://dl.yarnpkg.com/debian/ stable main" state: present filename: yarn when: - install_yarn | default(true) - yarn_desired_version | length == 0 - name: Install Yarn apt: name: yarn state: present update_cache: yes when: - install_yarn | default(true) - yarn_desired_version | length == 0 - name: Enable Corepack command: corepack enable changed_when: false when: - install_yarn | default(true) - yarn_desired_version | length > 0 - name: Install Yarn via Corepack command: "corepack prepare yarn@{{ yarn_desired_version }} --activate" when: - install_yarn | default(true) - yarn_desired_version | length > 0 - yarn_version_check.stdout != yarn_desired_version - name: Set npm to use version tags by default shell: npm config set save-exact true args: creates: /root/.npmrc - name: Create npm global directory file: path: "{{ npm_config_prefix }}" state: directory mode: '0755' - name: Add npm global bin to PATH template: src: npm_global.sh.j2 dest: /etc/profile.d/npm_global.sh mode: '0644' when: add_npm_to_path | default(true) - name: Verify installations debug: msg: | Node.js version: {{ nodejs_installed_version | default('Not installed') }} NPM version: {{ npm_version_check.stdout if npm_version_check.rc == 0 else 'N/A' }} Yarn version: {{ yarn_version_check.stdout if yarn_version_check.rc == 0 and install_yarn | default(true) else 'Not installed' }}