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以下のファイルは下記に置いてあります。
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から処理されていきます
なので今回は
- perlbrew
- daemontools
- growthforecast
という順番で処理が実行されていきます
# 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で指定したり変数渡したり、コマンドラインから渡したり出来るようですが優先順位はこちらに書いてありました。
今回やったのはこのくらいです。
アップ前に確認したら普通にsourceとか打って環境変数読み込めばいける気がしてきた。。。
大分勉強になったけどちょっと複雑な事やろうとするとついshellに逃げてしまうのでもっと調べたいところ