[Ansible] Ansible使用方法まとめ

サーバーの構成管理の自動化をshellからAnsibleに移行するためのメモ（更新中）

# 検証環境

```
$ ansible --version
ansible 2.3.0.0
  config file = /etc/ansible/ansible.cfg
  configured module search path = Default w/o overrides
  python version = 2.7.12 (default, Nov 19 2016, 06:48:10) [GCC 5.4.0 20160609]
```

# 公式ドキュメント
[Ansible Documentation — Ansible Documentation](http://docs.ansible.com/ansible/)

## YAMLの文法
[YAML Syntax — Ansible Documentation](http://docs.ansible.com/ansible/YAMLSyntax.html)

## 公式の実装サンプル
[ansible/ansible-examples: A few starter examples of ansible playbooks, to show features and how they work together. See http://galaxy.ansible.com for example roles from the Ansible community for deploying many popular applications.](https://github.com/ansible/ansible-examples)

# インストール
## パッケージでインストールする
Ubuntuでは以下のようにしてインストールして下さい。

```console:Ubuntuでのインストール方法
$ sudo apt-get install software-properties-common
$ sudo apt-add-repository ppa:ansible/ansible
$ sudo apt-get update
$ sudo apt-get install ansible
```

その他の環境での方法は以下を参照して下さい。

[Installation — Ansible Documentation](http://docs.ansible.com/ansible/intro_installation.html#installing-the-control-machine)

## Vagrantで使用する（ansible_local）

```rb:Vagrantのansible_localでの使用例
# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure(2) do |config|
  config.vm.box = "ubuntu/trusty64"
  config.vm.box_check_update = true

  # Run Ansible from the Vagrant VM
  config.vm.provision "ansible_local" do |ansible|
    ansible.playbook = "playbook.yml"
    ansible.verbose = true
    ansible.install = true
  end
end
```

[Ansible Local - Provisioning - Vagrant by HashiCorp](https://www.vagrantup.com/docs/provisioning/ansible_local.html)

`ansible.install = true` で、ゲストOS側にAnsibleがインストールされます。(デフォルトでtrue)

proxyの解決には前段でpipの設定をするか `vagrant-proxyconf`を使用して下さい。

関連：
[[Vagrant][Windows] WindowsでVagrantを使用してVM環境を作成する - Qiita](http://qiita.com/koara-local/items/e5d1226e2942cf36ef42)

## gitignore
[gitignore/Ansible.gitignore at master · github/gitignore](https://github.com/github/gitignore/blob/master/Global/Ansible.gitignore)

# 実行方法
## localhostに対して実行
[[Ansible] AnsibleのPlaybookをlocalhostに対して実行する - Qiita](http://qiita.com/koara-local/items/db62c626568bc82f3bda)

# Playbook構成パターン
[Ansible inventoryパターン ｜ Developers.IO](http://dev.classmethod.jp/server-side/ansible/ansible-inventory-pattern/)

# 変数
## Ansible固有変数
[[Ansible] ansible_*変数の値を確認するには - Qiita](http://qiita.com/hnakamur/items/8b9fbd358d99cbb271ab)

# ファイル操作
[Files Modules — Ansible Documentation](http://docs.ansible.com/ansible/list_of_files_modules.html)
[Ansibleでよく使うファイル操作モジュール ｜ Developers.IO](http://dev.classmethod.jp/server-side/ansible/ansible-file-modules-intro/)

## ファイル内容の書き換え
[Ansibleでファイルの行を書き換える3つの方法 - Qiita](http://qiita.com/cognitom/items/57de72b739642041dcd5)

### lineinfile : 行書き換え
[lineinfile - Ensure a particular line is in a file, or replace an existing line using a back-referenced regular expression. — Ansible Documentation](http://docs.ansible.com/ansible/lineinfile_module.html)

### blockinfile : 複数行書き換え
[blockinfile - Insert/update/remove a text block surrounded by marker lines. — Ansible Documentation](https://docs.ansible.com/ansible/blockinfile_module.html)

### template : Jinja2テンプレートからファイル生成
[template - Templates a file out to a remote server. — Ansible Documentation](http://docs.ansible.com/ansible/template_module.html)
[Template Designer Documentation — Jinja2 Documentation (2.9)](http://jinja.pocoo.org/docs/2.9/templates/)

### Ansibleの正規表現内でエスケープが必要な文字
[【保存版】正規表現でエスケープが必要な文字一覧表 - Qiita](http://qiita.com/katsukii/items/1c1550f064b4686c04d4)

# コマンド
## shellの実行
[shell - Execute commands in nodes. — Ansible Documentation](http://docs.ansible.com/ansible/shell_module.html)
[Ansibleでシェルコマンドを実行させるときのノウハウ - Qiita](http://qiita.com/chroju/items/ec2f7bb87d9ae3603c6a)

# プロンプト
※注意: Vagrantのansible_localではプロンプトは使用できない
## プロンプトから変数の設定
[Prompts — Ansible Documentation](http://docs.ansible.com/ansible/playbooks_prompts.html)

# パッケージ
## パッケージのインストール
### apt
[[Ansible][apt] Ansibleでのapt設定方法 - Qiita](http://qiita.com/koara-local/items/44425d663e9b5b626fcb)

# System関連
[[Linux][Ansible] timezoneの設定 - Qiita](http://qiita.com/koara-local/items/9da1476a173aa3e95b72)
[[Linux][Ansible] localeの設定 (ja_JP.UTF-8) に設定 - Qiita](http://qiita.com/koara-local/items/8cf895a29ae8fae1a85e)

# タスクの実行条件を指定
[Conditionals — Ansible Documentation](http://docs.ansible.com/ansible/playbooks_conditionals.html)

## ファイルが存在しているときのみ実行
[ansible でファイルがある場合のみ実行したい場合のベストプラクティス - Qiita](http://qiita.com/waterada/items/8b938eea4fa90eaf2ec2)

# パラメータでタスクを繰り返し実行
[with_fileglob](http://docs.ansible.com/ansible/playbooks_loops.html#id4)などを使ってファイルが存在しているときのみ実行も可能
[Loops — Ansible Documentation](http://docs.ansible.com/ansible/playbooks_loops.html)

# デバッグ
## デバッグメッセージの出力
[debug - Print statements during execution — Ansible Documentation](http://docs.ansible.com/ansible/debug_module.html)

# 設定例
## postgresql
[ansibleでpostgresqlインストール - Qiita](http://qiita.com/kitaro_tn/items/04aa7279c17be8b9b0ed)

# 参考
[Vagrant + Ansible で開発環境を作るなら ansible_local プロビジョナがいい！ - Shin x Blog](http://blog.shin1x1.com/entry/ansible_local-provisioner-in-vagrant)
[Ansibleでのパスワードの取り扱い - Qiita](http://qiita.com/jimaoka/items/535d5feb9b99fe5b3318)
[Ansibleの冪等性とPlaybook ｜ Developers.IO](http://dev.classmethod.jp/server-side/ansible/ansible_playbook_with_idempotence/#toc-command)