--- # Installed from the official nodejs.org tarball rather than a distro repo so # that multica_node_version is a real pin on every distribution. - name: Node | Check whether the pinned runtime is already present ansible.builtin.stat: path: "{{ multica_install_dir }}/node" register: _multica_node_stat check_mode: false - name: Node | Read the installed version ansible.builtin.command: argv: ["{{ multica_install_dir }}/node", "--version"] register: _multica_node_installed when: _multica_node_stat.stat.exists changed_when: false failed_when: false check_mode: false - name: Node | Decide whether an install is needed ansible.builtin.set_fact: _multica_node_needs_install: >- {{ (not _multica_node_stat.stat.exists) or (_multica_node_installed.rc | default(1)) != 0 or (_multica_node_installed.stdout | default('') | trim) != ('v' ~ multica_node_version) }} - name: Node | Install the pinned runtime when: _multica_node_needs_install | bool block: - name: Node | Create the install prefix ansible.builtin.file: path: "{{ multica_node_prefix }}" state: directory owner: root group: root mode: "0755" become: true # get_url resolves `sha256:` against the file's basename in SHASUMS256.txt. - name: Node | Download the tarball with checksum verification ansible.builtin.get_url: url: "{{ multica_node_dist_base_url }}/v{{ multica_node_version }}/node-v{{ multica_node_version }}-linux-{{ _multica_node_arch }}.tar.xz" dest: "/tmp/node-v{{ multica_node_version }}-linux-{{ _multica_node_arch }}.tar.xz" checksum: "sha256:{{ multica_node_dist_base_url }}/v{{ multica_node_version }}/SHASUMS256.txt" mode: "0644" become: true - name: Node | Unpack it ansible.builtin.unarchive: src: "/tmp/node-v{{ multica_node_version }}-linux-{{ _multica_node_arch }}.tar.xz" dest: "{{ multica_node_prefix }}" remote_src: true owner: root group: root creates: "{{ multica_node_prefix }}/node-v{{ multica_node_version }}-linux-{{ _multica_node_arch }}/bin/node" become: true - name: Node | Remove the downloaded tarball ansible.builtin.file: path: "/tmp/node-v{{ multica_node_version }}-linux-{{ _multica_node_arch }}.tar.xz" state: absent become: true # Symlinked into /usr/local/bin, which is on systemd's default PATH — the # daemon's autostart unit does not source /etc/profile.d. - name: Node | Link node, npm and npx onto the default PATH ansible.builtin.file: src: "{{ multica_node_prefix }}/node-v{{ multica_node_version }}-linux-{{ _multica_node_arch }}/bin/{{ item }}" dest: "{{ multica_install_dir }}/{{ item }}" state: link force: true become: true loop: [node, npm, npx] - name: Node | Create the daemon user's npm global prefix ansible.builtin.file: path: "{{ multica_npm_prefix }}" state: directory owner: "{{ multica_user }}" group: "{{ multica_group }}" mode: "0755" become: true - name: Node | Point the daemon user's npm at that prefix ansible.builtin.lineinfile: path: "{{ multica_user_home }}/.npmrc" regexp: '^prefix=' line: "prefix={{ multica_npm_prefix }}" create: true owner: "{{ multica_user }}" group: "{{ multica_group }}" mode: "0644" become: true