こんにちは。SREチーム インフラエンジニアの綿引です。

2018/4/24 に Node.js 10系がリリースされましたね。
(私の誕生日です。)

そこで今回は Node.js のアップデートを Ansible を用いて実施する
という記事を書きたいと思います。

Node.js のアップデート方法に関しては、
1. 既存の Node.js(過去に yum でインストール)をアンインストール後、
2. Ansible の shell モジュール を用い Node.js を rpm でインストールする
という形にしました。

10 系を使うものの Node.js に関しての性能や新機能などの検証は行わないので
ご容赦のほどをお願い致します。

Node.js のバージョンについて

まず Node.js のバージョンに関してですが、
今回 10系をインストールするにあたって LTS などの用語をもう一度調べ直してみました。

LTS (Long Term Support)

Node.js のメジャーバージョン(6.X 、8.X など)は大きく分けて偶数と奇数に分けられます。
偶数が LTS版 と呼ばれる、サポート(※1)が長期に受けられるもので、
奇数が最新機能版で、サポート期間も LTS版に比べると非常に短くなっております。

※1 … バグの修正やセキュリティアップデート

リリースステータス

リリースステータス ・ 各ステータスの期間などに関しては、
Github にて公開されている以下をご確認頂くのが最も早いと思うので、
リンクを載せておきます。

https://github.com/nodejs/Release

因みに私なりにまとめると、、
Node.js のリリースステータスとして、以下の3つが存在します。

・CURRENT
・ACTIVE LTS
・MAINTENANCE LTS

リリースされると、
LTS版、奇数版、どちらもステータスとしては『CURRENT』になり、その後LTS版のみ、
長期サポート期間である『ACTIVE LTS』・『MAINTENANCE LTS』ステータスに移行します。
奇数版に関しては、『CURRENT』が終了した時点でサポートが終了する仕組みのようです。

それぞれの期間に関しては、
『CURRENT』 が約6ヶ月、『Active』 が18ヶ月、『Maintenance』 が12ヶ月となっているようです。

上記を全てまとめると以下です。

リリースステータス 内容 期間
CURRENT  現在の最新版  約6ヶ月
ACTIVE LTS  サポートが積極的に行われる  18ヶ月
MAINTENANCE LTS  最低限のサポートが行われる  12ヶ月

最後に Node.js 10系 のサポート期間に関してですが、
LTS版なので以下のようになります。

Node.js 10系 の リリースステータス 期間
CURRENT 2018/4 〜 2018/10
Active LTS 2018/10 〜 2020/4
Maintenance LTS 2020/4 〜 2021/4

こちら参考にして頂けたら幸いです。

環境

では Node.js にも詳しくなったところで、早速構築してきます。

環境に関しては サーバ 1台、クライアント 2台としており
OS は CentOS 6、7 どちらも使用する形で進めて行きたいと思います。
環境情報の詳細は以下です。

ローカル

・macOS 10.13.3
・Vagrant 2.0.3

サーバ (1台)

・ホスト名 ans
・CentOS 7.1
・Ansible 2.4.2.0

クライアント (2台)

1台目
・ホスト名 anc
・CentOS 7.1
・Node.js 6.8.1 (過去に yum で入れております)

2台目
・ホスト名 an6
・CentOS 6.5
・Node.js 6.8.1 (過去に yum で入れております)

※ ホスト名は適当につけたので気にしないでください。

図にするこのような感じです。

名称未設定ファイル (5)

Ansible 設定

Ansible の設定は以下となります。

ディレクトリ構成

ディレクトリ構成は以下のようにしております。
ベストプラクティスにならって ansible-playbook を実行する際は、
トッププレイブックである node_version_up-YYYYMMDD.yml をキックし、
処理自体はその配下のディレクトリの Roles 配下で制御していきます。

/opt
  └ ansible/
      ├ node_version_up-YYYYMMDD.yml    # トッププレイブック
      ├ hosts                           # インベントリファイル
      └ playbook/                       
          ├ nodejs_version_up.yml       # トッププレイブックから読み込むプレイブック
          └ nodejs_version_up/          # Roles
                   └ tasks
                       └ main.yml

