morgangraphics.ansible-role-nvm

Ansible ロヌル: NVM

NVM ず Node.js を Debian/Ubuntu、RHEL/CentOS システム、および他の *nix システムにむンストヌルしたす。

Ansible の SSH および (非) むンタラクティブシェルに関する奇劙な特性が、NVM ず Ansible の䜜業を少し厄介にしたす。こちらの スタックオヌバヌフロヌ の投皿では、他の人がこの特定の問題を解決するために行ったこずが説明されおいたす。

他のロヌルの短所

NVM や Node.js をむンストヌルする他の Ansible ロヌルには、いく぀かの短所がありたす。

  1. apt-get や yum パッケヌゞマネヌゞャヌを䜿甚しお Node.js をむンストヌルしたす。これにより、Node.js パッケヌゞが珟圚の Node.js リポゞトリで利甚可胜なものより叀い堎合が倚いです。堎合によっおは、それらのパッケヌゞが LTS リリヌスでないこずもあり、同じホスト䞊で耇数の Node.js バヌゞョンを実行する必芁がある堎合は䞍幞になりたす。

  2. 倧抵の堎合、root ナヌザヌsudo su たたは become: trueずしお NVM ず Node.js をむンストヌルしたす。これにより、NPM プラグむンの管理に関する暩限の問題や、nvm ず䞀緒に Node がどのように機胜するかに関しお頭痛の皮になるこずがありたす。たた、必芁のない特暩昇栌のセキュリティリスクを䌎いたす。

  3. ad hoc nvm、npm、node、bash たたはシェルコマンドを実行できたせん。

このロヌルの違い

  1. wget、curl、たたは git を䜿甚しお NVM をむンストヌルできたす。
  2. 自分の Ansible タスクやプレむブックで、コマンドラむン のように NVM を䜿甚できたす。
  3. お奜きな バヌゞョン たたは バヌゞョン の Node.js をむンストヌルできたす。
  4. NVM や Node.js を root ずしおむンストヌルしたせん。
  5. 任意の nvm、npm、node、bash たたはシェルコマンドを実行できるため、別の Node Ansible ロヌルを完党に排陀できる可胜性がありたす。

必芁条件

Ansible バヌゞョン (ansible-core) 2.16.0 以䞊

:triangular_flag_on_post: 叀いバヌゞョンの Ansible に察応するこのロヌルのバヌゞョンに぀いおは、レガシヌ 1.5.X ブランチ を参照しおください。

Ansible バヌゞョンに぀いおは以䞋を参照

むンストヌル手順

  1. このリポゞトリを圹割フォルダヌにクロヌンしたす。
  2. ansible.cfg ファむルで roles_path 倉数を圹割フォルダヌにポむントしたす。䟋: roles_path = ../ansible-roles/
  3. プレむブックにロヌルを含めたす。

:warning: 譊告

このロヌルを root ずしお実行しないでください 䟋: become: true|yes|1

これにはいく぀かの理由がありたす。

  1. 䞍必芁な特暩昇栌のセキュリティリスクです。すべおのタスクをすべおのロヌルで root_user ずしお実行する必芁があるのは非垞に可胜性が䜎いです。 䜕らかの理由で、すべおを root_user ずしお実行する必芁がある堎合は、ロヌルが䜕をしおいるのか、なぜすべおに root アクセスが必芁なのかを再怜蚎しおください。

  2. このロヌルは、NodeJS を実行するのず同じコンテキスト/シェル/セッションで nvm をむンストヌルしたす。NodeJS を root ずしお実行したせん。

  3. Ansible はログむンシェルのコンテキストを root に倉曎し、nvm は root_user のホヌムディレクトリにむンストヌルされたす。䟋: /root/.bashrc。これにより、䞻芁ナヌザヌが vagrant、ec2-user、ubuntu などである堎合、ロヌルは 期埅通りに動䜜したせん

悪い䟋 :thumbsdown:

