{"id":14984525,"url":"https://github.com/morgangraphics/ansible-role-nvm","last_synced_at":"2026-03-11T03:32:06.658Z","repository":{"id":34272221,"uuid":"94248218","full_name":"morgangraphics/ansible-role-nvm","owner":"morgangraphics","description":"Installs NVM \u0026 Node.js on Debian/Ubuntu and RHEL/CentOS","archived":false,"fork":false,"pushed_at":"2024-08-02T00:00:57.000Z","size":137,"stargazers_count":105,"open_issues_count":5,"forks_count":30,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-04-11T11:42:09.686Z","etag":null,"topics":["ansible","ansible-roles","node-version-manager","nvm","nvm-commands","nvm-installation"],"latest_commit_sha":null,"homepage":"","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/morgangraphics.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-06-13T19:08:45.000Z","updated_at":"2025-03-19T13:52:31.000Z","dependencies_parsed_at":"2024-08-02T00:07:46.754Z","dependency_job_id":null,"html_url":"https://github.com/morgangraphics/ansible-role-nvm","commit_stats":{"total_commits":32,"total_committers":2,"mean_commits":16.0,"dds":0.03125,"last_synced_commit":"bf241742972777412ebf4c53af0ed88e1e2c5984"},"previous_names":[],"tags_count":8,"template":false,"template_full_name":null,"purl":"pkg:github/morgangraphics/ansible-role-nvm","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/morgangraphics%2Fansible-role-nvm","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/morgangraphics%2Fansible-role-nvm/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/morgangraphics%2Fansible-role-nvm/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/morgangraphics%2Fansible-role-nvm/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/morgangraphics","download_url":"https://codeload.github.com/morgangraphics/ansible-role-nvm/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/morgangraphics%2Fansible-role-nvm/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30369379,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-10T21:41:54.280Z","status":"online","status_checked_at":"2026-03-11T02:00:07.027Z","response_time":84,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ansible","ansible-roles","node-version-manager","nvm","nvm-commands","nvm-installation"],"created_at":"2024-09-24T14:09:12.703Z","updated_at":"2026-03-11T03:32:06.636Z","avatar_url":"https://github.com/morgangraphics.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# Ansible Role: NVM\n\n\nInstalls NVM \u0026 Node.js on Debian/Ubuntu, RHEL/CentOS systems, and others *nix systems\n\nAnsible weirdness with SSH and (non)interactive shells makes working with NVM and Ansible a bit problematic. This [stack overflow](https://stackoverflow.com/questions/22256884/not-possible-to-source-bashrc-with-ansible) post explains some of the things other people have done to get around this particular issue.\n\n## Where other roles fall short\nOther Ansible roles that install NVM and/or Node.js fall short in a few areas.\n\n1.  They use the apt-get or yum packages managers to install Node.js. This often means that the Node.js package is older than what is currently available via the Node.js repo. In some cases, those packages may not be a LTS release and if you need multiple Node.js versions running on the same host, you're out of luck.\n\n1.  They will often install NVM and Node.js as `root` user (`sudo su` or `become: true`). This can add to the headache of permissions related to NPM plugin management as well as how Node functions with nvm in addition to being an unneeded privilege escalation security risk\n\n1.  You cannot run ad hoc nvm, npm, node, bash or shell commands\n\n\n## Where this role differs from other roles\n\n1.  You can install NVM via wget, curl or git\n1.  You can use NVM just like you would via your [command line](https://github.com/creationix/nvm#usage) in your own Ansible tasks and playbooks\n1.  You can install whatever **version** or **versions** of Node.js you want\n1.  Doesn't install NVM or Node.js as root\n1.  Can run arbitrary nvm, npm, node, bash or shell commands potentially eliminating the need for a separate Node Ansible role all together\n\n\n\n## Requirements\n\nAnsible version (ansible-core) 2.16.0 +\n\n\n\u003e :triangular_flag_on_post: For a version of this role that works on older versions of Ansible see the [legacy 1.5.X branch](https://github.com/morgangraphics/ansible-role-nvm/tree/ansible-role-nvm-legacy)\n\nSee [Ansible Versions below](#ansible-versions)\n\n\n## Installation\n1.  Clone this repo into your roles folder\n1.  Point the `roles_path` variable to the roles folder i.e. `roles_path = ../ansible-roles/` in your `ansible.cfg` file\n1.  Include role in your playbook\n\n---\n\n## :warning: WARNING!\n**DO NOT RUN THIS ROLE AS ROOT!** (e.g. `become: true|yes|1`)\n\nThere are a few reasons for this,\n1. It is an unneeded privilege escalation security risk, **it is highly unlikely that you need to run every task in every role as `root_user`**. If, for whatever reason, you do need to run everything as `root_user`, reconsider what the role is doing and why it needs root access for everything.\n\n1.  This role installs nvm in the same context/shell/session as you would run NodeJS. You don't run NodeJS as `root`\n\n1.  Ansible will change the context of the login shell to `root` and nvm will be installed in the `root_user` home directory e.g `/root/.bashrc`. This means if your primary user is **vagrant**, **ec2-user**, **ubuntu** etc. the role **WILL NOT WORK AS EXPECTED!**\n\nBAD :thumbsdown:\n\n```yaml\n- hosts: all\n  become: true           # THIS RUNS ALL TASKS, FOR ALL HOSTS, AS ROOT_USER\n  become_method: sudo    # THIS RUNS ALL TASKS, FOR ALL HOSTS, AS ROOT_USER\n\n  roles:\n    - role: ansible-role-nvm\n      nodejs_version: \"8.16.0\"\n      nvm_commands:\n       - \"nvm exec default npm install\"\n\n    - role: some-other-role\n      ...\n```\n\nBETTER :thumbsup:\n\n```yaml\n- hosts: all\n\n  roles:\n    - role: ansible-role-nvm\n      nodejs_version: \"8.16.0\"\n      nvm_commands:\n       - \"nvm exec default npm install\"\n\n    - role: some-other-role\n      ...\n      become: true            # THIS SCOPES ALL TASKS, ONLY FOR THE SOME-OTHER-ROLE, AS ROOT_USER\n      become_method: sudo     # THIS SCOPES ALL TASKS, ONLY FOR THE SOME-OTHER-ROLE, AS ROOT_USER\n```\n\nBEST :metal:\n\n```yaml\n- hosts: all\n\n  roles:\n    - role: ansible-role-nvm\n      nodejs_version: \"8.16.0\"\n      nvm_commands:\n       - \"nvm exec default npm install\"\n      become: true            # THIS WILL CHANGE THE LOGIN CONTEXT TO USE THE USER BELOW\n      become_user: ec2-user   # THIS INSTALLS NVM IN THE CONTEXT OF THE EC2-USER/DEFAULT USER. THIS USER MUST EXIST ON THE SYSTEM!\n\n    - role: some-other-role\n      ...\n      become: true            # THIS SCOPES ALL TASKS, ONLY FOR THE SOME-OTHER-ROLE, AS ROOT_USER\n      become_method: sudo     # THIS SCOPES ALL TASKS, ONLY FOR THE SOME-OTHER-ROLE, AS ROOT_USER\n```\n\nSee [Issues](#issues) below for further details\n\n\n## Example Playbooks\n\n#### Super Simple\nInclude the role as is and it will install latest LTS version of Node.js\n\n``` yaml\n- hosts: all\n\n  roles:\n    - role: ansible-role-nvm\n```\n\n#### Simple\nInclude the role and specify the specific version of Node.js you want to install\n\n```yaml\n- hosts: all\n\n  roles:\n    - role: ansible-role-nvm\n      nodejs_version: \"8.15.0\"\n```\n#### More Complex\nThis example shows how you might set up multiple environments (Dev/Prod) with different options. The Prod setup takes advantage of the `nvm_commands` option to install, build and run the application. The role supports and takes advantage of Ansible variable syntax e.g. `{{ variable_name }}`.\n\n``` yaml\n- hosts: dev\n\n  vars_files:\n    - vars/dev.yml\n\n  roles:\n    - role: ansible-role-nvm\n      nodejs_version: \"{{ config.dev.nodejs.version }}\"\n\n\n- hosts: prod\n  vars_files:\n    - vars/prod.yml\n\n  roles:\n    - role: ansible-role-nvm\n      nvm_install: \"curl\"\n      nvm_dir: \"/usr/local/nvm\"\n      nvm_commands:\n       - \"nvm install {{ config.prod.client-1.nodejs.version }}\"\n       - \"nvm alias default {{ config.prod.client-1.nodejs.version }}\"\n       - \"nvm exec default npm install\"\n       - \"nvm exec default npm run prod\"\n```\n\n## Installing/Running/Maintaining or Upgrading multiple versions of Node.js on the same host\n\nBy default, the **first** Node.js version instantiated in your Playbook will automatically be aliased as the \"default\" version regardless of whatever version you install afterwards or how many times you run the role. It is important to declare which version is expected to be the \"default\" version is you are install multiple versions on Node.js on a single machine.\n\nThere are two pre-existing NVM aliases `default` (current \"active\" version of Node.js) and `system` (the base OS version of Node.js).\n\n*Aliasing is a very powerful feature of NVM and it is a **recommended best practice** for managing your environment*.\n\n#### Multi Install\n\n```yaml\n\n- hosts: host-1\n\n  roles:\n    # Services\n    - role: ansible-role-nvm\n      nodejs_version: \"8.15.0\"    # \u003c= This will be the \"default\" version of Node.js\n\n    # Application\n    - role: ansible-role-nvm\n      nodejs_version: \"10.15.0\"\n```\n\n#### Multi Install w/ default\n\n```yaml\n\n- hosts: host-2\n\n  roles:\n    # Services\n    - role: ansible-role-nvm\n      nodejs_version: \"8.15.0\"    \n\n    # Application\n    - role: ansible-role-nvm\n      default: true\n      nodejs_version: \"10.15.0\" # \u003c= This is now the \"default\" version of Node.js\n```\n\n\u003ca name='#nvm-commands'\u003e\u003c/a\u003e\n## Notes on NVM commands\n**NVM commands are a very powerful feature of this role** which takes advantage of the groundwork NVM has set up. Leveraging `nvm_commands` could potentially eliminate the need for a specific Node role to manage your Node applications altogether.\n\nThere is a difference between `nvm run` and `nvm exec` commands. `nvm run` is functionally equivalent to `node server.js` or `node server` where you are invoking a JavaScript file\n\n`nvm exec` executes in a sub process context and is functionally equivalent to `npm run server` where `server` is a key name in the scripts section in the `package.json` file\n\n``` json\n{\n  \"name\": \"my_application\",\n  \"version\": \"0.1.0\",\n  \"private\": true,\n  \"scripts\": {\n    \"preserver\": \"npm run dbService \u0026\",\n    \"server\": \"nodemon ./bin/www\",\n    \"build\": \"node build/build.js\",\n    \"dbService\": \"nodemon ./data-service/server.js --ignore node_modules/\"\n  },\n  \"dependencies\": {\n    \"...\"\n  }\n}\n```\n\nOR\n\n`nvm exec` can execute some arbitrary script file .e.g. `nvm exec hello-world.py`\n\ne.g hello-world.py\n\n```python\n#!/usr/bin/env python\nprint('hello-world')\n```\n\n*:warning: You must include a script header for this to work properly*\n\nOR\n\nrun some arbitrary bash command\n\n```bash\nls -al \u003e\u003e output.txt\n```\n\n`nvm_commands` make it very easy to set up a Node Application and Node API layer running on different version of Node.js on the same host\n\n```yaml\n- hosts: host-1\n  roles:\n    # Services\n    # WHAT'S HAPPENING?\n    # 1. Run the services JavaScript file with Node version 8.15.0\n    # WARNING: This is aliased as the default version of Node.js At this point !!\n    # Therefore We need to explicitly specify the version we're using because\n    # the default Node.js version changes in Application section below\n    - role: ansible-role-nvm\n      nodejs_version: \"8.15.0\"\n      nvm_commands:\n        - \"nvm exec 8.15.0 npm run services\"\n\n    # Application\n    # WHAT'S HAPPENING?\n    # 1. Set the default version of Node.js to version 10.15.0\n    # 2. Install package dependencies with npm\n    # 3. Set the environment to Production, run the build JavaScript file\n    # 4. Then run the production deploy script\n    - role: ansible-role-nvm\n      nodejs_version: \"10.15.0\"\n      nvm_commands:\n       - \"nvm alias webapp {{ nodejs_version }}\" # \u003c= Changes the default NVM version (supports Ansible variable syntax)\n       - \"nvm exec webapp npm install\" # install app dependences\n       - \"NODE_ENV=production nvm run webapp build\" # invoke Node.js directly to run the production build script\n       - \"nvm exec webapp npm run prod\" # invoke npm to run the production script in your package.json file\n\n```\nAnother example\n\n```yaml\n- hosts: host-2\n  roles:\n    # Services\n    # WHAT'S HAPPENING?\n    # 1. Create an Alias for version 8.15.0 entitled service-default (Supports Ansible variable syntax)\n    # 2. Run the services script\n    #\n    # ** It is recommended that you alias your Node.js versions and reference them accordingly **\n    - role: ansible-role-nvm\n      nodejs_version: \"8.15.0\"\n      nvm_commands:\n        - \"nvm alias service-default {{ nodejs_version }}\" # \u003c= (Supports Ansible variable syntax)\n        - \"nvm exec service-default npm run services\" # run the services script in your package.json file\n\n\n    # Application - No separate Node.js Ansible Role Needed\n    # WHAT'S HAPPENING?\n    # 1. Install version 10.15.0 of Node.js\n    # 1. Set the default version of Node.js to version 10.15.0\n    # 2. Run the test.js script file invoking Node.js directly\n    # 3. Then run the production deploy bash script\n    - role: ansible-role-nvm\n      nodejs_version: \"10.15.0\"\n      nvm_commands:\n       - \"nvm alias default 10.15.0\" # \u003c= Changes the default NVM version\n       - \"nvm exec default node test.js\" # invoke Node.js directly to run the test script\n       - \"nvm exec ./deploy.sh\" # run an arbitrary bash script\n\n```\n\n**Whatever command line arguments you use to start your application, or command scripts you've declared in your package.json file can be placed inside the `nvm_commands: []` section of this role.**\n\n```yaml\n- hosts: host1\n\n  pre_tasks:\n\n    # test-user needs to be a real user on the system before we can install nvm in their profile\n    - name: add new user\n      user:\n        name: \"test-user\"\n      become: true\n\n  roles:\n\n    - role: ansible-role-nvm\n      nodejs_version: \"8.16.0\"\n      nvm_profile: \"/home/test-user/.bashrc\"\n      nvm_commands:\n        - \"whoami\"\n        - \"node --version\"\n        - \"nvm --version\"\n        - \"npm --version\"\n        - \"python3 -m hello\"\n      become_user: test-user\n      become: true\n```\n\n\n\n## Caveats\n\n1.  By default, the **first** version listed in your Playbook, on the **first** run, will automatically be aliased as the \"default\" version of Node.js regardless of whatever version you install afterwards or however many times you run the role. **First one in/installed is always the default.** As a result, if you expect a Node.js version declared later in the playbook to be set as default use `default: true` or explicitly set it in the `nvm_commands` list like `- \"nvm alias default \u003cYOUR_VERSION\u003e\"`\n\n1.  If you have `default: true` explicitly declared as a role variable **AND** `- \"nvm alias default \u003cSOME_OTHER_VERSION\u003e\"` as part of your `nvm_commands` the version with `default: true` will **ALWAYS** be executed **first**. This is because we need Node.js to be available before doing anything else.  \n\n1.  NVM is stateless in that if you have multiple versions of Node.js installed on a machine, you may have to run `nvm use \u003cVERSION\u003e` as part of your script to run the Node.js version you want/expect. However, it is highly recommended that you alias your versions accordingly and reference them that way. See the examples above.\n\n\u003ca name='#issues'\u003e\u003c/a\u003e\n## Issues\n\n\n### `\"nvm: command not found\" error`\n\nThis is often the result of running the role in another user context then the `nvm` and `node` user context will run inside the machine. If you add `become: true` to all the roles in your playbook to get around errors those roles throw due to permission issues, then this role will install `nvm` under the `ROOT_USER` (usually `/root/.bashrc`). **It is more than likely that you will want to run nvm and node as a default user e.g. vagrant, ec2-user, ubuntu etc.** If, for whatever reason, you cannot remove the `become: true` for everything, you can get around the `become: true` issue by specifying `become: true` **AND** `become_user: ec2-user` for this role alone. See [bash: nvm command not found\n](https://github.com/morgangraphics/ansible-role-nvm/issues/16) for a detailed explanation of the issue\n\n\n### `\"cannot find /usr/bin/python\" error`\n\nIt is due to OS's that run Python 3 by default (e.g. Fedora). You will need to specify the Ansible python interpreter variable in the inventory file or via the command line\n\n```toml\n[fedora1]\n192.168.0.1 ansible_python_interpreter=/usr/bin/python3\n\n\n[fedora2]\n192.168.0.2\n\n[fedora2:vars]\nansible_python_interpreter=/usr/bin/python3\n```\nor\n\n```bash\nansible-playbook my-playbook.yml -e \"ansible_python_interpreter=/usr/bin/python3\"\n```\n\n### `glibc_2.28' not found (required by node)`\n\nYou are attempting to run a version of Node.js on an operating system that is not supported by the version of Node.js you are installing. This is not an NVM issue nor is it an issue with the role. You need to either upgrade the OS or downgrade the version of Node.js you are atrempting to install. \n\n\n\u003ca name=\"ansible-versions\"\u003e\u003c/a\u003e\n\n---\n## Ansible Version Support\n\n**ansible-core 2.16 +**\n\nThere has been a fundamental change on how Ansible manages includes/imports. Ansible has removed `ansible.builtin.include` from ansible-core and replaced it with `ansible.builtin.include_tasks`. Unfortunately, Ansible cannot scope `ansible.builtin.include` to ignore older versions etc. so I upgraded this role to fully support ansible-core 2.16+\n\nIf you require support for ansible-core 2.15 and below, please use the [ansible-role-nvm-legacy](https://github.com/morgangraphics/ansible-role-nvm/tree/ansible-role-nvm-legacy) branch\n\n**ansible-core 2.15 and below**\n\nPlease use the [legacy 1.5.X branch](https://github.com/morgangraphics/ansible-role-nvm/tree/ansible-role-nvm-legacy)\n\n\n\n## Role Variables\n\nAvailable variables are listed below, along with default values see [defaults/main.yml]( defaults/main.yml)\n\n\n\nThe Node.js version to install. The latest \"lts\" version is the default and works on most supported OSes.\n\n  ```yaml\n  nodejs_version: \"lts\"\n  ```\n\n Convenience method for installing NVM bash autocomplete (`nvm \u003cTAB\u003e`) when a user has to maintain a server or workstation manually\n\n  ```yaml\n  autocomplete: false\n  ```\n\nInstall NVM from scratch removing **ANY** and **ALL** existing or previous references to `.nvm` (directories) and **ANY** and **ALL** existing or previous references in profile entries e.g. `.bashrc` in the system. \n\n```yaml\nclean_install: false\n```\n\n\u003e `clean_install: true` greps all files in `/home` `/root`, `/etc`, and `custom install directories` for refrences as-well-as looking for any `.nvm` folder in the system. This is equivalent to a new machine setup, **USE WITH CAUTION**\n\n\n```yaml\ndefault: false\n```\n\nSet default version of Node when maintaining/installing multiple versions of Node\n\n\n\u003e NVM will automatically alias the first run/installed version as \"default\" which is more than likely what people will use this role  for, however, this will allow for installation/upgrade of multiple versions on an existing machine\n\n\nList of [NVM commands to run](#nvm-commands). Default is an empty list.\n\n  ```yaml\n  nvm_commands: []\n  ```\n\nNVM Installation type. Options are wget, curl and git\n\n  ```yaml\n  nvm_install: \"wget\"\n  ```\n\nNVM Installation directory.\n\n  ```yaml\n  nvm_dir: \"\"\n  ```\n\n\u003e *NVM will, by default, install the `.nvm` directory in the home directory of the user e.g. `/home/vagrant/.nvm`. You can override the installation directory by changing this variable e.g. `/opt/nvm` to put it into a global space (not tied to a specific user account) if you wanted. This variable will respect Ansible substitution variables e.g. `{{ansible_env.HOME}}`*\n\nNVM Profile location Options are .bashrc, .cshrc, .tcshrc, .zshrc\n\n  ```yaml\n  nvm_profile: \".bashrc\"\n  ```\n\n\u003e The location of the login SHELL profile that will source the nvm command from. There are two potential contexts to consider:\n\u003e\n\u003e *Globally, meaning everyone who logs in will have access to nvm (which may or may not what you really want)*\n\u003e\n\u003e e.g `/etc/bash.bashrc`, `/etc/profile` etc.\n\u003e\n\u003e **OR**\n\u003e\n\u003e *On a per user basis tied to a specific user account*\n\u003e\n\u003e e.g. `/home/vagrant/.bashrc`.*\n\u003e \n\u003e *This role will create the appropriate profile file if it doesn't already exist.*\n\u003e\n\u003e *If you specify nvm_profile: \"/home/node-user/.bashrc\" explicity and the node-user is not a real  user on the box, then nvm will not work as you expect. become, become_user and nvm_profile path are symbiotic*\n\u003e\n\u003e :warning: **PLEASE BE AWARE OF THE LIMITATIONS OF EXPLICITLY DECLARING .profile OR .bash_profile FILES ON UBUNTU SYSTEMS**\n\u003e\n\u003e  [https://askubuntu.com/a/969923](https://askubuntu.com/a/969923) Explains in detail\n\u003e\n\u003e  [https://kb.iu.edu/d/abdy](https://kb.iu.edu/d/abdy) Shows options for each shell type\n\u003e\n\u003e  NVM Profile location Options are:\n\u003e\n\u003e  **BASH**: .bashrc\n\u003e\n\u003e  **CSH**: /etc/csh.cshrc, .cshrc\n\u003e\n\u003e  **TSCH**: /etc/csh.cshrc, .tcshrc, .cshrc\n\u003e\n\u003e  **ZSH**: .zshrc\n\n\nNVM source location i.e. you host your own fork of [NVM](https://github.com/creationix/nvm)\n\n  ```yaml\n  nvm_source: \"\"\n  ````\n\nNVM version to install\n\n  ```yaml\n  nvm_version: \"0.39.7\"\n  ```\n\nUninstall NVM, will remove the .nvm directory and clean up file located at the `{{ nvm_profile }}` variable path (usually $HOME/.bashrc) where ever that file is located\n\n  ```yaml\n  uninstall: False\n  ```\n\n\n\n\n## Dependencies\n\nNone.\n\n## Change Log\n---\n**2.0.0**\nSee the [RELEASE NOTES](https://github.com/morgangraphics/ansible-role-nvm/releases/latest)\n\n\n\n## License\n\nMIT / BSD\n\n## Author Information\n\ndm00000 via MORGANGRAPHICS, INC\n\nThis role borrows heavily from [Jeff Geerling's](https://www.jeffgeerling.com/) Node.js role, author of [Ansible for DevOps](https://www.ansiblefordevops.com/).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmorgangraphics%2Fansible-role-nvm","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmorgangraphics%2Fansible-role-nvm","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmorgangraphics%2Fansible-role-nvm/lists"}