node_version_up-YYYYMMDD.yml(トッププレイブック)

トッププレイブックの中身としては nodejs_version_up.yml を読み込むだけになっております。

---
- include: playbook/nodejs_version_up.yml

hosts(インベントリファイル)

インベントリファイルには、クライアント2台を an_clients というグループとして設定致しました。

[an_clients]
anc
an6

nodejs_version_up.yml (トッププレイブックから読み込むプレイブック)

こちらは roles を用い、
nodejs_version_up ディレクトリ配下のファイルを実行する形になっています。

# /opt/ansible/playbook/nodejs_version_up.yml

- hosts: an_clients
  remote_user: vagrant
  become: yes
  roles:
    - nodejs_version_up

main.yml

tasks ディレクトリ配下の実行ファイルです。
処理自体は非常に簡単でしたので、シンプルな作りとしております。
中身に関しては冒頭でも記載致しましたが、
一度、アンインストールして rpm でインストールする形をとっております。

# file: /opt/ansible/playbook/nodejs_version_up/tasks/main.yml

  - name: remove nodejs
    yum: 
      name: nodejs
      state: absent

  - name: install nodejs 10.3.0
    shell: rpm -Uvh https://rpm.nodesource.com//pub_10.x/el/6/x86_64/nodejs-10.3.0-1nodesource.x86_64.rpm

実行

では実行して行きます。

[vagrant@ans ~]$ cd /opt/ansible
[vagrant@ans ansible]$ ansible-playbook -i hosts node_version_up-20180601.yml
[DEPRECATION WARNING]: 'include' for playbook includes. You should use 'import_playbook' instead. This feature will be removed in version 2.8. Deprecation warnings can be disabled by setting deprecation_warnings=False in
ansible.cfg.

PLAY [an_clients] ************************************************************************************************************************************************************************************************************

TASK [Gathering Facts] *******************************************************************************************************************************************************************************************************
ok: [anc]
ok: [an6]

TASK [nodejs_version_up : remove nodejs] *************************************************************************************************************************************************************************************
ok: [anc]
ok: [an6]

TASK [nodejs_version_up : install nodejs 10.3.0] *****************************************************************************************************************************************************************************
 [WARNING]: Consider using yum, dnf or zypper module rather than running rpm

changed: [anc]
changed: [an6]

PLAY RECAP *******************************************************************************************************************************************************************************************************************
an6                        : ok=3    changed=1    unreachable=0    failed=0
anc                        : ok=3    changed=1    unreachable=0    failed=0

では確認していきます。

クライアント 1台目(CentOS7)

こちらは問題なさそうです。

[vagrant@anc ~]$ node -v
v10.3.0
[vagrant@anc ~]$
[vagrant@anc ~]$ npm -v
6.1.0

クライアント 2台目 (CentOS6)

こちらも大丈夫そうですね。

[vagrant@an6 ~]$ node -v
v10.3.0
[vagrant@an6 ~]$
[vagrant@an6 ~]$ npm -v
6.1.0
[vagrant@an6 ~]$

まとめ

Node.js を Ansible でアップデートする情報より、Node.js の LTS の情報の方に力を入れてしまいました。

Ansible に関しては、対象機能のプレイブックを一回作ってしまえば、
あとは使い回すだけなので運用が非常に楽になりオススメです。
引き続き Ansible を活用していきたいと思いました。

この度は、ご清覧頂きありがとうございました。
Wedding Parkでは一緒に技術のウエディングパークを創っていくエンジニアを募集しています。
興味のある方はぜひ一度気軽にオフィスに遊びにいらして頂ければと思います。

ブライダル業界のデジタルシフトを加速させるリードエンジニア候補募集!

Join Us !

ウエディングパークでは、一緒に働く仲間を募集しています!
ご興味ある方は、お気軽にお問合せください(カジュアル面談から可)

採用情報を見る