Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 9 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save chobie/ed4dd381ca9726cb962e to your computer and use it in GitHub Desktop.
Save chobie/ed4dd381ca9726cb962e to your computer and use it in GitHub Desktop.

Ansibleを始めてみよう。

現状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までやりきるのは面倒そうなので今日は簡単にいこうと思います。

InfluxDBのセットアップ手順を考えたり

http://tdoc.info/blog/2013/05/10/ansible_for_beginners.html

shell scriptを使うのは便利ですが今日は頑張ってAnsibleっぽい方法でやりたいですね! まずはInstall手順を整理してみましょう

    1. roleを指定する(InfluxDBのseedノードと傘下ノードの設定を分ける)
    1. InfluxDBのインストールを行う
    1. それぞれに適した設定を配布する
    1. InfluxDBの実行をする

多分こんな感じの順番でできればOK。ですね.

ひとまず、Vmware FusionでUbuntu14.04の新規VMを準備。ssh鍵のコピーなどは事前に済ませてコピーを作っておきます。 それまではAnsibleの説明読んだり、試しに動かしたりしてみて見ます。

VM setupの合間に、、、

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

うーん。ちょっとこれだと難しい気がするのでもうちょっと楽な方法をあとで探してみることにします。

とりあえず、インストール手順を再度整理してみます

    1. InfluxDBのDebian packageをダウンロードする
    1. InfluxDBのインストールを行う
    1. それぞれに適した設定を配布する
    1. 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の準備ができてきたので始めます

実際にClusterのsetupをAnsible playbook経由で行う

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使っていこうと思います!

@chobie
Copy link
Author

chobie commented Sep 22, 2014

あと、複数端末のtail -fみたいなのはできるのかなー。

ansible/ansible#3887
こういう操作は構成ツールという思想的にできなさそう

ふとおもったけどリモートのマシンから特定のファイルをfetchしてよしなにリネームしてlocalにおく、とか簡単にできるのかしら?

http://docs.ansible.com/fetch_module.html

これはfetch moduleを使えばとても簡単そうだけどやっぱり設定ファイルを拾ってくる、とか簡易的な使い方がメインなんだろうなぁ

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment