Ansible Playbookに「ガバナンス」を!ansible-policyで実現するポリシー自動チェック

こんにちは、Ansibleテクニカルサポートの呉です。この記事は、「Ansible Advent Calendar 2025」23日目の記事です。

qiita.com

ansible-policy は、Policy as Code を実現するために開発され、2024年にRed Hatから発表されました。Ansible本体に比べると非常に新しいツールですが、Open Policy Agent (OPA) と連携してPlaybookの妥当性をチェックできる、運用者待望のツールとして注目されています。

www.redhat.com

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コマンドの動作環境を構築します。

github.com

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)で実行されるジョブも、実行前に検閲することができるようになりますので、よりコンプライアンスが守られ、安全な自動化を実行することができるようになりそうですね。

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