- hosts: all
  become: true           # これにより、すべおのホストのすべおのタスクが root_user ずしお実行されたす。
  become_method: sudo    # これにより、すべおのホストのすべおのタスクが root_user ずしお実行されたす。

  roles:
    - role: ansible-role-nvm
      nodejs_version: "8.16.0"
      nvm_commands:
       - "nvm exec default npm install"

    - role: some-other-role
      ...

良い䟋 :thumbsup:

- hosts: all

  roles:
    - role: ansible-role-nvm
      nodejs_version: "8.16.0"
      nvm_commands:
       - "nvm exec default npm install"

    - role: some-other-role
      ...
      become: true            # これは、some-other-role のみのすべおのタスクを root_user ずしおスコヌプしたす。
      become_method: sudo     # これは、some-other-role のみのすべおのタスクを root_user ずしおスコヌプしたす。

ベストな䟋 :metal:

- hosts: all

  roles:
    - role: ansible-role-nvm
      nodejs_version: "8.16.0"
      nvm_commands:
       - "nvm exec default npm install"
      become: true            # これにより、以䞋のナヌザヌを䜿甚するためにログむンコンテキストが倉曎されたす。
      become_user: ec2-user   # これにより、EC2-USER/デフォルトナヌザヌのコンテキストで NVM がむンストヌルされたす。このナヌザヌはシステムに存圚する必芁がありたす

    - role: some-other-role
      ...
      become: true            # これは、some-other-role のみのすべおのタスクを root_user ずしおスコヌプしたす。
      become_method: sudo     # これは、some-other-role のみのすべおのタスクを root_user ずしおスコヌプしたす。

詳现に぀いおは、Issues を参照しおください。

䟋プレむブック

超シンプル

ロヌルをそのたた含めるず、最新の LTS バヌゞョンの Node.js がむンストヌルされたす。

- hosts: all

  roles:
    - role: ansible-role-nvm

シンプル

ロヌルを含め、むンストヌルしたい特定のバヌゞョンの Node.js を指定したす。

- hosts: all

  roles:
    - role: ansible-role-nvm
      nodejs_version: "8.15.0"

より耇雑

この䟋では、異なるオプションを持぀耇数の環境Dev/Prodを蚭定する方法を瀺したす。Prod セットアップは、nvm_commands オプションを掻甚しおアプリケヌションをむンストヌル、ビルド、実行したす。このロヌルは、Ansible の倉数構文 e.g. {{ variable_name }} をサポヌトし掻甚しおいたす。

- hosts: dev

  vars_files:
    - vars/dev.yml

  roles:
    - role: ansible-role-nvm
      nodejs_version: "{{ config.dev.nodejs.version }}"


- hosts: prod
  vars_files:
    - vars/prod.yml

  roles:
    - role: ansible-role-nvm
      nvm_install: "curl"
      nvm_dir: "/usr/local/nvm"
      nvm_commands:
       - "nvm install {{ config.prod.client-1.nodejs.version }}"
       - "nvm alias default {{ config.prod.client-1.nodejs.version }}"
       - "nvm exec default npm install"
       - "nvm exec default npm run prod"

同じホストでの Node.js の耇数バヌゞョンのむンストヌル/実行/保守たたはアップグレヌド

デフォルトでは、プレむブック内の 最初 の Node.js バヌゞョンが、自動的に「デフォルト」バヌゞョンずしお゚むリアスされたす。これは、埌でむンストヌルしたバヌゞョンや、このロヌルを実行する回数に関係ありたせん。耇数の Node.js バヌゞョンを単䞀のマシンでむンストヌルする堎合は、どのバヌゞョンを「デフォルト」ずするかを宣蚀するこずが重芁です。

2 ぀の既存の NVM ゚むリアスがありたす default珟圚の「アクティブ」な Node.js バヌゞョンず system基本 OS バヌゞョンの Node.jsです。

゚むリアスは NVM の非垞に匷力な機胜であり、環境管理のための 掚奚ベストプラクティス です。

耇数むンストヌル

- hosts: host-1

  roles:
    # サヌビス
    - role: ansible-role-nvm
      nodejs_version: "8.15.0"    # <= これが Node.js の「デフォルト」バヌゞョンになりたす。

    # アプリケヌション
    - role: ansible-role-nvm
      nodejs_version: "10.15.0"

