notebook

都内でWEB系エンジニアやってます。

ansible でgrowthforecast + daemontools

ansible でgrowthforecastを起動するまで

業務でgrowthforecastでも入れようかって話が上がってたのでちょっとやってみました。

下記を参考にしました。(というかほぼこp。。。。)

Ansible で Growthforecast をインストールする方法

まるコピしたら勉強する意味が無いので色々自分なりにやってみました。

perlbrewの導入ではまってなかなか出てこれず。。。

結構時間使ったので行った作業などをメモ

作ったファイルは以下

|-- roles
|   |-- perlbrew
|   |   |-- defaults
|   |   |   `-- main.yml
|   |   |-- tasks
|   |   |   `-- main.yml
|   |   `-- vars
|   |       `-- main.yml
|   |-- daemontools
|   |   |-- tasks
|   |   |   `-- main.yml
|   |   |-- templates
|   |   |   `-- svscan.j2
|   |   `-- vars
|   |       `-- main.yml
|   `-- growthforecast
|       |-- meta
|       |   `-- main.yml
|       |-- tasks
|       |   |-- main.yml
|       |   `-- packages.yml
|       |-- templates
|       |   |-- env.j2
|       |   `-- run.j2
|       `-- vars
|           `-- main.yml
|-- simple-playbook.yml
`-- test-hosts

role以下のファイルは下記に置いてあります。

playbooks

sudo_user

基本的にはsudoでroot権限でコマンドを実行しているが、sudo_userを指定する事でそのユーザーでコマンドを実行することが出来る

perlbrewとかはユーザ権限でインストールするのでそういう場合に使えるっぽいです

# roles/perlbrew/tasks/main.yml
- name: install perlbrew
  action: shell curl -L http://install.perlbrew.pl | bash
  sudo_user: "vagrant"

今回はvagrantユーザで実行するようにしたのでgrowthforecastもvagrantユーザで立ち上げる形になります。

余談ですが本当はgrowthforecast用にユーザーを作ってそのユーザでコマンドを実行させたかったけど、実行側のマシンにあるユーザ(sshで接続してコマンドを実行)でないとうまく動かす事が出来なかった。

perlbrewのインストールまではうまくいく、しかしperlbrewのswitchがいつまでたっても終らない!!

色々調べた結果原因はコマンド実行時にperlbrewの環境変数がうまく読み込めてないようだった

sudoオプションで何とかしようと思ったけど、sudo_flagsの使い方が良く分からず。。

結構時間使ってしまったのであえなく妥協

なんか知ってる方いたら教えてください!

file

  • ファイルまたはディレクトリを作成する
# roles/daemontools/tasks/main.yml
- name: daemontools directory for env
  file: path={{ home_dir }}/bin state=directory owner={{ gf_user }} group={{ gf_user }} mode=755

直感的に分かる感じですね

このほかにもシンボリックリンクとかも貼れるみたいです

template

  • 設定ファイルなど予めテンプレート化したものを適用させる
  • rolesのなかのtemplatesディレクトリの中から読み込まれる
# roles/growthforecast/tasks/main.yml
- name: daemontools runfile
  template: src=run.j2 dest=/var/service/growthforecast/run owner={{ gf_user }} group={{ gf_user }} mode=0775

今回はgrowthforecastをdaemontoolsでデーモン化したのでrunファイルを設定する必要がありました。

tasksなどと同じように変数も記述できます。

使い方としてはユーザ名とかサーバの情報とかを入れる感じですかね

# roles/growthforecast/templates/run.j2
#!/bin/sh
exec 2>&1

exec setuidgid {{ gf_user }}\
  {{ home_dir }}/bin/env \
  growthforecast.pl

上記をdestで指定したパスに設置してくれます

role

変数の受け渡し

今回のようにgrowthforecastをインストールするまでに

  • perlbrewのインストール
  • daemontoolsのインストール

という二つの手順が発生しますがそれぞれroleとして定義してあげる事で他のplaybookでも流用できるようになります。

今回はgrowthforecastもrole化したのでsimple-playbook.ymlはシンプル

---
- hosts: test-servers
  sudo: yes
  roles:
    - growthforecast

daemontools,perlbrewはどこに行ったの??

依存関係を定義するファイルに定義してあります。(metaというディレクトリを読みに行きます)

この場合growthforecastをインストールするためにはdaemontools,perlbrewが必要になりますよという記述をしています

順序としてはまず依存roleから処理されていきます

なので今回は

という順番で処理が実行されていきます

# roles/growthforecast/meta/main.yml
dependencies:
  - { role: perlbrew, exec_user: "{{ gf_user }}", version: "{{ perl_ver }}"}
  - { role: daemontools, service: growthforecast, service_user: "{{ gf_user }}" }

ここでのポイントは依存するroleに対して変数を渡せる事です

roleで依存するrole名をいれてカンマ区切りで変数を定義することが出来ます

ここで渡した変数はそのroleで使うことが出来ます

この場合、daemontoolsのファイルにserviceという変数を使っていたらそれは「growthforecast」として実行してくれます。varsで指定した変数を渡す事も出来ます。便利!

varsで指定したり変数渡したり、コマンドラインから渡したり出来るようですが優先順位はこちらに書いてありました。

ansible 変数の優先度

今回やったのはこのくらいです。

アップ前に確認したら普通にsourceとか打って環境変数読み込めばいける気がしてきた。。。

大分勉強になったけどちょっと複雑な事やろうとするとついshellに逃げてしまうのでもっと調べたいところ