読者です 読者をやめる 読者になる 読者になる

tjinjin's blog

いつかすごいエンジニアになることを目指して、日々学んだことを書いていきます。

Ansibleからknife soloを実行してみる

Ansible Chef

About

先に書いておくと、ほとんど意味ないです。

サーバの台数が増えてくるとサーバ1台1台にknife soloをするのが大変になってきます。CircleCIから自動実行させてもいいのですが、時間がかかってコンテナを圧迫してしまう心配があります。(お金があればいいのですが)じゃあChef Serverとかって選択もあると思うのですが、運用が大変という噂を聞いていてどっちつかずな状況です。じゃあ、せめてknife soloの実行を楽にしようということでAnsibleを使ってみました(錯乱)

環境

  • ローカルマシン OSX10.10.5
  • リモートノード dockerコンテナ
  • ansible 1.9.3
  • knife-solo 0.5.1

準備

Ansibleを導入する

$ sudo easy_install pip
$ sudo pip install ansible

コンテナを準備

自分用リポジトリを作っておいたので、それを使います。公開鍵をDockerfile内で挿入しているので、そこだけ各々の鍵に変えればsshログインできるコンテナになるはずです。

github.com

$ docker-compose up -d

ローカルマシンからホスト名SSH接続できるようにする

面倒なので設定しておきます。

Host web
  HostName 192.168.59.103
  User docker
  Port 40022
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile ~/.ssh/id_ci.docker
  IdentitiesOnly yes
  LogLevel FATAL

個人的に下記のssh分割の設定しているので、リポジトリにある.ssh/server-provisioning.confへのシンボリックリンクを~/.ssh/conf.dに作成しています。

qiita.com

やってみる

Ansibleは久しぶりなので、適当にcookbookを作っておきます。

  • hostsファイル
$ cat hosts
[web]
192.168.59.103:40022

[batch]
192.168.59.103:40024
  • playbook
$ cat knife-solo.yml
---
- hosts: localhost
  tasks:
    - command: bundle exec knife solo cook web --ssh-control-master no
    - command: bundle exec knife solo cook batch --ssh-control-master no
$ ansible-playbook -i hosts knife-solo.yml

PLAY [localhost] **************************************************************

GATHERING FACTS ***************************************************************
ok: [localhost]

TASK: [command bundle exec knife solo cook web --ssh-control-master no] *******
changed: [localhost]

TASK: [command bundle exec knife solo cook batch --ssh-control-master no] *****
changed: [localhost]

PLAY RECAP ********************************************************************
localhost                  : ok=3    changed=2    unreachable=0    failed=0

一応できました。

勘違いしていたこと

  • Ansibleは特定ホストに対して、コマンドを実行するもの。knife soloはローカルからリモートマシンに接続してrsyncしてcookbookなどを送信したのち、リモート上でcookする。なので、Ansibleを使うにはローカルのMacに対しコマンドを投げないと行けない。リモートに対してknife solo cookすればいいじゃんとか思ってしまっておりました。
  • 上記に関連しますが、ローカルに~/.ssh/configの設定を持たなくていいようになると思っていた。
  • Ansibleの実行画面では構成変更があろうがなかろうが、毎回changedになってしまう。そりゃそうか。

終わりに

Chef Serverにはhostedサービスがあるらしいと聞きましたが、利用しているところ多いんですかね?プロビジョニングについては継続的に考えたいと思います。