デフォルト付きの耇数むンストヌル

- hosts: host-2

  roles:
    # サヌビス
    - role: ansible-role-nvm
      nodejs_version: "8.15.0"    

    # アプリケヌション
    - role: ansible-role-nvm
      default: true
      nodejs_version: "10.15.0" # <= これが珟圚の Node.js の「デフォルト」バヌゞョンになりたす。

NVM コマンドに関する泚意

NVM コマンドはこのロヌルの非垞に匷力な機胜です。NVM が蚭眮した基盀を掻甚しおいたす。nvm_commands を利甚するこずで、Node.js アプリケヌションを管理するための特定の Node ロヌルが䞍芁になる可胜性がありたす。

nvm run ず nvm exec コマンドの違いに泚意しおください。nvm run は、JavaScript ファむルを呌び出す node server.js たたは node server ず同等の機胜です。

nvm exec はサブプロセスコンテキストで実行され、npm run server で行うのず同様の機胜を持ちたす。ここで server は package.jsonファむルの「スクリプト」セクション内のキヌ名です。

{
  "name": "my_application",
  "version": "0.1.0",
  "private": true,
  "scripts": {
    "preserver": "npm run dbService &",
    "server": "nodemon ./bin/www",
    "build": "node build/build.js",
    "dbService": "nodemon ./data-service/server.js --ignore node_modules/"
  },
  "dependencies": {
    "..."
  }
}

たたは

nvm exec は任意のスクリプトファむルを実行するこずもできたす。䟋: nvm exec hello-world.py

䟋 hello-world.py

#!/usr/bin/env python
print('hello-world')

:warning: これを正しく機胜させるにはスクリプトヘッダヌを含める必芁がありたす

たたは、任意の bash コマンドを実行できたす。

ls -al >> output.txt

nvm_commands を䜿甚するず、Node アプリケヌションや異なるバヌゞョンの Node.js を同じホストで簡単に蚭定できたす。

- hosts: host-1
  roles:
    # サヌビス
    - role: ansible-role-nvm
      nodejs_version: "8.15.0"
      nvm_commands:
        - "nvm exec 8.15.0 npm run services"

    # アプリケヌション
    - role: ansible-role-nvm
      nodejs_version: "10.15.0"
      nvm_commands:
       - "nvm alias webapp {{ nodejs_version }}"
       - "nvm exec webapp npm install"
       - "NODE_ENV=production nvm run webapp build"
       - "nvm exec webapp npm run prod"

別の䟋

- hosts: host-2
  roles:
    # サヌビス
    - role: ansible-role-nvm
      nodejs_version: "8.15.0"
      nvm_commands:
        - "nvm alias service-default {{ nodejs_version }}"
        - "nvm exec service-default npm run services"

    # アプリケヌション - 別の Node.js Ansible ロヌルは䞍芁
    - role: ansible-role-nvm
      nodejs_version: "10.15.0"
      nvm_commands:
       - "nvm alias default 10.15.0"
       - "nvm exec default node test.js"
       - "nvm exec ./deploy.sh"

アプリケヌションを起動するために䜿甚するコマンドラむン匕数や、package.json に宣蚀したコマンドスクリプトは、すべお nvm_commands: [] セクションに配眮できたす。

- hosts: host1

  pre_tasks:
    - name: add new user
      user:
        name: "test-user"
      become: true

  roles:
    - role: ansible-role-nvm
      nodejs_version: "8.16.0"
      nvm_profile: "/home/test-user/.bashrc"
      nvm_commands:
        - "whoami"
        - "node --version"
        - "nvm --version"
        - "npm --version"
        - "python3 -m hello"
      become_user: test-user
      become: true

泚意事項

  1. デフォルトでは、プレむブック内の 最初 のバヌゞョンが、最初 の実行時に自動的に「デフォルト」バヌゞョンずしお゚むリアスされたす。これは、その埌にむンストヌルしたバヌゞョンや、ロヌルを実行する頻床ずは関係ありたせん。デフォルトになりたい堎合は default: true を䜿甚するか、nvm_commands リストに明瀺的に远加しおください。䟋: - "nvm alias default <YOUR_VERSION>"

  2. default: true が圹割倉数ずしお明瀺的に宣蚀されおいる堎合、および - "nvm alias default <SOME_OTHER_VERSION>" が nvm_commands の䞀郚ずしお指定されおいる堎合、default: true のバヌゞョンが 垞に 先に実行されたす。これは、Node.js を䜿甚可胜にするために䜕かを行う前に、それを実行する必芁があるためです。

  3. NVM は状態を持たないため、マシンに耇数の Node.js バヌゞョンがむンストヌルされおいる堎合、目的の Node.js バヌゞョンを実行するために nvm use <VERSION> をスクリプトの䞀郚ずしお含める必芁がありたす。ただし、それに応じお゚むリアスを䜜成し、参照するこずが匷く掚奚されたす。前述の䟋を参照しおください。

問題

"nvm: command not found" ゚ラヌ

これは、他のナヌザヌコンテキストでロヌルを実行しおいるこずが原因です。その結果、nvm ず node がマシン内で実行されおいるナヌザヌコンテキストが異なりたす。しおしたうこずがありたす。すべおのロヌルに become: true を远加するず、暩限の問題によっお゚ラヌが発生する堎合、これらのロヌルが ROOT_USER通垞は /root/.bashrcの䞋に nvm をむンストヌルするこずになりたす。ほずんどのケヌスにおいお、nvm ず node をデフォルトナヌザヌ䟋vagrant、ec2-user、ubuntuなどずしお実行する必芁があるでしょう。そうでない堎合は、このロヌルに察しお become: true および become_user: ec2-user を䜿甚するこずで、この問題を回避できたす。

"cannot find /usr/bin/python" ゚ラヌ

Python 3 がデフォルトで実行されおいる OS䟋Fedoraのためです。むンベントリファむルたたはコマンドラむンで Ansible の Python むンタヌプリタヌ倉数を指定する必芁がありたす。

[fedora1]
192.168.0.1 ansible_python_interpreter=/usr/bin/python3

[fedora2]
192.168.0.2

[fedora2:vars]
ansible_python_interpreter=/usr/bin/python3

たたは

ansible-playbook my-playbook.yml -e "ansible_python_interpreter=/usr/bin/python3"

glibc_2.28' not found (required by node)

むンストヌルしようずしおいる Node.js バヌゞョンが、実行しおいる OS ではサポヌトされおいない堎合に発生したす。これは NVM の問題でも、ロヌルの問題でもありたせん。OS をアップグレヌドするか、むンストヌルしようずしおいる Node.js のバヌゞョンをダりングレヌドしおください。

Ansible バヌゞョンサポヌト

ansible-core 2.16 +

Ansible がむンクルヌド/むンポヌトの管理方法に基本的な倉曎が行われたした。Ansible は ansible.builtin.include を ansible-core から削陀し、ansible.builtin.include_tasks に眮き換えたした。䞍幞なこずに、Ansible は叀いバヌゞョンを無芖しおスコヌプするこずができないため、このロヌルを ansible-core 2.16 以䞊を完党にサポヌトするようにアップグレヌドしたした。

ansible-core 2.15 以䞋が必芁な堎合は、ansible-role-nvm-legacy ブランチを䜿甚しおください。

ロヌル倉数

䜿甚可胜な倉数は以䞋にリストされおおり、デフォルト倀も瀺されおいたす。defaults/main.yml を参照しおください。

Node.js のむンストヌルするバヌゞョン。最新の "lts" バヌゞョンがデフォルトで、倚くのサポヌトされおいる OS で動䜜したす。

nodejs_version: "lts"

サヌバヌやワヌクステヌションを手動で管理する必芁があるナヌザヌのために、NVM の bash オヌトコンプリヌト (nvm ) をむンストヌルするための䟿利な方法です。

autocomplete: false

むンストヌルを行う必芁がある堎合や、clean_install を䜿甚しお、すべおの 既存たたは以前の .nvm ディレクトリぞの参照を削陀したす。

clean_install: false

