vagrant+virtualbox環境におけるRHELの利用
問題
RHEL環境における検証を、test-kitchenにてローカルで行う場合、vagrant + virtualboxかdockerの利用が一般的と思える。
RHEL系では、centosが簡易に使用可能だが、RHELと完全に同じとはならない。
vagrantを直に使用する場合にも同様。
RHELを使用する場合、dockerは、RHEL8からはpodmanなどの利用となり、dockerhubにも公式なrhelのイメージは見つけられなかった事から、やや使いにくい。
ソリューション
vagrant + vartualbox 環境においてRHELを使用し、ansibleのredhat_subscriptionモジュールにてサブスクライブを行う。
1. Red Hat Developer program membership に登録する
http://developers.redhat.com/register
にアクセスし、以下を入力してアカウントを作成する。
- ユーザー名 (Red Hat ログイン ID)
- メールアドレス
- 職務内容
- パスワード
この内、サブスクライブには以下を使用する
- ユーザー名 (Red Hat ログイン ID)
- パスワード
2. Vagrantfile (or kitchen.yml) にてRHELを指定する
Redhatのオフィシャルなイメージは無いという理解なので、ここでは以下のboxを使用させていただく
RHEL8系
https://app.vagrantup.com/generic/boxes/rhel8
RHEL7系
https://app.vagrantup.com/generic/boxes/rhel7
---
platforms:
- name: rhel8
driver:
name: vagrant
box: generic/rhel8 # <= ここに指定
suites:
- name: dev
provisioner:
name: ansible_push
playbook: site.yml
chef_bootstrap_url: nil
3. playbookから、ansibleのredhat_subscriptionモジュールを使用し、レジストレーションを行なう
- hosts: all
tasks:
- name: Register and auto-subscribe to available content
redhat_subscription:
state: present
username: foo # <= 登録したユーザー名 (Red Hat ログイン ID)
password: bar # <= 登録したパスワード
auto_attach: true
force_register: true
register: r
until: r is succeeded
- name: メイン処理タスク
...
ここではシンプルにtasks:の先頭で実行しているが、pre_tasks:にて指定しても良いでしょう。
インターネット接続が必要。
初回は数分を要するが、再実行時にはすぐに終了する。
その為、kitchen convergeによる再実行を多用するケースに向いている。
たまに失敗する為、untilを使用。デフォルトでリトライ3回、リトライ間隔5秒。
ユーザー名、パスワードの単純なハードコードを避けるならば、例えば以下の様な対応が可能。
- ansible vaultを使用する
- ~/.bash_profileなどから環境変数経由で受け渡す
環境変数経由で受け渡す例
...
export REDHAT_SUBSCRIPTION_USERNAME="foo"
export REDHAT_SUBSCRIPTION_PASSWORD="bar"
...
- name: Register and auto-subscribe to available content
redhat_subscription:
state: present
username: "{{ lookup('env', 'REDHAT_SUBSCRIPTION_USERNAME' ) }}"
password: "{{ lookup('env', 'REDHAT_SUBSCRIPTION_PASSWORD' ) }}"
auto_attach: true
register: r
until: r is succeeded
サブスクライブしたシステムの削除
CI/CDのテストで作成、廃棄を繰り返していると新たにサブスクライブできなくなる
その場合、以下などからログインして、廃棄してもう使用しないシステムを削除する事で対応できる