もっぺんプログラミング(´・ω・`)

もっぺん頑張って副業プログラマを目指してます。

ようやくAnsibleの入り口にたどりつけた…

VagrantCentOSの仮想環境を作って、Ansibleでアプリデプロイが今風らしいので(出遅れ)勉強してみたんですが、Ansibleで小さなサンプル動かせるくらいの入り口に辿り着くまで、結構かかってしまった…(´・ω・`)

帰宅して子供が寝てから1,2時間ペースなのでボチボチ前進すな。

一方、今月はじめから客先常駐になってしまってAzure資格の方はさっそく頓挫しております。
だいたい、やりますって宣言すると頓挫するよね。(ダメ)
常駐案件で使うべくAnsibleの勉強を先にやっとこうかなと。

PowerShellSSH対応されたらAnsibleからAzure操作できるようになるんじゃろか。

さて、ではAnsible入り口までの足跡を備忘として書いてみます。
Mac OS X 10.10.3 Yosemite 使っていますけど、Macも初心者です。(´・ω・`)

やったこと。

1. Vagrantをインストール…の前にHome brew インストール

Macでソフトウェア管理ってよく知らなかったので、Homebrew を入れることにしました。
以下、参考にさせていただきました。Homebrew-cask でVirtualBoxとかも扱えるんですね。
Homebrewでパッケージ管理を行う方法 ‹ 技術の犬小屋

2. VirtualBoxVagrantをインストール

brew cask からインストールしました。
VirtualBoxVagrant を作っても仮想OSインストールするの面倒だなと思ってたら、ネットからイメージを取ってくるサービスがあるんですね。すごい。
Vagrantbox http://www.vagrantbox.es/

でも、こういうのってセキュリティの心配とか大丈夫なんでしょうか。
勉強で使う分には、まぁいいけど業務で使う場合には自前でOSインストールからやったほうがいいんですかね。(´・ω・`)

3. Vagramtをさわってみる

Boxから仮想イメージを取得してOSの起動と停止をやりました。
vagrant box add ...
vagrant up
vagrant ssh
vagrant halt
vagrant destroy あたりを試しました。
とりあえず、コマンドラインから起動・ログイン・停止あたりができればOKかな?

4.Ansible チュートリアルに取り組む

Ansibleを使って複数台ホストを操作するいい感じのチュートリアルを発見したので、ここからは以下のサイトをなぞることに。(そして、少しハマることに)
Ansible チュートリアル | Ansible Tutorial in Japanese

Ansible はbrew からインストールしました。

4.1 Vagrantfile を編集して2台起動できるように

上記サイトにある通りにVagrantfile を編集して node1, node2を起動可能にしました。
自分の目標はnode1にWebサーバー環境を作って、fluentdでnode2にログを送って node2側 fluentdで集計する…までやってみたいところですが。果たして。

4.2 Ansibleのssh接続にVagrant秘密鍵をコピー

node1からnode2へも ansibleでpingが打てるように秘密鍵をコピーとのことですが、ここで少しハマりました。秘密鍵がない!!(あるけど鍵が違ってて接続できない。だったかな?)
どうも vagrant 1.7 より秘密鍵ファイルの場所が変わったぽいです。

Vagrant 1.7.1導入したら若干不具合が発生したのでメモ - re:inventing the wheel

前:~/.vagrant.d/insecure_private_key
後:./.vagrant/machines/default/virtualbox/private_key

なおVagrantfile に以下を記述すれば、個別フォルダにキーが作成されない模様
config.ssh.insert_key = false

4.3 Ansibleでsshユーザーを指定する

以下を参考にさせて頂きました。
インベントリファイルに ansible_ssh_private_key_file と ansible_ssh_user を書いています。 Ansibleでsshユーザを指定する - Qiita

4.4 pingは通るがcopyでハマる

上記までで、ansibleコマンドから node1 にping が打てるようになりました。

momoizo$ ansible all -i hosts -m ping
192.168.33.11 | success >> {
    "changed": false,
    "ping": "pong"
}

が、Macからnode1にファイルコピーを試してみたらエラー(´・ω・`)

momoizo$ ansible all -i hosts -m copy -a "src=/xxx/momoizo.txt dest=~/momoizo.txt"
192.168.33.11 | FAILED >> {
    "checksum": "4c31f8b889d4b1c477941a45ec2d2ccd48775b94",
    "failed": true,
    "msg": "Aborting, target uses selinux but python bindings (libselinux-python) aren't installed!"
}

どうも CentOS(node1)でSELinuxが有効になっているせいらしいです。
解決策としては、libselinux-python をインストールせよ・・・と

4.5 Ansibleでlibselinux-python をインストールする

playbookで SELinuxがインストールされている場合で、かつ無効でない場合に libselinux-python をインストールするように組んだ方を発見。すごい。

Ansible GalaxyにGitBucketのroleを登録した
http://sankakuvalidator.hatenablog.com/

というわけで参考にさせていただき、初playbook に挑戦

playbook のひな形は以下のサイトの下の方に出てくる ping モジュールを使った Yaml ファイルをベースにしました。task:部分に上記サイトのタスクをコピーっと。
Ansibleのドキュメントを読んでみたメモ - Qiita

4.6 getenforce で ”[Errno 2] No such file or directory” でハマる

上記で作った playbook を実行してみると、どうも No such file or directoryエラーが出て動かない。YAMLの書き方の問題なのか切り分けができなかったので、ansibleコマンドで単体実行してみる。

momoizo$ ansible all -i hosts -m command -a "getenforce"
192.168.33.11 | FAILED | rc=2 >>
[Errno 2] No such file or directory

やっぱりダメ。 vagrant sshでログインして getenforceしたら動くので、ansibleに何か足りないんじゃろか?と思ってたら違いました。
ansibleでsshした際のパスが足りてなくて"コマンドが見つかりません”的な状態が上記エラーで出てました。
なーんだ。

momoizo$ ansible all -i hosts -m command -a "which getenforce"
192.168.33.11 | FAILED | rc=1 >>
which: no getenforce in (/opt/python-2.7/bin:/usr/local/bin:/bin:/usr/bin)

momoizo$ ansible all -i hosts -m command -a "/usr/sbin/getenforce"
192.168.33.11 | success | rc=0 >>
Enforcing

getenforceをフルパス指定したら動いた。

というわけで、playbook の方は一旦 sudo: true を記述して動くようにしました。 無事 node1 に libselinux-python がインストールされてファイルコピーも動くようになったぽい。

でもsudoで解決もイマイチのような… sshログイン時とsshコマンド実行時のパスの違いをでなくする方法を調べなくては。

で。今ここです。

進みは遅いですが、vagrant, ansible のssh関連の設定場所が分かったし、コマンドの使い方や playbook の使い方も少しわかりました。
ようやく入り口にたどりつけた感じ…

次は node1にwebサーバー環境作って、fluentd入れてログ収集して… というのを目指したいと思います。

あと、Webで調べると誰かのまとめ記事がすぐ見つかって入門者としてはすごくありがたい反面、ソフトウェアのバージョンが古くて動作が違ってハマるということもしばしばでした。 英語力をアップして、まずは公式のGetting Start的なものから読み始めるくらいになりたいなぁと改めて思いました。 がんばらんと(´・ω・`)

↓これは買いました。自分はAmazonじゃなくてGumroad からです。

入門Ansible

入門Ansible

入門 AnsibleのPDF、EPUB版を発売開始しました — そこはかとなく書くよん。