Ansibleで環境構築を自動化する!③
はじめに
くーばねてすを倒すために今回は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に変更する。
[defaults]
# some basic default values...
#inventory = /etc/ansible/hosts
inventory = ./inventory
略
foreverインストールまで
nvmを使用してNode.jsをインストールしたかったけど1000回くらい頑張ったんだけどとうとう実行出来なかったので、代わりにnodebrewというNode.jsのバージョン管理ツールを使用した。
---
- 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
エラーメッセージなく問題なければ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でデーモン化する
用意したスクリプト。↓
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を作成する。
- 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