😼

Ansibleで環境構築を自動化する!③

2021/04/14に公開

はじめに

くーばねてすを倒すために今回はNode.jsをやっつけないといけなくなったのでNode.jsの設定をデーモン化したものをAnsibleで自動化するために色々調べた(^^)/!

概要

■Ansibleで環境構築を自動化するには
■①SSHの設定
■②ターゲットノードで設定を行い内容を手作業で確認する
■playbookの特徴
■③手作業工程の手順をもとにplaybookを作成する。(コントロールノードで作成)

■④ターゲットノードにplaybookを実行する。

をまとめた!(^^)/
①SSHの設定までAnsibleで環境構築を自動化する!①にまとめて、
playbookの特徴までAnsibleで環境構築を自動化する!②にまとめた!

■③手作業工程の手順をもとにplaybookを作成する。(コントロールノードで作成)

構築したい環境を
Node.jsでパッケージ管理をしながら色々インストールする

Node.jsのスクリプトをデーモン化する!

Ansibleで環境構築を自動化する!②
にまとめたのでここを元に作成してみようと思う!!(^^)!(全然まとまってないけど!)
こんな感じで作成する。

└── ansible
    ├── ansible.cfg  #Ansibleの色々な設定が書いてあるやつ
    ├── hosts     #Ansibleの色々な接続設定とかが書いてあるやつ
    ├── inventory    #Ansibleで使用する接続サーバーの設定を自分で書いたやつ    
    ├── playbook.yml #Ansibleで実行したいタスク
    └── server.js  #Ansibleで実行したいファイル

Ansibleのターゲットノードを指定する内容はinventoryファイルに記述し、ansible.cfgファイルを以下のように変更する。
デフォルトはinventory=/etc/ansible/hostsであるのでinventory=./inventoryに変更する。

ansible.cfg
[defaults]

# some basic default values...

#inventory      = /etc/ansible/hosts
inventory   = ./inventory
略

https://qiita.com/c0tt0n-candy/items/1b109c53d8709717a1bb

foreverインストールまで

https://qiita.com/kheiakiyama/items/1e780c0495c090564b6e
nvmを使用してNode.jsをインストールしたかったけど1000回くらい頑張ったんだけどとうとう実行出来なかったので、代わりにnodebrewというNode.jsのバージョン管理ツールを使用した。

playbook.yml
---
- hosts: all
  remote_user: suidou
  tasks:

    - name: download and install nodebrew
      shell: curl -L git.io/nodebrew | perl - setup
      args:
        creates: "{{ ansible_env.HOME }}/.nodebrew"

    - name: path to current node
      lineinfile:
        dest=~/.bashrc
        state=present
        line="PATH={{ ansible_env.HOME }}/.nodebrew/current/bin:$PATH"

    - name: install node安定版
      shell: |
        nodebrew install-binary stable 
        nodebrew alias default stable
        nodebrew use stable
        npm install -g webpack
      args:
        creates: "{{ ansible_env.HOME }}/.nodebrew/node/stable"

    - name: foreverをインストール
      shell: |
        npm install forever -g
      

playbookの文法が正しいかどうかを確認する。問題なければplaybook: playbook.ymlと表示される。

$ ansible-playbook  playbook.yml --syntax-check 
playbook: playbook.yml

playbookをdry-runでリハーサルテストする。

playbookをdry-runするのは-Cオプションを使用する。より詳細の内容を確認したければ、-vvvをつける。

$ ansible-playbook playbook.yml -C

PLAY [all] **********************************************************************************************************************************************************************************

TASK [Gathering Facts] **********************************************************************************************************************************************************************
[WARNING]: Platform linux on host xx.xx.xx.xx is using the discovered Python interpreter at /usr/bin/python, but future installation of another Python interpreter could change this. See
https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information.
ok: [xx.xx.xx.xx]

TASK [download and install nodebrew] ********************************************************************************************************************************************************
ok: [xx.xx.xx.xx]

TASK [path to current node] *****************************************************************************************************************************************************************
ok: [xx.xx.xx.xx]

TASK [install node] *************************************************************************************************************************************************************************
changed: [xx.xx.xx.xx]

TASK [foreverをインストールする] *********************************************************************************************************************************************************************
changed: [xx.xx.xx.xx]

PLAY RECAP **********************************************************************************************************************************************************************************
xx.xx.xx.xx             : ok=4    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

https://qiita.com/YumaInaura/items/3a9282f3e7eee9ca2af3

エラーメッセージなく問題なければplaybookを適用する。

$ ansible-playbook  playbook.yml
PLAY [all] **********************************************************************************************************************************************************************************

TASK [Gathering Facts] **********************************************************************************************************************************************************************
[WARNING]: Platform linux on host xx.xx.xx.xxis using the discovered Python interpreter at /usr/bin/python, but future installation of another Python interpreter could change this. See
https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information.
ok: [xx.xx.xx.xx]

TASK [download and install nodebrew] ********************************************************************************************************************************************************
[WARNING]: Consider using the get_url or uri module rather than running 'curl'.  If you need to use command because get_url or uri is insufficient you can add 'warn: false' to this command
task or set 'command_warnings=False' in ansible.cfg to get rid of this message.
changed: [xx.xx.xx.xx]

TASK [path to current node] *****************************************************************************************************************************************************************
changed: [xx.xx.xx.xx]

TASK [install node] *************************************************************************************************************************************************************************
changed: [xx.xx.xx.xx]

TASK [foreverをインストールする] *********************************************************************************************************************************************************************
changed: [xx.xx.xx.xx]

PLAY RECAP **********************************************************************************************************************************************************************************
xx.xx.xx.xx             : ok=5    changed=4    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Node.jsのスクリプトをforeverでデーモン化する

用意したスクリプト。↓

server.js
const http = require('http');      #httpモジュールの読み込み
 
const hostname = '127.0.0.1';      #ポートとホスト名を指定
const port = 3000;
 
const server = http.createServer((req, res) => {
  res.statusCode = 200;                   #処理を記述
  res.setHeader('Content-Type', 'text/plain');
  res.end('Hello World\n');
});
 
server.listen(port, hostname, () => {        #アドレス
  console.log(`Server running at http://${hostname}:${port}/`);
});

Node.jsのスクリプトをforeverでデーモン化するplaybookを作成する。

playbook2.yml
- hosts: all
  remote_user: suidou
  tasks:
    - name: server.jsをコピーする
      copy:
        src: ./server.js
        dest: /tmp
        mode: 0644
    - name: server.jsをデーモン化する
      shell: |
        forever start /tmp/

playbookをdry-runでリハーサルテストする。

$ ansible-playbook playbook2.yml -C
$ ansible-playbook playbook2.yml

PLAY [all] **********************************************************************************************************************************************************************************

TASK [Gathering Facts] **********************************************************************************************************************************************************************
[WARNING]: Platform linux on host xx.xx.xx.xx is using the discovered Python interpreter at /usr/bin/python, but future installation of another Python interpreter could change this. See
https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information.
ok: [xx.xx.xx.xx]

TASK [server.jsをコピーする] **********************************************************************************************************************************************************************
ok: [xx.xx.xx.xx]

TASK [server.jsをデーモン化する] ********************************************************************************************************************************************************************
changed: [xx.xx.xx.xx]

PLAY RECAP **********************************************************************************************************************************************************************************
xx.xx.xx.xx             : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

まとめ

長いので続く!

Discussion