Ansible初心者がvim,zsh設定の自動化ができるようになるまで

# やること

OSS(オープンソースソフトウェア)のAnsibleを学習すると同時に、仮想環境上にホストOSのvim,zshの設定を自動で反映できるようにする。

※この記事はVagrantによるホスト環境ができていることを前提として書いています。興味がある方は以下の記事を参考にしてみてください！
[http://qiita.com/nl0_blu/items/97d54e78789335b415fb](http://qiita.com/nl0_blu/items/97d54e78789335b415fb)

##開発環境
* OS Ⅹ EL Capitan
* Vitualbox(5.1.0)
* Vagrant(1.9.1)
* Ansible(2.2.1.0)
  

##1.Ansibleのインストール


Ansibleのインストール

```
$ brew install ansible
```

インストールの確認

```
$ ansible --version
```
##2.Inventoryファイルの作成とansibleコマンド実行

Inventoryファイル：ansible処理対象のホスト情報を記述する

```
$ vi hosts
----- 編集開始-----
[A]
192.168.33.10

[B]
192.168.33.11
----- 編集終了-----
```  

Ansibleの実行例

ansible [グループ名] -m [モジュール名] -a ["アクション"]

```
--Inventoryファイルに書かれた対象全てにpingモジュール実行--
$ ansible all -i hosts -m ping

--Aにpingモジュール実行--
$ ansible A -i hosts -m ping
```

実行時にhostの入力を省略するには?→ansible.cfg編集

```ansible.cfg

[defaults]
hostfile = ./hosts

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

##3.playbookを使う
  
playbook：実行したい処理をまとめて記述したファイル

例として、対象ホストにアカウントを追加するplaybookの作成を行う

①普通に書いた場合

```playbook.yml

- hosts: all  #対象ホスト
  sudo: yes  #管理者権限
  tasks:  #実行する処理
    - name: add a client user   #処理内容(任意)
      user: name=client  #"client"をアカウント名として作成

```

②"client"を変数名で管理する場合

```playbook.yml

- hosts: all
  sudo: yes
  vars:
    username: client
  tasks:
    - name: add a client user
      user: name={{username}}

```

③実行時に入力する場合

```playbook.yml

- hosts: all
  sudo: yes
  vars_prompt:
    username: "Enter username"
  tasks:
    - name: add a client user
      user: name={{username}}

```

実行してみる。。
ansible-playbook [playbookファイル名]

```
$ ansible-playbook playbook.yml
 


完了ならchanged=1とか出る
```


##4.その他playbookの作成例

公式ドキュメントから必要なモジュールの情報を探す
[http://docs.ansible.com/ansible/modules_by_category.html](http://docs.ansible.com/ansible/modules_by_category.html)

①Inventoryファイルに記述したホストAにapacheのインストールと自動起動を行うplaybook

```playbook.yml

- hosts: A
  sudo: yes
  tasks:
    - name: install apache
      yum: name=httpd state=latest  #yumモジュールからapacheの最新版(latest)をインストール
    - name: start apache and enabled
      service: name=httpd state=started enabled=yes  #apacheの有効化

```

② ローカルファイルをホストBにコピーするplaybook

```playbook.yml

- hosts: B
  sudo: yes
  tasks:
    - name: copy index.html
      copy: src=./test.html dest=./test.html owner=root group=vagrant mode="u=rw,g=r,o=r"

```

③必要なパッケージを全てのホストに一括してインストールするplaybook

```playbook.yml

- hosts: all
  sudo: yes
  tasks:
   - name: need all package install
     yum: name="{{item}}" state=latest
     with_items:
      - php
      - php-mysql
      - httpd
      - mariadb
      - mariadb-server
      - MySQL-python

```


##5(本題).VagrantホストにホストOSのzsh,vimの設定を反映するplaybookの作成


[やってみてわかったこと]

* .ymlは書き方に癖あり。("-"の位置はズレないようする、スペースもフォーマットがある)
* libselinux-pythonインストールしなきゃ色々事故る


Inventoryファイルの作成

```
$ vi hosts
----- 編集開始-----
[server]
192.168.33.10

[client]
192.168.33.11
----- 編集終了-----
```


[playbookの作成]
順番に(task:から下)...
①依存パッケージ(libselinux-pythonを含む。不要なの混じってそう。。)のインストール
②vimのインストール
③ホストOSの.vimrcをゲストOSにコピー
④zshのインストール
⑤ログインシェルをzshにする
⑥ホストOSの.zshrcをゲストOSにコピー

--------

```playbook.yml

- hosts: all
  user: vagrant
  sudo: yes
  tasks: 
    - name: requires install #①
      sudo: true
      yum: name={{ item }} state=present
      with_items:
    - gcc
    - git
    - mercurial
    - ncurses-devel
    - lua
    - lua-devel
    - perl
    - perl-devel
    - perl-ExtUtils-Embed
    - python
    - python-devel
    - libselinux-python

- name: install vim #②
  yum: name=vim state=present
     
- name: copy .vimrc file to vagrant home #③
  copy: src=~/.vimrc dest=~vagrant/.vimrc owner=vagrant group=vagrant mode="u=rw,g=r,o=r"

    
- name: install zsh #④
  yum: name=zsh state=installed

- name: set zsh as default shell for vagrant user #⑤
  command: chsh -s '/bin/zsh' vagrant

- name: copy .zshrc file to vagrant home #⑥
  copy: src=~/.zshrc dest=~vagrant/.zshrc owner=vagrant group=vagrant mode="u=rw,g=r,o=r"

```

-------------


このplaybookはディレクトリで以下のようにまとめることもできる
(vimのplaybookとzshnoplaybookの切り分け)


├Vagrantfile
└provisioning 
　├ hosts
　├ main.yml
　└ roles
  　  　├ vim 
    　　　└ tasks
    　　　　└ main.yml
    　　├ zsh
    　　　└ tasks 
    　　　　└ main.yml  　　 　    
   　　  　
各ファイルの中身は以下の通り

```provisioning/main.yml
---
 # main.yml
 
- hosts: all
  user: vagrant
  sudo: yes
  roles:
    - vim
    - zsh
```


```provisioning/roles/vim/tasks/main.yml
- name: requires install
  yum: name={{ item }} state=present
  with_items:
    - gcc
    - git
    - mercurial
    - ncurses-devel
    - lua
    - lua-devel
    - perl
    - perl-devel
    - perl-ExtUtils-Embed
    - python
    - python-devel  
    - libselinux-python

- name: install vim
  yum: name=vim state=installed
  
- name: copy .vimrc file to vagrant home
  copy: src=~/.vimrc dest=~vagrant/.vimrc owner=vagrant group=vagrant mode="u=rw,g=r,o=r"
```


```provisioning/roles/zsh/tasks/main.yml
- name: install zsh
  yum: name=zsh state=installed

- name: set zsh as default shell for vagrant user
  command: chsh -s '/bin/zsh' vagrant

- name: copy .zshrc file to vagrant home
  copy: src=~/.zshrc dest=~vagrant/.zshrc owner=vagrant group=vagrant mode="u=rw,g=r,o=r"
```


以降、Vagrantホストに対してansibleを実行する方法は幾つかある  

①(一般的)Vagrantfileに以下を追記

```
config.vm.provision "ansible" do |ansible|
    ansible.playbook = "provisioning/main.yml"
    ansible.inventory_path = "provisioning/hosts"
    ansible.limit = 'all'
end
```

`$ vagrant provision`で作成したplaybookの実行


②ansible-playbook main.yml から実行


##ansible関連コマンド
* `ansible-playbook (playbook名) --syntax-check` playbookの文法の確認  
* `ansible-playbook (playbook名) --list-task` playbookのタスクの一覧確認
* `ansible-playbook (playbook名) --check` playbook実行確認(実際に実行はしない) 


##参考
[http://shifumin.hatenablog.com/entry/2015/08/26/215000](http://shifumin.hatenablog.com/entry/2015/08/26/215000) 
[https://www.tcmobile.jp/dev_blog/devtool/ansibleのplaybookをいい感じに管理したい/](https://www.tcmobile.jp/dev_blog/devtool/ansibleのplaybookをいい感じに管理したい/)
[http://qiita.com/snaka/items/d5a8004afbfe665e1d3a](http://qiita.com/snaka/items/d5a8004afbfe665e1d3a)