こんにちは、Ansibleテクニカルサポートの呉です。この記事は、「Ansible Advent Calendar 2025」23日目の記事です。
ansible-policy は、Policy as Code を実現するために開発され、2024年にRed Hatから発表されました。Ansible本体に比べると非常に新しいツールですが、Open Policy Agent (OPA) と連携してPlaybookの妥当性をチェックできる、運用者待望のツールとして注目されています。
1. はじめに:なぜ Ansible に「ポリシー」が必要なのか?
Ansible Lintなどのツールは書き方の作法(構文)をチェックしてくれますが、その設定値が組織の運用ポリシーやルールに合っているかまでは判断してくれません。
「テスト環境なのに高額なインスタンスタイプを選んでいないか?」
「セキュリティ上、禁止されているパッケージをインストールしようとしていないか?」
などなど、人間がコードレビューでチェックするのは大変です。そこで、Policy as Code (PaC) の考え方を取り入れ、Playbookの実装内容を自動検閲するのが ansible-policy です。
2. 動作環境構築
まずは、以下の手順に沿って動作環境をインストールしていきます。 ※本手順は、Fedora 42 上で動作することを確認しています。
まず、ansible-policyコマンドを実行するには、OPAもダウンロードする必要があります。現時点での最新版はv1.12.1(https://github.com/open-policy-agent/opa/releases)がリリースされていますので、このバージョンをダウンロードする手順を記載します。
$ curl -L -o opa https://openpolicyagent.org/downloads/v1.12.1/opa_linux_amd64_static $ chmod +x opa $ sudo mv opa /usr/local/bin/ $ opa version Version: 1.12.1 Build Commit: 92dd54dab4e77e6fffa8888c7a30f82dd7be2534 Build Timestamp: 2025-12-18T21:26:27Z Build Hostname: Go Version: go1.25.5 Platform: linux/amd64 Rego Version: v1 WebAssembly: unavailable
OPAのダウンロード後、以下のREADMEの手順(手順3まで)に沿って、ansible-policyコマンドの動作環境を構築します。
3. 実践:特定のパッケージ以外をブロックする
それでは、さっそく動かしてみましょう。 今回は、特定のパッケージ(例:mysql-server)以外をインストールするPlaybookに対し、ポリシー違反を表示する例を紹介します。
検証ファイル構成
install_packages.yml: 検閲されるPlaybook(違反を含む)
policies/check_package_policy.yml: ポリシー定義ファイル
① 検閲されるPlaybook (install_packages.yml)
- ここでは、許可リストにない unauthorized-app をインストールしようとしています。
---
- name: Set up MySQL
hosts: localhost
gather_facts: false
become: True
vars:
package_list:
- unauthorized-app # ← これがポリシー違反になる
tasks:
- name: Install Unauthorized App
become: true
ansible.builtin.package:
name: "{{ package_list }}"
state: present
② ポリシーの定義 (policies/check_package_policy.yml)
target: task: Playbook内の各タスクをスキャン対象にします。
condition: 違反とみなす条件を書きます。ここでは「ansible.builtin.package モジュールの name パラメータが、許可リストに含まれていない場合」に違反と判定されます。
actions: 条件に合致した(違反した)時の動作です。deny を指定すると、エラーメッセージを表示してブロックします。
ansible-policy では、YAML形式で直感的にポリシーを記述できます。
ここでは、"mysql-server"パッケージのみのインストールを許可しています。
---
- name: Check for mysql package installation
hosts: localhost
vars:
allowed_packages:
- "mysql-server"
policies:
- name: Check for package name
target: task # 各タスクの中身を検査
condition: |
input["ansible.builtin.package"].name not in allowed_packages
actions:
- deny:
msg: "The package {{ input['ansible.builtin.package'].name }} is not allowed..."
tags:
- compliance
実行結果
以下のコマンドで、Playbookに対してポリシーを適用します。
ansible-policy -p install_packages.yml --policy-dir ./policies
出力結果:
TASK [Install Unauthorized App] install_packages.yml L10-15 ***********************************
... Check_for_package_name Not Validated
The package unauthorized-app is not allowed. Allowed packages are one of ["mysql-server"]
-----------------------------------------------------------------------------------------------
SUMMARY
... Total files: 1, Validated: 0, Not Validated: 1
Violations detected in 1 task!
許可されていないパッケージ(unauthorized-app)をしっかりと検知してくれました!
まとめ
ansible-policy を活用することで、実行前のPlaybookの内容を検閲し、組織の運用ポリシーやルールが守られているのかを自動で確認することができます。これは ansible-lint と同じように CI/CD プロセスへ取り入れることもできるでしょう。また、Ansible Automation Platform(AAP)で実行されるジョブも、実行前に検閲することができるようになりますので、よりコンプライアンスが守られ、安全な自動化を実行することができるようになりそうですね。