Ansible で Vagrant の CoreOS の Docker を操作する


(MacOSX10.9, Vagrant1.7.2)

## 目的

CoreOS 公式サイトで紹介されていた Ansible で CoreOS を管理する方法を試してみる。
基本的に記事の `Example Playbook` の箇所まではそのまま。
個人的に Nginx の停止・再起動の Playbook を追加して試してみる。

- https://coreos.com/blog/managing-coreos-with-ansible/


## インストール

### Vagrant

- http://docs.vagrantup.com/v2/installation/

### Ansible

ローカルに Ansible をインストールする

- http://docs.ansible.com/intro_installation.html#installing-the-control-machine


## Vagrant で CoreOS 環境を構築する

```
$ git clone https://github.com/defunctzombie/coreos-ansible-example.git
$ cd coreos-ansible-example
$ vagrant up
$ ./bin/generate_ssh_config
```


## coreos-bootstrap

Ansible で coreos 内で python と pip を使えるようにする。

- https://github.com/defunctzombie/ansible-coreos-bootstrap

```
$ ansible-galaxy install defunctzombie.coreos-bootstrap -p ./roles
```

### bootstrap.yml を実行する

```
$ ansible-playbook -i inventory/vagrant bootstrap.yml
```

### 対象ホストの情報を取得してみる

```
$ ansible -i inventory/vagrant all -m setup
core-01 | success >> {
    "ansible_facts": {
        "ansible_all_ipv4_addresses": [
            "172.17.42.1",
            "172.12.8.101",
            ...
```

## Example Playbook

### nginx container を pull して起動する。

```
$ ansible-playbook -i inventory/vagrant website.yml
```

- https://github.com/defunctzombie/coreos-ansible-example/blob/master/website.yml

web ブラウザで確認してみる
 
- http://172.12.8.101:8080/

![スクリーンショット 2015-05-31 12.54.53.png](https://qiita-image-store.s3.amazonaws.com/0/41656/fe3a0fa2-c957-685e-4c4c-6da58f2f84f8.png "スクリーンショット 2015-05-31 12.54.53.png")


## Nginx の停止・再起動の Playbook を追加してみる

ここから記事とは別に個人的な追記。

### nginx を停止する

ファイルを作成する

```stop_nginx.yml
- name: example stop nginx
  hosts: web
  tasks:
    - name: stop nginx
      docker:
        image="nginx:1.7.1"
        name="example-nginx"
        ports="8080:80"
        state=stopped
```

実行する

```
$ ansible-playbook -i inventory/vagrant stop_nginx.yml

PLAY [example stop nginx] *****************************************************

GATHERING FACTS ***************************************************************
ok: [core-01]

TASK: [stop nginx] ************************************************************
changed: [core-01]

PLAY RECAP ********************************************************************
core-01                    : ok=2    changed=1    unreachable=0    failed=0
```

web ブラウザで確認すると接続できなくなっている
 
- http://172.12.8.101:8080/


### nginx をリスタートする

ファイルを作成する

```restart_nginx.yml
- name: example restart nginx
  hosts: web
  tasks:
    - name: restart nginx
      docker:
        image="nginx:1.7.1"
        name="example-nginx"
        ports="8080:80"
        state=restarted
```

実行する

```
$ ansible-playbook -i inventory/vagrant restart_nginx.yml

PLAY [example restart nginx] **************************************************

GATHERING FACTS ***************************************************************
ok: [core-01]

TASK: [restart nginx] *********************************************************
changed: [core-01]

PLAY RECAP ********************************************************************
core-01                    : ok=2    changed=1    unreachable=0    failed=0
```

web ブラウザで確認すると表示されている
 
- http://172.12.8.101:8080/

![スクリーンショット 2015-05-31 12.54.53.png](https://qiita-image-store.s3.amazonaws.com/0/41656/fe3a0fa2-c957-685e-4c4c-6da58f2f84f8.png "スクリーンショット 2015-05-31 12.54.53.png")


## [追記] systemd でサービスを起動してみる


まず nginx の docker イメージを削除する

```
$ vagrant ssh core-01

core@core-01 ~ $ docker ps
core@core-01 ~ $ docker kill example-nginx
core@core-01 ~ $ docker rm example-nginx
```

起動していない事を確認する。

```
core@core-01 ~ $ curl http://172.12.8.101:8080/
curl: (7) Failed to connect to 172.12.8.101 port 8080: Connection refused
```

### nginx.service を作成する　

```
core@core-01 ~ $ sudo vim /etc/systemd/system/nginx.service
```

```/etc/systemd/system/nginx.service
[Unit]
Description=example-nginx-description
After=docker.service
Requires=docker.service

[Service]
TimeoutStartSec=0
ExecStartPre=-/usr/bin/docker kill example-nginx
ExecStartPre=-/usr/bin/docker rm example-nginx
ExecStartPre=/usr/bin/docker pull nginx:1.7.1
ExecStart=/usr/bin/docker run -d -p 8080:80 --name example-nginx nginx

[Install]
WantedBy=multi-user.target
```
　
### systemctl で起動する


```
sudo systemctl enable /etc/systemd/system/nginx.service
core@core-01 ~ $ sudo systemctl start nginx.service
```

起動しているか確認する

```
core@core-01 ~ $ curl http://172.12.8.101:8080/
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        ...
```


## 参考

- https://coreos.com/blog/managing-coreos-with-ansible/
- https://coreos.com/docs/launching-containers/launching/getting-started-with-systemd/
- http://docs.ansible.com/docker_module.html