Ansible入門 その1 インストール〜コマンド実行

## この記事について
この記事はAnsibleについてほとんど何も知らない私が[公式ドキュメント](http://docs.ansible.com/ansible/latest/index.html)を読みながらAnsibleをインストールして動かしていく記事です。

使用PCのOSは`macOS　Sierra　10.12.6`です。

## Ansibleとは何か
いわゆる構成管理ツールというやつで、設定ファイルを書いておくことによって自動的にマシンにソフトウェアをインストールしてくれたり設定してくれたりします。サーバーのセットアップを自動化するソフトと考えれば大体あってるのではないかと思います。

他にも色々特徴はあるのでしょうが、それはおいおい勉強します。。

## 公式ドキュメントにしたがってAnsibleを使ってみる
さっそくドキュメントどおりにAnsibleを使ってみます。

### インストール
環境がmacなので[Latest Releases on Mac OSX](http://docs.ansible.com/ansible/latest/intro_installation.html#latest-releases-on-mac-osx)を参考にインストールします。pipでインストールしろと書いてありますので、pythonが必要です。pythonがない人はpythonをインストールしてください。pythonのインストールについては他の記事に譲ります。ぐぐったら[コチラの記事](https://qiita.com/ms-rock/items/6e4498a5963f3d9c4a67)がトップに出てきました。

（以下はほとんど公式ドキュメント通りのコマンドですので、気になる方は公式の方を見てください）

まずpipをインストールします。

```sh
$ sudo easy_install pip
```

そしてAnsibleをインストール。

```sh
$ sudo pip install ansible
```

バージョン指定したい場合は以下のようにするらしいです。[（※参考）](https://qiita.com/matsu911/items/72e0bb6224a30d205739)

```sh
$ sudo pip install ansible==1.9.1
```

開発中の最新バージョンが使いたいときはこれ。

```sh
$ pip install git+https://github.com/ansible/ansible.git@devel
```

OS X Mavericksの人は以下のようにする必要があるらしい。

```sh
$ sudo CFLAGS=-Qunused-arguments CPPFLAGS=-Qunused-arguments pip install ansible
```

### Ansibleを起動

Ansibleを動かす前に、Ansibleがどうやってリモートマシンとやりとりしているのか理解するのが重要だと書いてありますので、一応メモ。[（※公式ドキュメント）](http://docs.ansible.com/ansible/latest/intro_getting_started.html#remote-connection-information)

AnsibleはSSHのControlPersistという機能を使っているらしいです。（ControlPersistについては[こちらの記事](http://d.hatena.ne.jp/tmatsuu/20120707/1341677472)がわかりやすかったです）

しかし制御側のマシンのOpenSSHが古いとControlPersistに対応していないことがあるため、その場合Ansibleは'paramiko'というPythonによるOpenSSH実装を使うらしいです。

ほかにもリモート接続について書いてあるので気になる人は該当箇所を読んで下さい。

### Ansibleからリモートマシンのコマンド実行
では実際にAnsibleを動かしてみます。

まずはローカルマシンのSSH公開鍵がリモートマシンの``authorized_keys``に書いてある必要があります。

この辺はVagrantとかを使ってAnsibleで操作する対象となる環境を作るのが便利かと思います。今回は[Vagrantbox.es](http://www.vagrantbox.es/)から``CentOS 7.2 x64 (Minimal, Puppet 4.2.3, Guest Additions 4.3.30``を選びました。他にも[Discover Vagrant Boxes](https://app.vagrantup.com/boxes/search)などもありますので探してみると良いと思います。

以下はVagrant環境を前提としますが、Vagrantを使ったことが無いという方は[この記事](https://qiita.com/you-me/items/3126e7f91ccdf4d8a873)とか、[公式ドキュメント](https://www.vagrantup.com/docs/)とかをご覧になると良いと思います。

適当な作業ディレクトリに移って``vagrant init``でVagrantfileを作ると

```rb
# config.vm.network "private_network", ip: "192.168.33.10"
```

という行があると思うので、これのコメントアウトを外します。

ここでいきなりansibleを実行しても失敗するので、

```sh
$ vagrant ssh-config --host 192.168.33.10 >> ~/.ssh/config
```
この一行を実行して``$ ssh vagrant@192.168.33.10``でログインできるようにします。

次に、``/etc/ansible/hosts``というファイルをディレクトリごと作り、下記の一行を書きます。

```sh
vagrant@192.168.33.10
```

このファイルはインベントリファイルと呼ばれるもので、構成管理対象のリストを意味するみたいです。

ファイルを編集したら、

```sh
$ ansible all -m ping
```

します。
結果が以下になれば成功です！

```rb
vagrant@192.168.33.10 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
```

実際のコマンドを実行。

```sh
$ ansible all -a "/bin/echo hello"
vagrant@192.168.33.10 | SUCCESS | rc=0 >>
hello
```

helloと出力されました。

同じことをローカルマシン向けに行うこともできるようです。

```sh
$ ansible localhost -a 'echo hello'
localhost | SUCCESS | rc=0 >>
hello
```

というわけで、ansibleを使ってリモートマシンにコマンドを実行させることができるということがわかりました。

その2に続く。