やること
OSS(オープンソースソフトウェア)のAnsibleを学習すると同時に、仮想環境上にホストOSのvim,zshの設定を自動で反映できるようにする。
※この記事はVagrantによるホスト環境ができていることを前提として書いています。興味がある方は以下の記事を参考にしてみてください!
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編集
[defaults]
hostfile = ./hosts
$ ansible all -m ping
##3.playbookを使う
playbook:実行したい処理をまとめて記述したファイル
例として、対象ホストにアカウントを追加するplaybookの作成を行う
①普通に書いた場合
- hosts: all #対象ホスト
sudo: yes #管理者権限
tasks: #実行する処理
- name: add a client user #処理内容(任意)
user: name=client #"client"をアカウント名として作成
②"client"を変数名で管理する場合
- hosts: all
sudo: yes
vars:
username: client
tasks:
- name: add a client user
user: name={{username}}
③実行時に入力する場合
- 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
①Inventoryファイルに記述したホストAにapacheのインストールと自動起動を行うplaybook
- 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
- 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
- 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にコピー
- 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
各ファイルの中身は以下の通り
---
# main.yml
- hosts: all
user: vagrant
sudo: yes
roles:
- vim
- zsh
- 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"
- 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
https://www.tcmobile.jp/dev_blog/devtool/ansibleのplaybookをいい感じに管理したい/
http://qiita.com/snaka/items/d5a8004afbfe665e1d3a