Ansibleをとりまくさまざまな技術について

f:id:sugitk:20181222134415p:plain
Ansible Tower

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 などからダウンロードして共有して使える仕組みがあります。

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 の両方に対応しています。

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 のトラブルから世界を救っていきます!

* 各記事は著者の見解によるものでありその所属組織を代表する公式なものではありません。その内容については非公式見解を含みます。