Red Hat の杉村です。Ansible のテクニカルサポートエンジニアをしています。この記事は、Ansible Advent Calendar 2018 の 22 日目の記事です。
Ansible は日々進化を続け、さまざまな種類のサーバやネットワーク機器に対応するようになりました。Ansible で使われている技術について、一言二言で軽く紹介していこうと思います。
Red Hat の杉村です。Ansible のテクニカルサポートエンジニアをしています。この記事は、Ansible Advent Calendar 2018 の 22 日目の記事です。
Ansible は日々進化を続け、さまざまな種類のサーバやネットワーク機器に対応するようになりました。Ansible で使われている技術について、一言二言で軽く紹介していこうと思います。
Core components
YAML
Playbook は YAML で書きます。見出しと処理を順に並べていくというイメージです。
Jinja2
Playbook で使われるテンプレートです。YAML を強化して、変数を動的に割り当てたり、先の処理結果をフィルタして加工したりします。
Inventory
Playbook の処理対象を定義します。
Static
グループとホスト名/IPアドレスを組み合わせて定義します。 追加で接続情報なども書くことができます。
Dynamic
Dynamic Inventory は Ansible の最大の強みの一つと言えると思います。 Amazon EC2 / VMware vSphere, ESXi / Red Hat Satellite などのサービスにアクセスして、動的にグループやホストを組み立てることができます。
例えば「EC2 でこのタグが付いているものを対象にする」などをスクリプトで簡単に作ることができます。同じ Playbook で開発環境と本番環境を切り替えたり、さまざまな用途があるでしょう。
Variables
さまざまな変数をあちこちで定義して使うことができます。
Facts
処理対象から取得した情報を利用したいときに使います。例えばホスト名でインベントリを指定したとき、そのIPアドレスを取得して別なタスクで使いたい場合などがあります。
Vault
パスワードなどの機密情報を暗号化したいときに使います。
Role
Task を組み合わせて再利用したい形にまとめたものです。ディレクトリやファイル名に一定の規則があります。
Galaxy
Role をさらに再利用しやすくするために web などからダウンロードして共有して使える仕組みがあります。
- https://docs.ansible.com/ansible/latest/reference_appendices/galaxy.html
- https://galaxy.ansible.com/
Python modules
Ansible のモジュールは Python で書かれています。標準でインストールされるもので使える範囲もかなり広いのですが、コミュニティで保守されているモジュールなどの中には Python のモジュールを pip でインストールして使うものもあります。
Playbook
これまで紹介してきたようなさまざまな要素を組み合わせて、Playbook を書いていきます。ドキュメントではベストプラクティスを紹介していますので参考にしてください。
接続方式
Ansible から処理対象のノードに接続する方式はさまざまなものに対応しています。
SSH
一番基本的なものが SSH です。SSH サーバが起動している必要があります。
WinRM
Windows では WinRM を使います。接続できるようにあらかじめ設定しておく必要があります。SSH とは異なり、Windows では標準で起動していないサービスなので少々手間がかかります。
Network
ネットワーク機器への接続にも対応しています。SSH を基本的には使いますが、プロンプトや接続ユーザの扱いなど、各ベンダーごとにプラグインして細かく対応するという実装になっています。
認証方式
接続した後の認証方式もさまざまなものに対応しています。一般ユーザで接続して、権限を root などに昇格させて処理を実行させるということもできます。
SSH
SSH では基本的なパスワード認証に加えて、公開鍵認証にも対応しています。踏み台を経由して接続していくこともできます。
Windows
Windows の独自の認証方式にもいろいろと対応しています。NTLM や Kerberos がよく使われているようです。
Ansible Tower / AWX
Ansible Tower (AWX) は、Ansible をさまざまな面から強化します。Tower で使われている技術もいろいろとあります。
Django
Tower も Ansible Engine と同様に Python で書かれており、Web アプリケーションフレームワークとしては Django を利用しています。
RabbitMQ
他の Red Hat のプロダクトでもよく利用されている MQ サービスの RabbitMQ を Tower でも使っています。処理の振り分けのコアを担っています。
Celery
タスクを起動します。あまりメンテナンスされていないのと、Python 3 への対応ができていないため、近い将来別な実装に置き換わる予定です。
Memcached
キャッシュサービスです。Tower から Playbook を実行すると順番に画面に表示されていくようになっているのですが、そのためのログをキャッシュしていたりします。
PostgreSQL
Tower ではデータベースに PostgreSQL を利用しています。ほとんどの設定情報や処理結果がこの DB に格納されています。
Nginx
Web サーバは Nginx を利用しています。
Daphne (Websocket)
ブラウザで動的に画面が切り替わる処理は Daphne が担当しています。Websocket でサーバの Memcached とやりとりして返す処理をしています。
Notification
Tower で実行した処理を他のシステムに通知することができます。Slack にチャットメッセージを流したり、Mail で通知したりできます。
Logging aggregation
処理のログは PostgreSQL に蓄積されていきますが、外部のログサービスにも転送していくことができます。Splunk や ELK、Sumologic などに対応しています。
Authentication
Tower へのログインにはさまざまな認証方式に対応しています。ログインできるというだけでなく、Tower でのグループへのマッピングも行うことで、ユーザの種類に応じた正しい権限を与えることができるようになっています。
OAuth2
Consumer と Provider の両方に対応しています。
- https://docs.ansible.com/ansible-tower/latest/html/administration/oauth2_token_auth.html
- https://docs.ansible.com/ansible-tower/latest/html/administration/social_auth.html
Enterprise
SAML や RADIUS などの Enterprise な認証方式にも対応しています。
LDAP / Active Directory
LDAP もよく使われています。Active Directory との連携もよくお問い合わせいただきます。
REST API
Tower は REST API を備えており、API からほとんどの処理を実行できるようになっています。お問い合わせいただく際には画面だけだとよくわからないこともあるので、API の処理結果をいただくとわかりやすいです。
API を簡単に実行できるような tower-cli というツールも github で開発されています。
Load Balancer / Proxy
Tower はクラスタリングにも対応しています。処理を分散したり、セキュリティのために分離したりということもできます。
Backup / Restore
インストールスクリプトをバックアップやリストアにも使うことができます。
VirtualEnv
Python の VirtualEnv の仕組みを使って、Tower から実行する Ansible Engine を複数共存することができます。
Git
実行する Playbook の最新のものを Git で取得してくることができます。Git との連携がむしろ基本形となっており、CI / CD の用途にもスムーズに対応します。
OpenShift
AWX は Docker を対象にしていますが、Tower は OpenShift 上でも稼働させることができます。
OpenShift についてはこの「赤帽エンジニアブログ」でも多数の記事がありますのでご覧ください。
おわりに
このように、Ansible や Ansible Tower は幅広くさまざまな技術を組み合わせて動いています。どれを一つ取り上げてもそれぞれ深みがあり、世界中から寄せられる問い合わせに対応しながら日々の学びを実感しています。これからも Ansible のトラブルから世界を救っていきます!