Ansible Tower で Private Git レポジトリから role を取得する

Calendar for Ansible | Advent Calendar 2021 - Qiita の 22日目の記事になります。

Ansible Tower では Playbook をGitレポジトリ(Private可)から取得して使用できますが、Playbookと別のGit レポジトリ(Private可)にある Roleも同様に取得できるので紹介します。 Ansible Advent Calendar 2021 の 17日目にyo_C_taさんが似たテーマ(Private レポジトリにある collections の取得)を投稿していますので、合わせてどうぞ。

GitLab の private repository を ansible-galaxy collection install する - Qiita

やりたいこと・想定

  • Ansible Tower を使う
  • Playbook は Git レポジトリで管理しているものを使う
  • Playbook が使う role は Playbook とは別の Git レポジトリで管理
  • Playbook が使う role は Playbook のレポジトリ内の requirements.yml で定義
  • Playbook も Role も Private な Git レポジトリで管理

以下、参考情報

Ansible Tower での role の取得

playbook のレポジトリの roles/requirements.yml に必要な role の git レポジトリのURLを記載しておくと Ansible Tower が Playbook のGit レポジトリを取得する際に role のレポジトリも取得してくれます。 (ansible-galaxy install -r roles/requirements.yml コマンド相当)

Playbook が Private Git レポジトリにある場合

対象の role が ansible-galaxy 等の公開されている場所であれば良いのですが git clone するのに認証が必要な Private Gitレポジトリを取得するには、ユーザ名/パスワードや秘密鍵等の情報を渡す必要があります。

Ansible Towerではこうした認証情報をCredentialオブジェクトとして作成し、Gitレポジトリの取得や、Playbook実行時のログイン情報に使用可能です。これはパスワード/パスフレーズ等の認証情報の中身を直接知らなくても扱えるようにするための仕組みです。

f:id:nanodayo:20211222162245p:plain
認証情報の画面例

Project (ここではお目当てのPlaybookがあるGit レポジトリ)を作成する際に、Gitレポジトリの認証情報(Credentialオブジェクト)を付与できるため、Private Git レポジトリも取得できます。

f:id:nanodayo:20211222162554p:plain
project 作成画面の例 ※URLはダミー

ansible-galaxy コマンドで取得する role が Private Git レポジトリにある場合

PlaybookのGit レポジトリの取得に認証情報を適用するのは機能としてあるので、次に気になるのはrequirements.yml に定義した role も Private Gitレポジトリにある場合です。 requirements.yml の中に Role を取得するための認証情報も記載可能ですが、Git管理下のファイルに認証情報を含めると、うっかり公開してしまう可能性もあり、避けたいです。

認証情報を中身が見えない形で取り扱えるのも Ansible Tower を使う理由の一つですので、 Playbook取得用の Credential をそのまま Role の取得でも使ってほしいですよね。使ってくれます。

やってみた

ここでは例として、以下のように roles/requirements.yml 内に認証情報は付与しない形でHTTPSの Git URLを指定します。(認証なしでは取得不可能な設定のGit レポジトリとします。)

---
- src: https://gitlab.hogehoge/hogehoge_role.git
  scm: git

このファイルが含まれている playbook の Git レポジトリを登録した Ansible Tower の Project を同期すると、requirements.yml を元に role を取得してくれますが、認証情報を付与した上で実行されます。

f:id:nanodayo:20211222154047p:plain
project 同期画面(url はマスクしています)

オチ

Playbookのレポジトリにしか認証情報が適用されないのではないかと思い、特殊な記述などがあるのか調べていたら、 こちらの issue に辿りつき、requirements.yml での role 取得にも対応していることを知りました。

github.com

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