Ansible 2.0リリース！

# **Ansible 2.0リリース！**

つい先ほど、待ちに待ったAnsible 2.0がリリース、GAされました。

- **[Ansible 2.0 - Over the Hills and Far Away](https://github.com/ansible/ansible/releases/tag/v2.0.0.0-1)**

作者の [jimi-c](https://github.com/jimi-c) こと James Cammarata のリリース記事があるので早速訳してみたいと思います。
(正確さについてはお察しなので、イミフなところは原文と併せてご確認ください)

- **[ANSIBLE 2.0 HAS ARRIVED](http://www.ansible.com/blog/ansible-2.0-launch)**

(追記)
2016年1月22日現在、ソースをそのまま使う他には **pip**, **epel-testing** を使うと Ansible 2.0 を簡単にインストールすることができます。

- **pip** : `pip install ansible`
- **epel-testing** : `yum install ansible --enablerepo=epel-testing`

# **ANSIBLE 2.0 HAS ARRIVED**

1年以上の作業を経て、Ansible 2.0 ("Over the Hills and Far Away")のリリースおよびGAのアナウンスができることをとても誇りに思います。
今回のリリースは、これまでのAnsibleリリースの中で最も野心的なリリースであり、私を驚かせ続けたコミュニティからの莫大な貢献の結果でもあります。
最新のメジャーAnsibleから数えて約300人以上のユーザが "v2" のため、約500人以上のユーザが各種モジュールのために貢献を重ねてくれました。

# **Why Did We Start V2?**

ソフトウェアリファクタリングには多くの落とし穴があるにも関わらず、どうして私たちはこのような大規模なプロジェクトに取り組むことにしたのでしょうか。
私たちが "v2" に関する作業を始めた頃、Ansibleは3歳を過ぎ、コントリビュータも1000人を超えてきたところでした。
このような急速な成長とともに、また私たちが機能追加をし続けることとともに技術的負債が姿を現してきました。

最終的に、私たちは明確なアーキテクチャ指針に基づかないにも関わらず、機能が固定化されることを避けるため、いくつかのコードベースについて書き直しを決めました。
また、言語機能の追加をより容易にするべく、エラーやその他の詳細情報を出力させるためにPlaybookやYAMLの解析(後でより詳しく解説します)にあたる大部分のコードを書き直しました。
最後に、こまごまとしていて明確なまとまりのないコード群を "utils" として再編成していきました。

全体を通じて、基本的なゴールの1つとして位置づけていたのは既存のPlaybookに対する後方互換性を維持するということでした。
Playbookを解析し、実行するという観点で言えば、私たちはゴールに到達することができました。
しかしながら、一部で互換を維持できなかった機能についてはユーザ周知のため以下で詳しく述べたいと思います。

# **What’s New**

Ansible 2.0ではかなりのリファクタリングが施されました。
この新たなアーキテクチャからどのような新機能が実装できるかについて考えた結果、いくつかの新機能を追加するに至りました。

## **Task Blocks**

Block機能はPlaybookに対して例外処理の機能を提供します。例外処理については Python(やその他多くの言語) の持つ try/except/finally をモデルにしています。
これにより単一のPlaybookだけでも、タスクが失敗してしまうケースを含むものを開発することが以前よりも容易になりました。

また、Blockを使えば一連のタスクをタグや条件判断といったタスク属性を用いてグループ化することができるようになります。

## **Playbook Parsing, Error Reporting Improvements, and Dynamic Includes**

上で述べたように、Playbookの解析などに関わる部分についてはほぼ全てを書き直しています。
このことにより、エラーの箇所の明確化や単純なYAML構文エラーだけでなくその修正のサジェストまでが可能になりました。

加えて、includeについても動的な実行ができるようになりました。
Ansible 1.9やそれ以前において、includeは事前実行の段階において処理され、各タスクはインベントリのデータが使用可能になる前に展開されてしまっていました。
この結果、includeとwithを併用(Ansible 1.6で併用不可)しようとしたユーザに問題を発生させていました。
Ansible 2.0ではこの機能が復活、さらに以前よりも柔軟な機能となりました。

## **New Execution Strategy Plugins**

この機能が今回のリファクタリングによって特に実装することができた機能です。
ストラテジーによって対象のホスト上でAnsibleがどのようにタスクを実行するかを変更させることが可能になりました。
従来のAnsibleでは単一のタスクが次のタスクに遷移する前に全ホスト上で走っていました。(現在の呼び方では"linear"となります)
Ansible 2.0ではもう1つ、"free"ストラテジーを含んでおり、これは各ホストにおいて他ホストの待ち合わせをすることなく、可能な限り早く次々と(記述された順に)タスクを実行させるものです。

そしてこれらのストラテジーは(Ansibleで他がそうであるように)Pluginとなっており、ユーザが独自のストラテジーPluginを作成することも可能です。

## **New Modules**

Ansible 2.0では "batteries included" である伝統を引き継ぎ、200以上のモジュールを含んでいます。
いくつかのものを下記で紹介します。

- OpenStack環境の管理用モジュール追加
- AWS環境の管理用モジュール追加/改善
- VMware環境の管理用モジュール追加
- Windows環境の管理用モジュール追加
- DockerおよびDocker接続Pluginの改善

# **Known Issues with Ansible 2.0**

直近で解決に取り組むものを含め、上で述べたようにAnsible 2.0ではいくつかの非互換機能が存在します。

## **Plugin API Changes**

内部的には、私たちが行った主要なクリーンアップの一つは、各Pluginクラス(action, callback, lookupなど)が共通の基本クラスから継承することでした。 これによりコードの重複の多くを排除することができましたが、これはまたPlugin APIが大幅に変更されたことを意味します。 
そのため特定のタイプのPluginについては、Ansible 2.0上でも動作するように更新していく必要があります。

## **Dynamic Include Problems**

今回のリファクタリングを通じ、includeされるタスクは実行時に評価されることになり、Ansibleはincludeして実行されるタスクを事前に知ることができなくなりました。
このことはいくつかの状況において問題(将来のバージョンでは修正される予定です)を引き起こしてきます。

- タスクに設定されたタグはincludeが実行されるまで見られることがないため、includeされる個々のタスクではなくincludeに対してタグを設定しないと評価されません。--list-tags オプションについても同様です。

- include内部のHandlerからはnotifyが機能しません。そのため、includeとHandlerの同時利用を避ける必要があります。

(追記)
ここの **Dynamic Include Problems** で触れられているタグやHandlerの不具合ですが正確にどの事象を指すのかよくわかっていません。
こちらの記事を参考にしてみてください。
**[実サービスで利用中のAnsible 1系をAnsible 2.0にアップグレードすると、何が起こるか？](http://recruit.gmo.jp/engineer/jisedai/blog/upgrade-to-ansible-v2/)**

また、タグに関してはこちらでも別途検証しました。
**[Ansible v2: Dynamic Include Problemsを検証する①](http://qiita.com/t_nakayama0714/items/53433ffd5bca6d33b813)**

## **Missing Tags**

現在のAnsible 2.0では存在しないタグを --tags や --skip-tags で指定してもエラーを出さないようになっています。
これは上の動的includeの問題にも関わるのですが、私たちはこれらの問題に対処し、解決するように取り組んでいます。

## **Backslash Escaping**

Ansible 1.9やそれ以前においては、一部の場合においてバックスラッシュを2度エスケープする必要があり、その結果 "\\\\" という文字列を書かなければならなことがありました。
これは特に lineinfile モジュールを使用する上では一般的なこととなっていました。
今回の改善の結果、Playbookの解析において1度のエスケープで済むようになりました。

上のようないくつかの細かな変更に関して、 [documenting in a porting guide (移行ガイド)](https://github.com/ansible/ansible/blob/devel/docsite/rst/porting_guide_2.0.rst) の作成を進めています。
こちらではこうしたバックスラッシュのような問題とその回避策について言及しています。

# **Availability**

Ansible 2.0は [Github](https://github.com/ansible/ansible), [PyPi](https://pypi.python.org/pypi/ansible) と主要なLinuxディストリビューションのパッケージマネージャから利用可能です。

Ansibleの管理、セキュリティなどに関してAnsible Towerが利用可能です。サブスクリプション形式にて、小さな企業から大規模、ミッションクリティカルなエンタープライズ用途まで全てに対応可能です。
詳しくは [ansible.com/tower](http://www.ansible.com/tower) をご確認ください。

# **Additional Resources**

- [Ansible 2.0 Changelog](https://raw.githubusercontent.com/ansible/ansible/stable-2.0/CHANGELOG.md)
- [Get Ansible 2.0](http://releases.ansible.com/ansible/)
- [Attend What’s New in Ansible 2.0 Webinar](https://attendee.gotowebinar.com/register/1556838468037127169)
- Learn more about [Ansible](http://ansible.com/get-started)

# **おわりに**

自分の英語力のなさを嘆くのは別にして、Ansible 2.0に至るモチベーションから改めて知ることができたのはよかったかなと思います。
Ansible 2.0の新機能については以前から [Ansible 2.0 変更点まとめ](http://qiita.com/yuta_h3/items/30dcfd939cb13b7e24fa) などでも言及がありましたが、Known Issueについてはそれがなかったのでチェックできてよかったなと思いました。

特に、include + tagsについてのKnown Issueは結構不穏な空気が漂っているので、時間があれば実際に動かして、どういった問題なのかを確認したいと思います。