仕組み
インストールの構成要素、起動時に起きること、データの保存場所
アーキテクチャ
AnsibleForms は、MySQL データベースを使って Web アプリケーションと REST API を提供する Node.js サーバーです。フォームは YAML ファイルから読み取り、自分では何も実行しません。各ジョブを ランナー に渡します。プレイブックは RTE (ランタイム環境)コンテナーのいずれかに渡されて ansible-playbook が実行され、テンプレートやジョブは AWX、AAP、Ascender、Semaphore、Rundeck、Jenkins に渡されます。
図の各コンポーネントには、それぞれ次の役割があります。
| コンポーネント | 役割 |
|---|---|
| ブラウザー | Vue の Web アプリケーション。フォーム、 デザイナー 、ジョブ履歴、設定 |
| AnsibleForms サーバー | フォームを評価し、ジョブを記録し、ワークフローとスケジュールを実行し、各ジョブをそのランナーに渡して追跡し、 REST API を提供します |
| ランナー | ジョブの実行場所で、 接続 > ランナー で追加します。フォームは runner: <name> で 1 つを指定するか、その種類の既定のランナーを使います( ランナー を参照) |
| RTE コンテナー | 1 つ以上のランタイム環境コンテナーで、 AF_ROLE=rte で起動した同じサーバーです。それぞれが ansible フォーム のために、イメージの python ライブラリとコレクションを使って ansible-playbook を実行し、出力と最終的なステータスを 1 本の WebSocket でサーバーに返します。データベースの認証情報は持ちません( RTE の動作 を参照) |
| AWX / AAP / Ascender、Semaphore、Rundeck、Jenkins | テンプレートとジョブ用のランナーです。 AWX フォーム はジョブテンプレートまたはワークフローテンプレートを起動し、 Semaphore 、 Rundeck 、 Jenkins のフォームはそれぞれのジョブを起動して、サーバーがその出力を追跡します |
| MySQL / MariaDB | ジョブとその出力、ユーザー、認証情報、接続を保持します。読み書きするのはサーバーだけです |
| 永続フォルダー | config.yaml 、フォームファイル、プレイブック、ログ、バックアップを保持します |
| データソース | フィールドを埋めます。 データベースのクエリ 、 REST API 、ファイル、 その他の関数 です |
| シークレットストア | 使用時に認証情報のユーザーとパスワードを提供します。 シークレットストア を参照してください |
| Git リポジトリ | フォーム、プレイブック、 config.yaml をバージョン管理します |
| ログインプロバイダー | ローカルユーザーに加えて、 LDAP、Entra ID、OIDC でユーザーをサインインさせます |
| 通知チャネル | 通知 と承認依頼を運びます。 メール、Slack、Microsoft Teams、Telegram、Webhook です |
| Syslog サーバー | ログと監査証跡を書き込まれるそばから受け取ります。 Syslog を参照してください |
| MCP クライアント、チャット | 任意で、どちらも既定ではオフです。 MCP サーバー と チャットアシスタント で、チャットアシスタントにはモデルプロバイダーが必要です |
既定では、1 つのコンテナーがサーバー、Web アプリ、バックグラウンド処理をまとめて実行し、その隣で 1 つの RTE が動きます。ロードバランサーの背後に複数のアプリノードを置く構成、 バックグラウンド処理を実行するワーカー、RTE の追加については、 スケーリング を参照してください。
使用している技術
サーバーと Web インターフェースは、次のコンポーネントで構築されています。
| 部分 | 技術 |
|---|---|
| サーバー | Node.js と Express |
| データベース | MySQL または MariaDB |
| Web インターフェース | Vue 3、Bootstrap 5、Font Awesome |
フォームを起動すると何が起きるか
起動は、ブラウザーからでも REST API からでも、同じステップを通ります。
- 読み込み : サーバーはユーザーの ロール が許可するフォームだけを送り、サーバー側の式を評価します
- 送信 : ブラウザーはフィールドの値を extravars に変換し、
POST /api/v2/jobに送ります - チェック : サーバーはユーザーのロールでフォームを読み込み直し、 起動時の検証 が有効なら値をチェックします
- 記録 : ジョブがステータス
runningで保存され、その ID が__jobid__として extravars に追加されます - 承認 :
approvalポイントを持つフォームは、承認者がジョブを受け入れるまで待ちます - 認証情報 : プレイブックの場合、アプリ(RTE ではありません)がフォームの認証情報をデータベースまたは シークレットストア から読み取ります
- 実行 : ジョブはそのランナー、つまりフォームが
runner:で指定したもの、またはその種類の既定のランナーに渡されます。プレイブックの場合、アプリは その RTE 用に封をした認証情報とともに、RTE の WebSocket 経由でジョブを送り、RTE がansible-playbookを実行します( RTE の動作 を参照)。 テンプレートやジョブは AWX、AAP、Ascender、Semaphore、Rundeck、Jenkins が実行します。 ワークフロー はそのノードを、それぞれ 専用のランナー上の個別のジョブとして実行します - 追跡 : サーバーは届いた出力をデータベースに保存します。プレイブックの場合は RTE がソケット経由で送り、それ以外は ほかのランナーから読み取ります。フォームのページは 2 秒ごとにジョブを読み直し、「ジョブ」ページはサーバーが 変更を通知するたびにライブで追従します
- 終了 : ジョブは最終的なステータスになり、フォームが求めていれば、その
notificationsがメールと 通知チャネル に送られます
保存場所
AnsibleForms は状態を 2 か所に保存します。MySQL データベースと永続フォルダーです。両方をバックアップしてください。
データベース
データベース AnsibleForms は初回起動時に作成され( ALLOW_SCHEMA_CREATION が 0 の場合を除く)、次のものを保持します。
- ジョブ、その extravars と出力、スケジュール、保存済みジョブ
- ローカルユーザー、グループ、API トークン
ENCRYPTION_SECRETで暗号化された認証情報と、シークレットストアの接続- ランナー、通知チャネル(メールを含む)、Syslog サーバー、そして LDAP、SSO、リポジトリ、チャットアシスタントの設定
- 監査ログ
永続フォルダー
イメージでは /app/dist/persistent 、ソースからの場合は server/persistent です。各パスには専用の 変数 があります。
| 既定のパス | 変数 | 内容 |
|---|---|---|
config.yaml | CONFIG_PATH | カテゴリ、ロール、定数 |
forms/ | FORMS_FOLDER_PATH | フォームファイル( .yaml または .yml )。必要ならサブフォルダーに分けられます |
playbooks/ | ANSIBLE_PATH | ansible フォームのプレイブックと、その作業ディレクトリ |
repositories/ | REPO_PATH | Git リポジトリのクローン |
forms_backups/ | FORMS_BACKUP_PATH | デザイナーが保存の前に作成するコピー |
backups/ | BACKUP_PATH | データベースのバックアップ |
uploads/ | UPLOAD_PATH | file フィールドでアップロードされたファイル |
logs/ | LOG_PATH | ansibleforms.log と ansibleforms.errors.log |
certificates/ | HTTPS_CERT, HTTPS_KEY | HTTPS が 1 の場合の証明書と鍵 |
.env | 設定ページから保存された環境変数( ALLOW_ENV_EDIT が 0 の場合を除く) |
生成された SSH キーは HOME_PATH にあり、既定では永続フォルダーの外です。