--- - name: Node.js | Read installed-version sentinel ansible.builtin.slurp: src: /etc/node_installed_version register: dev_env__node_sentinel failed_when: false - name: Node.js | Determine installed version ansible.builtin.set_fact: dev_env__node_installed: >- {{ (dev_env__node_sentinel.content | b64decode | trim) if dev_env__node_sentinel.content is defined else '' }} - name: Node.js | Install pinned release when: dev_env__node_installed != dev_env__node_version block: - name: Node.js | Download release tarball ansible.builtin.get_url: url: "https://nodejs.org/dist/{{ dev_env__node_version }}/node-{{ dev_env__node_version }}-linux-x64.tar.gz" dest: "/tmp/node-{{ dev_env__node_version }}.tar.gz" mode: "0644" - name: Node.js | Create versioned install directory ansible.builtin.file: path: "/opt/node-{{ dev_env__node_version }}" state: directory mode: "0755" - name: Node.js | Extract tarball ansible.builtin.unarchive: src: "/tmp/node-{{ dev_env__node_version }}.tar.gz" dest: "/opt/node-{{ dev_env__node_version }}" remote_src: true extra_opts: ["--strip-components=1"] - name: Node.js | Symlink node, npm, npx into PATH ansible.builtin.file: src: "/opt/node-{{ dev_env__node_version }}/bin/{{ item }}" dest: "/usr/local/bin/{{ item }}" state: link force: true loop: - node - npm - npx - name: Node.js | Write version sentinel ansible.builtin.copy: content: "{{ dev_env__node_version }}" dest: /etc/node_installed_version mode: "0644" - name: Node.js | Remove downloaded tarball ansible.builtin.file: path: "/tmp/node-{{ dev_env__node_version }}.tar.gz" state: absent