現状InfluxDBのInstall手順があるのでなるべく楽してClusterのセットアップをしたい。 当方Ansibleは初。Pythonもそんなに書いていないので得意ではない。インフラ歴はほどほど。
今日はざっくりとしたログ形式でお届けします。
まずはansible tutorialでぐぐる。ほむほむ
http://yteraoka.github.io/ansible-tutorial/#test-ansible
上のほうから試してみます
ansible 172.16.169.167 -m ping
ERROR: Unable to find an inventory file, specify one with -i ?
なるほど
echo 172.16.169.167 > hosts
ansible -i hosts 172.16.169.167 -m ping
つながった
ansible -i hosts 172.16.169.167 -a 'uname -r'
172.16.169.167 | success | rc=0 >>
3.13.0-24-generic
macbook-2% ansible -i hosts 172.16.169.167 -m apt -s -a name=telnet
172.16.169.167 | FAILED => Missing sudo password
あれー。できない。helpを見てask-sudo-passが必要らしいのでつけて実行してみることに
ansible -i hosts 172.16.169.167 -m apt -s -a name=telnet --ask-sudo-pass
sudo password:
172.16.169.167 | success >> {
"changed": false
}
と、いうことでなんとなく-iでwhitelist的なものの指定。-mでモジュールなんだろうなーというのと -aはよくわからんけどhelpを見る限りだとmoduleの引数が指定できるらしい。-sはsudoで実行、ということが分かりました
続けてplaybookも書いてみます。
[test-server]
172.16.169.167
- hosts: test-servers
sudo: yes
tasks:
- name: hoge
apt: name=apache2 state=installed
- name: run
service: name=apache2 state=running enabled=yes
syntax checkを実行
ansible-playbook -i hosts playbook.yml --syntax-check
playbook: playbook.yml
playbookに記載されているタスク一覧を確認
macbook-2% ansible-playbook -i hosts playbook.yml --list-tasks
playbook: playbook.yml
play #1 (test-servers):
hoge
run
dry-run的な機能の実行
ansible-playbook -i hosts playbook.yml --check
PLAY [test-servers] ***********************************************************
GATHERING FACTS ***************************************************************
fatal: [172.16.169.167] => Missing sudo password
TASK: [hoge] ******************************************************************
FATAL: no hosts matched or all hosts have already failed -- aborting
PLAY RECAP ********************************************************************
to retry, use: --limit @/Users/chobie/playbook.retry
172.16.169.167 : ok=0 changed=0 unreachable=1 failed=0
それではdry-runを動かしてみます。
macbook-2% ansible-playbook -i hosts playbook.yml --check --ask-sudo-pass
sudo password:
PLAY [test-servers] ***********************************************************
GATHERING FACTS ***************************************************************
ok: [172.16.169.167]
TASK: [hoge] ******************************************************************
changed: [172.16.169.167]
TASK: [run] *******************************************************************
failed: [172.16.169.167] => {"failed": true}
msg: service not found: apache2
FATAL: all hosts have already failed -- aborting
PLAY RECAP ********************************************************************
to retry, use: --limit @/Users/chobie/playbook.retry
172.16.169.167 : ok=2 changed=1 unreachable=0 failed=1
なるほど。そりゃまだapache2のinstallしていないから動いてないもんなー。続いて本実行
macbook-2% ansible-playbook -i hosts playbook.yml --ask-sudo-pass
sudo password:
PLAY [test-servers] ***********************************************************
GATHERING FACTS ***************************************************************
ok: [172.16.169.166]
TASK: [hoge] ******************************************************************
changed: [172.16.169.166]
TASK: [run] *******************************************************************
ok: [172.16.169.166]
PLAY RECAP ********************************************************************
172.16.169.166 : ok=3 changed=1 unreachable=0 failed=0
冪等性があるということなので。試してみます
macbook-2% ansible-playbook -i hosts playbook.yml --ask-sudo-pass
sudo password:
PLAY [test-servers] ***********************************************************
GATHERING FACTS ***************************************************************
ok: [172.16.169.166]
TASK: [hoge] ******************************************************************
ok: [172.16.169.166]
TASK: [run] *******************************************************************
ok: [172.16.169.166]
PLAY RECAP ********************************************************************
172.16.169.166 : ok=3 changed=0 unreachable=0 failed=0
なるほど。
FACTSというのは変数なんですね。恐らくBest practiceまでやりきるのは面倒そうなので今日は簡単にいこうと思います。
http://tdoc.info/blog/2013/05/10/ansible_for_beginners.html
shell scriptを使うのは便利ですが今日は頑張ってAnsibleっぽい方法でやりたいですね! まずはInstall手順を整理してみましょう
-
- roleを指定する(InfluxDBのseedノードと傘下ノードの設定を分ける)
-
- InfluxDBのインストールを行う
-
- それぞれに適した設定を配布する
-
- InfluxDBの実行をする
多分こんな感じの順番でできればOK。ですね.
ひとまず、Vmware FusionでUbuntu14.04の新規VMを準備。ssh鍵のコピーなどは事前に済ませてコピーを作っておきます。 それまではAnsibleの説明読んだり、試しに動かしたりしてみて見ます。
InfluxDBのインストールはdebファイルが提供されているのでそれをダウンロードして使うことにします。
http://s3.amazonaws.com/influxdb/influxdb_latest_amd64.deb
ふむふむ。apt_moduleというのがあるのですねー。これにget_url_moduleを組み合わせればdeb packageをdownloadしてインストール、ということが出来そうです。
http://docs.ansible.com/apt_module.html http://docs.ansible.com/get_url_module.html
- get_url: dest=/tmp/ url=http://s3.amazonaws.com/influxdb/influxdb_latest_amd64.deb
- apt: deb=/tmp/influxdb_latest_amd64.deb
こんなところでしょうか。あとはconfigの配布もですね。
http://tdoc.info/blog/2014/05/30/ansible_target_switching.html
うーん。ちょっとこれだと難しい気がするのでもうちょっと楽な方法をあとで探してみることにします。
とりあえず、インストール手順を再度整理してみます
-
- InfluxDBのDebian packageをダウンロードする
-
- InfluxDBのインストールを行う
-
- それぞれに適した設定を配布する
-
- InfluxDBの実行をする
ok, 次はlocalにあるconfigファイルをリモートに送る方法を検討します。
http://docs.ansible.com/copy_module.html
InfluxDBのpackageでは/opt/influxdb/shared/config.tomlが実際のconfigとなるのでそこに対してファイルをコピーできれば良さそうです。 大本のconfig.tomlはpackageインストールしたやつをlocalに拾っておくことにします。
copy: src=config.toml dest=/opt/influxdb/shared/config.toml owner=influxdb group=influxdb mode=0644
あとはInfluxDBの起動ができればOKですね。これはシンプル。enabled=yesはlinux起動時に実行するかどうか、のフラグのようです。
- service: name=influxdb state=running enabled=yes
そうこうしている間にVMの準備ができてきたので始めます
172.16.169.167, 172.16.169.169の2台で実行することにします
まずは1台にインストールできるか試しておきたいので172.16.169.167のsnapshotを作ります。 事前にapt-get updateとopensshのインストール。公開鍵の設定までをやって停止してsnapshotを作成します。
ではplaybookの作成をしていきましょう。
macbook-2% mkdir myfirstplaybook
macbook-2% cd myfirstplaybook
hostsにグループをかけばいいということだったので、まずは172.16.169.167だけを対象にインストールから起動までできるかを作りこんでいきます。
cat >> hosts <<EOF
[influxdb]
172.16.169.167
EOF
cat >> playbook.yml <<EOF
- hosts: influxdb
sudo: yes
tasks:
- name: download InfluxDB debian package
get_url: dest=/tmp/ url=http://s3.amazonaws.com/influxdb/influxdb_latest_amd64.deb
- name: install InfluxDB
apt: deb=/tmp/influxdb_latest_amd64.deb
EOF
先ほどsyntax-checkとdry-runのやり方を覚えたので反復しておきます
macbook-2% ansible-playbook -i hosts playbook.yml --syntax-check
playbook: playbook.yml
macbook-2% ansible-playbook -i hosts playbook.yml --check --ask-sudo-pass
sudo password:
PLAY [influxdb] ***************************************************************
GATHERING FACTS ***************************************************************
fatal: [172.16.169.167] => SSH encountered an unknown error during the connection. We recommend you re-run the command using -vvvv, which will enable SSH debugging output to help diagnose the issue
TASK: [download InfluxDB debian package] **************************************
FATAL: no hosts matched or all hosts have already failed -- aborting
PLAY RECAP ********************************************************************
to retry, use: --limit @/Users/chobie/playbook.retry
172.16.169.167 : ok=0 changed=0 unreachable=1 failed=0
あれ、なんでしょう。エラーが出ていますね。-vvvつければ詳しく出ると聞いていたのでつけてみます。
macbook-2% ansible-playbook -i hosts playbook.yml --check --ask-sudo-pass -vvv
sudo password:
PLAY [influxdb] ***************************************************************
GATHERING FACTS ***************************************************************
<172.16.169.167> ESTABLISH CONNECTION FOR USER: chobie
<172.16.169.167> REMOTE_MODULE setup CHECKMODE=True
<172.16.169.167> EXEC ['ssh', '-C', '-tt', '-q', '-o', 'ControlMaster=auto', '-o', 'ControlPersist=60s', '-o', 'ControlPath=/Users/chobie/.ansible/cp/ansible-ssh-%h-%p-%r', '-o', 'KbdInteractiveAuthentication=no', '-o', 'PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey', '-o', 'PasswordAuthentication=no', '-o', 'ConnectTimeout=10', '172.16.169.167', "/bin/sh -c 'mkdir -p $HOME/.ansible/tmp/ansible-tmp-1411396757.67-126091702758045 && chmod a+rx $HOME/.ansible/tmp/ansible-tmp-1411396757.67-126091702758045 && echo $HOME/.ansible/tmp/ansible-tmp-1411396757.67-126091702758045'"]
fatal: [172.16.169.167] => SSH encountered an unknown error during the connection. We recommend you re-run the command using -vvvv, which will enable SSH debugging output to help diagnose the issue
TASK: [download InfluxDB debian package] **************************************
FATAL: no hosts matched or all hosts have already failed -- aborting
PLAY RECAP ********************************************************************
to retry, use: --limit @/Users/chobie/playbook.retry
172.16.169.167 : ok=0 changed=0 unreachable=1 failed=0
う~んなんでしょう。FATAL: no hosts matched or all hosts have already failed -- abortingというわりには手元でsshしたらパスワードを聞かれて入ることが出来ます。
アッー。ssh鍵コピーしたと思ったらしてなかった・・・w
気を取り直してリトライ
macbook-2% ansible-playbook -i hosts playbook.yml --check --ask-sudo-pass
sudo password:
PLAY [influxdb] ***************************************************************
GATHERING FACTS ***************************************************************
ok: [172.16.169.167]
TASK: [download InfluxDB debian package] **************************************
skipping: [172.16.169.167]
TASK: [install InfluxDB] ******************************************************
fatal: [172.16.169.167] => failed to parse:
SUDO-SUCCESS-jvjdxqgbqvgohbqbtbyisgtlsarptwhv
Traceback (most recent call last):
File "/home/chobie/.ansible/tmp/ansible-tmp-1411396909.8-227214665901861/apt", line 1907, in <module>
main()
File "/home/chobie/.ansible/tmp/ansible-tmp-1411396909.8-227214665901861/apt", line 523, in main
force=force_yes, dpkg_options=p['dpkg_options'])
File "/home/chobie/.ansible/tmp/ansible-tmp-1411396909.8-227214665901861/apt", line 299, in install_deb
pkg = apt.debfile.DebPackage(deb_file)
File "/usr/lib/python2.7/dist-packages/apt/debfile.py", line 61, in __init__
self.open(filename)
File "/usr/lib/python2.7/dist-packages/apt/debfile.py", line 70, in open
self._debfile = apt_inst.DebFile(self.filename)
SystemError: E:Could not open file /tmp/influxdb_latest_amd64.deb - open (2: No such file or directory), E:Unable to determine file size for fd -1 - fstat (9: Bad file descriptor), E:Read error - read (9: Bad file descriptor)
FATAL: all hosts have already failed -- aborting
PLAY RECAP ********************************************************************
to retry, use: --limit @/Users/chobie/playbook.retry
172.16.169.167 : ok=1 changed=0 unreachable=1 failed=0
今回失敗しているのはdry-runでdownloadがスキップされているからでしょう。それでは実際にインストールを実行してみます。
macbook-2% ansible-playbook -i hosts playbook.yml --ask-sudo-pass
sudo password:
PLAY [influxdb] ***************************************************************
GATHERING FACTS ***************************************************************
ok: [172.16.169.167]
TASK: [download InfluxDB debian package] **************************************
changed: [172.16.169.167]
TASK: [install InfluxDB] ******************************************************
changed: [172.16.169.167]
PLAY RECAP ********************************************************************
172.16.169.167 : ok=3 changed=2 unreachable=0 failed=0
おお!Installできたっぽいですね。端末に入ってチェックしたいところですがせっかくなのでansibleコマンドを使って確認してみます。 -aが引数ということなのできっとこんなかんじで動くはず。
macbook-2% ansible -i hosts 172.16.169.167 -a 'dpkg -l | grep influxdb'
172.16.169.167 | FAILED | rc=1 >>
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name Version Architecture Description
+++-===================================-=============================-============-===============================================================================
ii grep 2.16-1 amd64 GNU grep, egrep and fgrep
ii influxdb 0.8.2 amd64 no description givendpkg-query: no packages found matching |
あれー。そのままpipe処理されるかと思いましたが違うようですねー。
http://tdoc.info/blog/2014/01/22/ansible_adhoc_commands.html
パイプやリダイレクトを使いたい場合は-m shellを指定します。
なるほど。shellモジュールを使うのですね。
macbook-2% ansible -i hosts 172.16.169.167 -m shell -a 'dpkg -l | grep influxdb'
172.16.169.167 | success | rc=0 >>
ii influxdb 0.8.2 amd64 no description given
うん。期待通り動いてくれました。インストールされてるのもわかりますねー。
じゃあ、ansibleコマンド経由で一旦動かしてみます。
macbook-2% ansible -i hosts 172.16.169.167 -m service -a 'name=influxdb state=running enabled=yes'
172.16.169.167 | success >> {
"changed": true,
"enabled": true,
"name": "influxdb",
"state": "started"
}
macbook-2% ansible -i hosts 172.16.169.167 -m shell -a 'ps aux | grep influxdb'
172.16.169.167 | success | rc=0 >>
chobie 1779 0.0 0.0 4444 640 pts/0 S+ 07:48 0:00 /bin/sh -c ps aux | grep influxdb
chobie 1781 0.0 0.0 11744 904 pts/0 S+ 07:48 0:00 grep influxdb
あれいないな。
あ、 sudo渡すの忘れてました。-sでしたね。これはinfluxdbの起動ファイルが悪いんでまー、しゃーない
macbook-2% ansible -i hosts 172.16.169.167 -m service -a 'name=influxdb state=running enabled=yes' -s --ask-sudo-pass
sudo password:
172.16.169.167 | success >> {
"changed": true,
"enabled": true,
"name": "influxdb",
"state": "started"
}
macbook-2% ansible -i hosts 172.16.169.167 -m shell -a 'ps aux | grep influxdb'
172.16.169.167 | success | rc=0 >>
influxdb 1890 0.7 0.7 288280 7580 ? Sl 07:50 0:00 /usr/bin/influxdb -pidfile /opt/influxdb/shared/influxdb.pid -config /opt/influxdb/shared/config.toml
chobie 1904 0.0 0.0 4444 644 pts/1 S+ 07:50 0:00 /bin/sh -c ps aux | grep influxdb
chobie 1906 0.0 0.0 11744 904 pts/1 S+ 07:50 0:00 grep influxdb
今度は期待どおり動いていますね!確認まで出来たので再度service moduleを使って停止してみます。
http://docs.ansible.com/service_module.html
macbook-2% ansible -i hosts 172.16.169.167 -m service -a 'name=influxdb state=stopped' -s --ask-sudo-pass
sudo password:
172.16.169.167 | success >> {
"changed": true,
"name": "influxdb",
"state": "stopped"
}
macbook-2% ansible -i hosts 172.16.169.167 -m shell -a 'ps aux | grep influxdb'
172.16.169.167 | success | rc=0 >>
chobie 1949 0.0 0.0 4444 644 pts/1 S+ 07:52 0:00 /bin/sh -c ps aux | grep influxdb
chobie 1951 0.0 0.0 11744 908 pts/1 S+ 07:52 0:00 grep influxdb
okay, InfluxDBのInstallはできることがわかったので。次。confの配布ですね。
InfluxDBのパッケージの場合/opt/influxdb/shared/config.tomlにデフォルトではconfigファイルが配置されてるので そこからdefaultのconfigを拾ってきておきます。
macbook-2% scp 172.16.169.167:/opt/influxdb/current/config.toml .
config.toml
ふとおもったけどリモートのマシンから特定のファイルをfetchしてよしなにリネームしてlocalにおく、とか簡単にできるのかしら? あと、複数端末のtail -fみたいなのはできるのかなー。とか思いつつ脱線しちゃうのでとりあえず続き。
今回はconfファイル内での置換とかそういった機能は特に調べずにやろうとおもうのでconfig.tomlをmaster用、slave用とわけて準備しておきます。
InfluxDBをクラスタリングする場合はseed-serversの設定をclusterの項目に追加すればいいだけなので172.16.169.169に配るiniだけseed-serversをコメントアウトして設定を合わせておきます。config.toml.slaveという名前で保存しておきました。
seed-servers = ["172.16.169.167:8090"]
http://tdoc.info/blog/2014/05/30/ansible_target_switching.html
うーん。ちょっと今ある知識量だと難しいですね。
http://docs.ansible.com/playbooks_conditionals.html
そういえば先ほどsetupモジュールを使えば変数が取れる、というのをさっき見たので。そこからwhenにできるのではないか?ということで
ansible -i hosts 172.16.169.167 -m setup
#割愛
IP直打ちということでだいぶクソってる設定な気がしますが、ansible_eth0.ipv4.address == "172.16.169.16"できっと動くのでコレで試してみます
chobie@ubuntu:~$ ls -la /opt/influxdb/current/config.toml
-rw-r--r-- 1 influxdb influxdb 7009 Sep 8 09:56 /opt/influxdb/current/config.toml
when: ansible_eth0.ipv4.address == "172.16.169.167"
copy: src=config.toml dest=/opt/influxdb/current/config.toml owner=influxdb group=influxdb mode=0644
まずはこれでチェック
macbook-2% ansible-playbook -i hosts playbook.yml --ask-sudo-pass
sudo password:
PLAY [influxdb] ***************************************************************
GATHERING FACTS ***************************************************************
ok: [172.16.169.167]
TASK: [download InfluxDB debian package] **************************************
ok: [172.16.169.167]
TASK: [install InfluxDB] ******************************************************
ok: [172.16.169.167]
TASK: [copy ini file] *********************************************************
ok: [172.16.169.167]
PLAY RECAP ********************************************************************
172.16.169.167 : ok=4 changed=0 unreachable=0 failed=0
okそうですね。slaveの設定ファイルもコピーしつつhostsに別ノードを追加します。
when: ansible_eth0.ipv4.address == "172.16.169.169"
hostsを書き換えます
[influxdb]
172.16.169.167
172.16.169.169
そいじゃ実行
macbook-2% ansible-playbook -i hosts playbook.yml --ask-sudo-pass
sudo password:
PLAY [influxdb] ***************************************************************
GATHERING FACTS ***************************************************************
fatal: [172.16.169.168] => SSH encountered an unknown error during the connection. We recommend you re-run the command using -vvvv, which will enable SSH debugging output to help diagnose the issue
おっと。完璧にssh鍵の設定を忘れていたようです、、、、気を取り直して。
macbook-2% ansible-playbook -i hosts playbook.yml --ask-sudo-pass
sudo password:
PLAY [influxdb] ***************************************************************
GATHERING FACTS ***************************************************************
ok: [172.16.169.167]
ok: [172.16.169.169]
TASK: [download InfluxDB debian package] **************************************
1 - hosts: influxdb
changed: [172.16.169.169]
ok: [172.16.169.167]
TASK: [install InfluxDB] ******************************************************
ok: [172.16.169.167]
changed: [172.16.169.169]
TASK: [copy ini file] *********************************************************
skipping: [172.16.169.169]
ok: [172.16.169.167]
TASK: [copy follower ini file] ************************************************
skipping: [172.16.169.167]
failed: [172.16.169.169] => {"failed": true}
msg: could not find src=/Users/chobie/src/myfirstplaybook/config.toml.slavve
PLAY RECAP ********************************************************************
to retry, use: --limit @/Users/chobie/playbook.retry
172.16.169.167 : ok=4 changed=0 unreachable=0 failed=0
172.16.169.169 : ok=3 changed=2 unreachable=0 failed=1
いっけね。ファイル名を間違えました。ついつい
macbook-2% ansible-playbook -i hosts playbook.yml --ask-sudo-pass
sudo password:
PLAY [influxdb] ***************************************************************
GATHERING FACTS ***************************************************************
ok: [172.16.169.167]
ok: [172.16.169.169]
TASK: [download InfluxDB debian package] **************************************
ok: [172.16.169.167]
ok: [172.16.169.169]
TASK: [install InfluxDB] ******************************************************
ok: [172.16.169.167]
ok: [172.16.169.169]
TASK: [copy ini file] *********************************************************
skipping: [172.16.169.169]
ok: [172.16.169.167]
TASK: [copy follower ini file] ************************************************
skipping: [172.16.169.167]
changed: [172.16.169.169]
PLAY RECAP ********************************************************************
172.16.169.167 : ok=4 changed=0 unreachable=0 failed=0
172.16.169.169 : ok=4 changed=1 unreachable=0 failed=0
OKそうですね。それでは起動させましょう。
macbook-2% ansible -i hosts -m service -a 'name=influxdb state=running enabled=yes' -s --ask-sudo-password
Usage: ansible <host-pattern> [options]
ansible: error: no such option: --ask-sudo-password
おー、ちゃんとコマンドを見ない俺が悪かったよ。見てなかったけどきっとasteriskを渡せばやってくれるはず
macbook-2% ansible -i hosts '*' -m service -a 'name=influxdb state=running enabled=yes'
172.16.169.167 | success >> {
"changed": true,
"enabled": true,
"name": "influxdb",
"state": "started"
}
172.16.169.168 | success >> {
"changed": true,
"enabled": true,
"name": "influxdb",
"state": "started"
}
macbook-2% ansible -i hosts '*' -m shell -a 'ps aux | grep influxdb'
172.16.169.167 | success | rc=0 >>
chobie 2484 0.0 0.0 4444 640 pts/1 S+ 08:10 0:00 /bin/sh -c ps aux | grep influxdb
chobie 2486 0.0 0.0 11744 904 pts/1 S+ 08:10 0:00 grep inflxudb
172.16.169.168 | success | rc=0 >>
chobie 1592 0.0 0.0 4444 644 pts/0 S+ 08:10 0:00 /bin/sh -c ps aux | grep influxdb
chobie 1594 0.0 0.0 11744 908 pts/0 S+ 08:10 0:00 grep inflxudb
ハハッ。sudo必要ですよねー
macbook-2% ansible -i hosts '*' -m service -a 'name=influxdb state=running enabled=yes' -s --ask-sudo-pass
sudo password:
172.16.169.167 | success >> {
"changed": true,
"enabled": true,
"name": "influxdb",
"state": "started"
}
172.16.169.168 | success >> {
"changed": true,
"enabled": true,
"name": "influxdb",
"state": "started"
}
macbook-2% ansible -i hosts '*' -m shell -a 'ps aux | grep influxdb'
172.16.169.167 | success | rc=0 >>
influxdb 2532 0.0 1.1 354072 11528 ? Sl 08:11 0:00 /usr/bin/influxdb -pidfile /opt/influxdb/shared/influxdb.pid -config /opt/influxdb/shared/config.toml
chobie 2641 0.0 0.0 4444 640 pts/4 S+ 08:13 0:00 /bin/sh -c ps aux | grep influxdb
chobie 2643 0.0 0.0 11744 904 pts/4 S+ 08:13 0:00 grep influxdb
172.16.169.168 | success | rc=0 >>
influxdb 1640 0.1 0.9 353816 9628 ? Sl 08:11 0:00 /usr/bin/influxdb -pidfile /opt/influxdb/shared/influxdb.pid -config /opt/influxdb/shared/config.toml
chobie 1740 0.0 0.0 4444 640 pts/2 S+ 08:13 0:00 /bin/sh -c ps aux | grep influxdb
chobie 1742 0.0 0.0 11744 908 pts/2 S+ 08:13 0:00 grep influxdb
へい。期待通り動いてるようなきがします。が実際にブラウザで見てると動いていない。
[2014/09/22 08:27:59 PDT] [INFO] (github.com/influxdb/influxdb/coordinator.(*ProtobufClient).reconnect:238) connected to ubuntu:8099
んーなんかInfluxDB側の挙動が怪しいですね。どうやらosのhostnameベースでつなぎにっているようなので/etc/hostsも更新しておかないとダメになったようです。
[2014/09/22 08:32:28 PDT] [DEBG] (github.com/influxdb/influxdb/coordinator.(*RaftServer).joinHandler:686) ON RAFT LEADER - JOIN: &{f5414ea0deebb10c http://slave:8090 slave:8099}
と、いうことは。ansibleでhostsの追加ができると嬉しい、と
ansible_hostname
https://gist.github.com/rothgar/8793800
最終的にこのようなファイルになりました。
macbook-2% cat hosts
[influxdb]
master ansible_ssh_host=172.16.169.167
slave ansible_ssh_host=172.16.169.169
macbook-2% cat playbook.yml
- hosts: influxdb
sudo: yes
tasks:
- name: change hostname
hostname: name={{ inventory_hostname }}
- name: "Build hosts file"
lineinfile: dest=/etc/hosts regexp='.*{{ item }}$' line="{{ hostvars[item].ansible_default_ipv4.address }} {{item}}" state=present
with_items: groups.influxdb
- name: download InfluxDB debian package
get_url: dest=/tmp/ url=http://s3.amazonaws.com/influxdb/influxdb_latest_amd64.deb
- name: install InfluxDB
apt: deb=/tmp/influxdb_latest_amd64.deb
- name: copy ini file
when: inventory_hostname == "master"
copy: src=config.toml dest=/opt/influxdb/shared/config.toml owner=influxdb group=influxdb mode=0644
- name: copy follower ini file
when: inventory_hostname == "slave"
copy: src=config.toml.follower dest=/opt/influxdb/shared/config.toml owner=influxdb group=influxdb mode=0644
- name: run influxdb
service: name=influxdb state=running enabled=yes
最後に。snapshotから両VMを復帰させて一発でインストールできることを確認しておしまいです。
macbook-2% ansible-playbook -i hosts playbook.yml --ask-sudo-pass
sudo password:
PLAY [influxdb] ***************************************************************
GATHERING FACTS ***************************************************************
ok: [master]
ok: [slave]
TASK: [change hostname] *******************************************************
changed: [master]
changed: [slave]
TASK: [Build hosts file] ******************************************************
changed: [master] => (item=master)
changed: [slave] => (item=master)
changed: [master] => (item=slave)
changed: [slave] => (item=slave)
TASK: [download InfluxDB debian package] **************************************
changed: [slave]
changed: [master]
TASK: [install InfluxDB] ******************************************************
changed: [master]
changed: [slave]
TASK: [copy ini file] *********************************************************
skipping: [slave]
ok: [master]
TASK: [copy follower ini file] ************************************************
skipping: [master]
changed: [slave]
TASK: [run influxdb] **********************************************************
changed: [slave]
changed: [master]
PLAY RECAP ********************************************************************
master : ok=7 changed=5 unreachable=0 failed=0
slave : ok=7 changed=6 unreachable=0 failed=0
OKっぽいですねー。/etc/hostsの更新とかこれでいいかちょっと自信ないですが、ひとまず動いているので今日のところはこれくらいにしておきましょう!
macbook-2% curl 'http://172.16.169.167:8086/cluster/servers?u=root&p=root&pretty=true'
[
{
"id": 1,
"isLeader": true,
"isUp": false,
"leaderRaftConnectString": "http://master:8090",
"leaderRaftName": "a2ac4fe0af989193",
"protobufConnectString": "master:8099",
"raftConnectionString": "http://master:8090",
"raftName": "a2ac4fe0af989193",
"state": 4,
"stateName": "Potential"
},
{
"id": 2,
"isLeader": false,
"isUp": true,
"leaderRaftConnectString": "http://master:8090",
"leaderRaftName": "a2ac4fe0af989193",
"protobufConnectString": "slave:8099",
"raftConnectionString": "http://slave:8090",
"raftName": "6f7701de6961082e",
"state": 4,
"stateName": "Potential"
}
]%
ということで一発目からAnsibleのBest practiceまではたどり着けませんでしたが、とりあえず2時間程度でやりたいところまではできました。 Vmwareでセットアップしたのはだいぶかったるかったので次やるときはVM上のDockerを自由に使えるようにしとけば初めてでも30分ぐらいでイケルと思います。
ansible_hostnameは変えたセッションの中だと後続で変更が反映されないのでちょっとハマりましたが、さくっと出来たんじゃないかなー。と思います。
それでは、簡単ではありますがAnsible初めての私がInfluxDBのクラスタリングセットアップまでやってみた、ということで。 きっとこうすればもっとよいよ!というのはAnsibleの達人がコメントに書いてくれるはずと期待してw、今後Ansible使っていこうと思います!
ansible/ansible#3887
こういう操作は構成ツールという思想的にできなさそう
http://docs.ansible.com/fetch_module.html
これはfetch moduleを使えばとても簡単そうだけどやっぱり設定ファイルを拾ってくる、とか簡易的な使い方がメインなんだろうなぁ