はじめに
AnsibleでRuby環境を構築するハンズオン?資料?メモ?です。
本記事は下記を経験したことがある人向けとなります。
- Ruby環境を構築したことがある
- Ansibleを触ったことがある
事前環境準備
- vagrantとvirtualboxをインストール
$ brew cask install vagrant
$ brew cask install virtualbox
環境
- OS X Sierra 10.12.6
- Vagrant 2.1.2(ansible 2.6.2)
- VirtualBox 5.2.14
vagrant設定
作業ディレクトリを作成し移動
$ mkdir ansible-ruby; cd $_
vagrant初期設定
$ vagrant init mvbcoding/awslinux
仮想マシンの設定
Vagrant.configure(2) do |config|
config.vm.define :ansible_host do |node|
node.vm.box = "mvbcoding/awslinux"
node.vm.network :forwarded_port, guest: 22, host: 2001, id: "ssh"
node.vm.network :private_network, ip: "192.168.33.11"
end
config.vm.define :server_1 do |node|
node.vm.box = "mvbcoding/awslinux"
node.vm.network :forwarded_port, guest: 22, host: 2002, id: "ssh"
node.vm.network :forwarded_port, guest: 80, host: 8000, id: "http"
node.vm.network :private_network, ip: "192.168.33.12"
end
end
仮想マシン起動
$ vagrant up
ステータス確認
$ vagrant status
仮想マシンにssh接続
$ vagrant ssh ansible_host
$ vagrant ssh server_1
(補足)ちょくちょく使うコマンド
# 仮想マシンリロード
$ vagrant reload
# 仮想マシン停止
$ vagrant halt
# 仮想マシン削除
$ vagrant destroy
トラブルシューティング
ホストOSとファイル共有設定をしている場合、vagrant up
時にGuest Additionsバージョン違いのエラーが出ると思いますので、vagrant-vbguest
プラグインをインストールし、vagrant up
とvagrant halt
を繰り返して下さい。。。。(数回)
$ vagrant plugin install vagrant-vbguest
ansible_hostサーバにAnsibleをインストール
# Ansibleインストール
$ sudo yum -y --enablerepo=epel install ansible
# バージョン確認
$ ansible --version
ansible 2.6.2
AmazonLinux2にAnsibleをインストールする場合はamazon-linux-extras
コマンド経由で
インストールすると色々と便利です。
$ sudo amazon-linux-extras install ansible2
Ansible実行前準備
- Ansibleは操作したい対象サーバにSSH接続して環境を構築します。
# SSH鍵作成
$ ssh-keygen -t rsa
# ユーザー作成
$ sudo useradd ansible
# ansibleユーザーにホストサーバで作成した公開鍵(id_rsa.pub)を設置
$ sudo su - ansible
$ mkdir .ssh
$ chmod 700 .ssh
$ vim ~/.ssh/authorized_keys
$ chmod 600 ~/.ssh/authorized_keys
# ansibleユーザーにsudo権限付与(rootユーザーで実行してください)
$ visudo
(下記1行を追加)
ansible ALL=(ALL) NOPASSWD: ALL
# SSH接続
$ ssh ansible@192.168.33.12
※ 今回はsudoコマンドをパスワードなしで実行させてますが、管理上好ましくないためご注意ください。
インベントリファイルの作成
- 対象サーバを指定するためにインベントリファイルを作成します。
$ vi hosts
---
[server1]
192.168.33.12
- 対象サーバにansibleコマンドで接続確認(ユーザーを指定)
$ ansible server1 -i hosts -u ansible -m ping
192.168.33.12 | SUCCESS => {
"changed": false,
"ping": "pong"
}
Ruby環境構築時のおさらい
プレイブックに書き出す前にイメージし易いようRuby環境構築手順の流れをざっくり書いておきます。
- gitやgcc、openssl-develなど必要なパッケージ群をインストール
- rbenvインストール
- システムワイドに使えるよう
/etc/profile.d/
配下にシェルを設置 - ruby-buildインストール
- rbenvコマンドが実行出来るグループを作成
- 適宜ユーザーをグループに所属させる
- rbenvディレクトリ配下の所有グループを変更
- rbenvを使ってrubyをインストール
- bundlerインストール
プレイブックファイルの作成
それでは上述した環境構築手順を参考にプレイブックファイルを作成していきます。
※今回ansibleの書き方に慣れてもらうためフォルダ構成はシンプルにしています。
- 初期定義
$ vi site.yml
---
- hosts: server1 # インベントリファイルの対象サーバを指定
become: yes # rootユーザーでの実行
- yum update(yum-module)
tasks:
- name: 'yum update'
yum:
name: '*'
state: latest
- 必要なパッケージ群をインストール(yum-module)
...
- name: 'Install packages'
yum:
name: "{{ item }}"
with_items:
- git
- gcc
- openssl-devel
- libyaml-devel
- readline-devel
- zlib-devel
- libffi-devel
- rbenvインストール(git-module)
- name: 'Install rbenv'
git:
repo: https://github.com/sstephenson/rbenv.git
dest: /usr/local/rbenv
- rbenvのパス設定(template-module)
システムワイドに利用出来るように/etc/profile.d/
配下にこのようなshファイルを配置します。
export RBENV_ROOT="/usr/local/rbenv"
export PATH="${RBENV_ROOT}/bin:${PATH}"
eval "$(rbenv init -)"
site.yml
と同じディレクトリ内に「templates」フォルダを作成し、テンプレートファイルを.j2
拡張子ファイルで格納しておきます。(j2とはpython用のテンプレートエンジンライブラリ jinja2)
export RBENV_ROOT="/usr/local/rbenv"
export PATH="${RBENV_ROOT}/bin:${PATH}"
eval "$(rbenv init -)"
- name: 'rbenvのshファイルを配置'
template:
src: rbenv_system.sh.j2
dest: /etc/profile.d/rbenv.sh
owner: root
group: root
mode: 0755
(補足)shellコマンドを使って下記のようにも書けますが・・・なんかイマイチ。。。
shell: echo 'export PATH="export RBENV_ROOT=/usr/local/rbenv"' >> /etc/profile.d/rbenv.sh
shell: echo 'export PATH="export PATH="${RBENV_ROOT}/bin:${PATH}""' >> /etc/profile.d/rbenv.sh
shell: echo 'eval "$(rbenv init -)"' >> /etc/profile.d/rbenv.sh
- ruby-buildインストール(git-module)
- name: 'ruby-buildインストール'
git:
repo: https://github.com/sstephenson/ruby-build.git
dest: /usr/local/rbenv/plugins/ruby-build
- rbenvコマンドが実行出来るグループを作成(group-module)
- name: 'deploy用のグループを作成'
group:
name: deploy
- ansibleユーザーをdeploy用グループに所属させる(user-module)
- name: 'ansibleユーザーをdeployグループに所属'
user:
name: ansible
groups: deploy
- rbenvディレクトリの所有グループをdeployグループに変更(file-module)
- name: 'rbenvディレクトリの所有グループをdeployに変更'
file:
path: /usr/local/rbenv
owner: root
group: deploy
recurse: yes
state: directory
- rubyインストール(shell-module)
- name: 'rubyインストール'
shell: bash -lc "rbenv install --skip-existing 2.5.0"
- インストールしたRubyバージョンをglobalセット(shell-module)
- name: 'globalセット'
shell: bash -lc "rbenv global 2.5.0"
- bundlerインストール(gem-module)
- name: 'bundlerインストール'
gem:
name: bundler
user_install: no
executable: /usr/local/rbenv/shims/gem
確認〜実行
Syntax Check
$ ansible-playbook site.yml -i hosts --syntax-check
Dry Run
$ ansible-playbook site.yml -i hosts -u ansible --check
Run ♪
$ ansible-playbook site.yml -i hosts -u ansible
$ ruby -v
ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-linux]
Dry Run実行時の注意点
dry-run実行時はリモートシステム上での変更は行われないため実行したコマンド結果に依存する処理の場合、何かしらエラーになってしまいます。
ansible 2.2以降からcheck_mode
オプションが追加され、
下記のように記述することで--check
オプション実行時にtaskをスキップしてくれます。
tasks:
- name: 'yum update'
yum:
name: '*'
state: latest
check_mode: yes
まとめ
Ansibleでは様々な書き方ができ、模範となる回答が探し難いのですがとりあえず動けばいいやのノリで作成してみました。(色々とツッコミあればください )
次回はディレクトリ構成や冪等性などに触れてみたいと思います
今回のソース置き場