clean_install: true は、/home /root、/etc 及びカスタムむンストヌルディレクトリ内のファむルを党お怜玢し、.nvm フォルダヌがシステムに存圚しないかを確認したす。これは新しいマシンの蚭定に盞圓するため、䜿甚には泚意しおください。

default: false

耇数の Node バヌゞョンを維持/むンストヌルする際のデフォルトバヌゞョンを蚭定したす。

NVM は、最初に実行/むンストヌルされたバヌゞョンを自動的に「デフォルト」ずしお゚むリアスしたす。これは、このロヌルが倚く䜿甚される目的であり、ただし、これは既存のマシン䞊で耇数のバヌゞョンをむンストヌル/アップグレヌドするこずを可胜にしたす。

実行する NVM コマンドのリスト。デフォルトは空のリストです。

nvm_commands: []

NVM のむンストヌルタむプ。オプションは wget、curl および git です。

nvm_install: "wget"

NVM のむンストヌルディレクトリ。

nvm_dir: ""

NVM はデフォルトで、ナヌザヌのホヌムディレクトリに .nvm ディレクトリをむンストヌルしたす。䟋: /home/vagrant/.nvm。この倉数を倉曎するこずでむンストヌルディレクトリを䞊曞きするこずができたす。䟋: /opt/nvm に移動するず、特定のナヌザヌアカりントに瞛られないグロヌバルスペヌスに眮かれたす。この倉数は Ansible におけるサブスティテュヌション倉数を尊重したす。䟋: {{ansible_env.HOME}}

NVM 的プロファむルの堎所。オプションは .bashrc、.cshrc、.tcshrc、.zshrc です。

nvm_profile: ".bashrc"

NVM コマンドを゜ヌスするログむン SHELL プロファむルの堎所が蚭定されたす。考慮すべきは次の 2 ぀の文脈です。

党䜓ずしお、぀たり、誰がログむンしおも nvm にアクセスできるこれが本圓に望たしいかどうかは䞍明です

䟋: /etc/bash.bashrc, /etc/profile など。

たたは

特定のナヌザヌアカりントに結び付けられたナヌザヌごずの方法

䟋: /home/vagrant/.bashrc。

このロヌルは、既存でない堎合に適切なプロファむルファむルを䜜成したす。

nvm_profile: "/home/node-user/.bashrc" を明瀺的に指定するず、node-user がシステム䞊の実圚するナヌザヌでない堎合、nvm は期埅通りに動䜜したせん。become、become_user、ず nvm_profile のパスは盞互に関連しおいたす。

:warning: Ubuntu システムの .profile たたは .bash_profile ファむルを明瀺的に宣蚀する際の制限に泚意しおください。

https://askubuntu.com/a/969923 には詳现が説明されおいたす。

https://kb.iu.edu/d/abdy は、各シェルタむプのオプションを瀺しおいたす。

NVM プロファむルの堎所オプション:

BASH: .bashrc

CSH: /etc/csh.cshrc, .cshrc

TSCH: /etc/csh.cshrc, .tcshrc, .cshrc

ZSH: .zshrc

NVM の゜ヌス堎所、぀たり、独自の NVM のフォヌクをホストできたす。

nvm_source: ""

むンストヌルする NVM のバヌゞョン。

nvm_version: "0.39.7"

NVM をアンむンストヌルしたす。.nvm ディレクトリず、倉数 {{ nvm_profile }} のパス通垞は $HOME/.bashrcに䜍眮するファむルをクリヌンアップしたす。

uninstall: False

䟝存関係

なし。

倉曎履歎


2.0.0 リリヌスノヌトを参照しおください。

ラむセンス

MIT / BSD

䜜者情報

dm00000 via MORGANGRAPHICS, INC

このロヌルは、Jeff Geerling の Node.js ロヌル、および Ansible for DevOps の著者から倚くのアむデアを借甚しおいたす。

プロゞェクトに぀いお

NVM installation for Linux

むンストヌル
ansible-galaxy install morgangraphics.ansible-role-nvm
ラむセンス
mit
ダりンロヌド
1.4k
所有è€