Ansible 2.0 変更点まとめ

Ansible 2.0 変更点まとめ

[Ansible 2.0のアルファ1.0がリリース](https://groups.google.com/forum/#!topic/ansible-project/3e1pohu1XlQ)されましたね！

(2016.01.13追記: Ansible 2.0出ました。Qiita上ではリリースニュースを [Ansible 2.0リリース！
](http://qiita.com/t_nakayama0714/items/0d602a4fae60aa78b6ef#_reference-6f5275e37cc668a01e4b) という記事で訳していただいています。)

まだ開発中ではありますが、[CHANGELOG](https://github.com/ansible/ansible/blob/devel/CHANGELOG.md)を元に大きめの変更点をまとめてみます。
（よく使われそうと主観的に思うものと、個人的によく使うものについての記述粒度が細かくなってます。）

下記情報は全て2015年8月28日時点での公式ドキュメント・リリースノート・git issue・もしくはコードにもとづいてます。2.0の正式版リリース時の情報と変更される可能性はまだあるかもですが、大きな変更は一緒なはずです。

記事の内容に間違っているものなどあれば、ご指摘いただけると嬉しいです！

# 大きめの変更

CHANGELOGより抜粋。全項目の訳などではなく、独自の解説や複数項目をまとめています。

## [Block機能](https://docs.ansible.com/ansible/playbooks_blocks.html)のサポート

* blockディレクティブ
	* いままで1つのタスクに対してwhenなどをいちいち書いていたのをまとめられるようになります
	* 未確認ですが、まとめたものに対しtagをつけることも可能かも
* rescue:ディレクティブ
	* 書いておくことで、blockの内部の処理でエラー発生時に行うタスクを指定できる
	* 要するにエラーハンドリング機能
* alwaysディレクティブ
	* rescueに落ちようが、blockで完結しようがいつも実行されます
	 
## [strategyプラグイン](https://docs.ansible.com/ansible/playbooks_strategies.html)のサポート

taskのhostに対する実行順を```linear```, ```free```で制御可能になります。

* ```linear```
	* 今まで(〜1.9)と同じ動作
	* 全てのホストでそれぞれのタスクを次タスクに行く前に終わらせる
	* 並列処理で各ホストのタスクを実施する
	* デフォルトは5並列で並列数の設定が可能
	* 1.9以前と同様、```serial```パラメータとの併用で並列数が設定出来る ( @yunano さんありがとうございました！ )
* ```free```
	* ホスト間においてタイミングの調整など取らずとにかく早く終わるように実行する

なおプラグインと書いてあるのは自由に実行順序制御をユーザでも追加出来るからです。


## エラーハンドリングの改善
 
* エラーハンドリングの改善でもっと細かいエラーメッセージが出るようになった（エラーメッセージパーサーの改善）

## includeタスクの機能拡張

* includeタスクにおいて多くのオプションやダイナミックincludeをサポート
	* 例えばincludeでtagが使えるようになったり、等
	* なんか微妙にまだバグがありました
	* with_* にも対応したようです

## Developing PluginsのAPI変更

いくつかの[Developing Plugins](http://docs.ansible.com/ansible/developing_plugins.html)のAPI変更がありました。

* callback, connection, lookup pluginのAPIが変わっているようなので、Extra Moduleや自作モジュール、とりこまれていない野良モジュール等使っている人は注意が必要かもしれません。

## Playbook設定の継承

* Playbookの中で設定した値や設定がblockやroleの中で継承される範囲を増加
	* 今までいろんなところに散らばってしまってplaybookやroleが巨大になってくるとなかなか複雑だったのをシンプルにできそうです
	* また、今までAnsibleの新機能開発の際はこの継承をいちいち書いていたのを共通的に使えるようになったので、Ansibleの開発者は楽できそうですね
	* CHANGELOGにはあるのですが、該当のIssueやドキュメントを探すことが出来ませんでした・・・。具体的にはどれを言っているんだろう。

## templateモジュールの動作変更

* templateモジュールがboolや数値を文字列型に変換して挿入していたのをそのまま利用するように変更
	* もし前と同じ動作を使いたいのであれば値をクオートしてくれとのことです
	* 個人的にはあまりハマらないと思いますが、一応既存Playbookは確認が必要ですね

## metaの機能追加

* [meta](http://docs.ansible.com/ansible/playbooks_intro.html)で refresh_inventoryを使うとインベントリを強制リロード出来るように

## vars機能の拡張

* varsがplay、block、role、taskそれぞれのレベルで設定出来るようになった

## yamlにおける空の変数の扱い方の変更
   
* yaml中の空の変数およびnull変数が今まで空の文字列に変換されていたのを、変換しないでそのままになるよう変更


# 新規モジュール

多すぎるので詳細は割愛しますが、AWS EC2, Route 53, s3, cloudtrail関連やCenturylink, Cloudstack, OpenStack, VMware Vsphere関連等クラウドマネジメントソフトやクラウドサービスベンダ対応のものが非常に多く追加されています。（Core Modulesに昇格しているのはそのうちAWS関連, OpenStack関連, vSphere関連が多い。）

また、モジュール名の整理（後述するOpenStack等）でモジュール名から機能をわかりやすくする、などしていますが、AWSはamazonやawsなどの接頭語はつかず、AWSの1サービス単位からモジュール名が始まる謎。（例：s3_logging）
これはそのうち命名規則を統一して名称変更されるのかな。

## その他新規モジュール(個人的に注目したもの)

Extra含めると多すぎるので、抜粋です。

名前の後にExtra/Coreをつけています。
findなどの追加で複雑なConditionalのPlaybookをかけるようになりました。

* bundler (Extra)
	* みんなだいすきbundler
* consul系モジュール (Extra)
	* consulをサポートするmodule群が追加
		* consul
		* consul_acl
		* consul_kv
		* consul_session
* expect (Extra)
	* expectしてパスフレーズを送るなどが可能になった
	* shellでもいいんじゃないかと個人的には思いましたが、使いどころはどこなんでしょう
	* うまい具合に結果をParseしてくれるからまぁ、ということでしょうか
* find (Core)
	* Shellでfindするのと同様ではあるが、値がparseされてansibleの変数として格納するのが楽になりそう
* sensu系モジュール
	* subscriptionが出来るExtra moduleが追加されました（しかしドキュメント現時点でなし）
	* sensu_check (Extra)
	* sensu_subscription (Extra)
* zabbix系モジュール
	* 個人的にはzabbix_hostがすごく嬉しい。いままでAPIで叩いていたので。
	* zabbix_host (Extra)
	* zabbix_hostmacro (Extra)
	* zabbix_screen (Extra)




# 廃止予定モジュール

大きな流れで、OpenStack関連モジュールが命名規則を```OpenStackのコンポーネント名_機能```だったものから、```os_機能```に名前変更および実装なども変わっているようなので注意が必要です。以下は8/28現在でCHANGELOGに書かれているものの全てです。

* ec2_ami_search (ec2_ami_find)
	* ec2_ami_find moduleの一部になりました（というより、そちらでカバーしているので廃止）
* quantum_network (os_network)
	* os_network moduleでリプレースされました
* glance_image
	* os_image moduleでリプレースされました
* nova_compute (os_server)
	* os_server moduleでリプレースされました
* quantum_floating_ip (os_floating_ip)
	* os_floating_ip moduleでリプレースされました

# モジュールのアップデート

多くの物に手が入っていますので、一部のみ。

## Docker関連
Docker関連モジュールは非常に多く変更・機能追加が入っています。

例えば以下のようなものです。

### dockerモジュール

- cap_addオプションのサポート
- cap_dropオプションのサポート
- cpu_setオプションのサポート
- docker_userオプションのサポート
- extra_hostsオプションのサポート
- log_driverオプションのサポート
- read_onlyオプションのサポート
- signalオプションのサポート

詳細は[docker_moduleのページ](http://docs.ansible.com/ansible/docker_module.html)を参照してください。

### docker_imageモジュール

- docker_api_versionオプションのサポート
- dockerfileオプションのサポート

詳細は[docker_image_moduleのページ](http://docs.ansible.com/ansible/docker_image_module.html)を参照してください。
個人的にはdocker_api_versionオプションのサポートが大きいです。（いままでdockerモジュールにはあったのですが、docker_imageにはなかったのでshellでごにょごにょしてました。）

### dockerへのconnection plugin

dockerコンテナ内部の中にsshをいれないでも操作できるようにするプラグインです。
[Developmentメーリングリストで投げられていた](https://groups.google.com/forum/#!topicsearchin/ansible-devel/$20$20connection$20plugin$20docker/ansible-devel/63J4DlWEtJE)ものが取り込まれたようです。

コードは[これ](https://github.com/objectified/ansible/blob/feature-docker-connection/lib/ansible/plugins/connections/docker.py)。
Dockerが動いているコンテナへのファイルをコピーする機能をネイティブ提供していないので```docker exec```してファイルを```cat > $filename```で流し込んでいたりと頑張って実現をしています、というコメントが入っていたりします。が、docker 1.8.0でdocker cpが[ホストからコンテナへのファイルコピーをサポート](https://github.com/docker/docker/pull/13171)するのでこちらの実装で書き換えるのでしょうね。catで流し込むより高速でしょうし。
これからに期待なconnection pluginです。


# ダイナミックインベントリ

ダイナミックインベントリのインベントリスクリプトにも以下が追加されています

* cloudstack
* fleetctl
* openvz
* proxmox
* serf

# その他変更

他にもLookupにHashiCorpのVaultが追加されたり等、多くの変更が入っています。
その他マイナーな変更やバグフィックスも入っているので、github issues, CHANGELOG, ansible-dev等を参照してみてください。

それでは、良いAnsibleライフを！

# 元ネタ等(Thanks!)

https://github.com/ansible/ansible/blob/devel/CHANGELOG.md
http://docs.ansible.com/ansible/
[Ansible 2.0リリース！](http://qiita.com/t_nakayama0714/items/0d602a4fae60aa78b6ef#_reference-6f5275e37cc668a01e4b)