たそ@ITインフラ初心者

taso@初心者エンジニア

新卒2年目 エンジニアが適当に語るブログてす

1年間お疲れ様でした。今年もありがとうございました。

はじめに

お疲れ様です。たそ(@taso_int)です。
もうすぐ年が明けますね。今年はマジで1年過ぎるのが早かった気がします。
今年を軽く振り返れたらと思います。

仕事面

色々と忙しかったような気がします。 AAP、Azure、コンテナ、k8s、Vaultなど結構触ったなと思いました。
やっぱり技術を勉強するのは難しいですが、なおさら基礎が大事なのかなと認識しています。

イベント(interopやJapanITWeek)の出展にスタッフとして参加できたことですかね。
実際にビジネスとして人と対話をする大事さを感じることが出来たと思っています。

あとはトレーニング講師や社内登壇を経験することが出来たのがかなり良かったです。

プライベート面

あんまり書くことないんですが、ジムで運動をし始めたことですかね。
痩せてはないですが、体を動かすようになったのは良かったです。

書くか迷ったこと

このブログがついに5000アクセスを突破しました。
最近は自分が書き残したいことを纏めているつもりで書いており、
そこまでアクセス数を気にしていませんが、やはり大台なので嬉しいですね。
皆様のおかげです。今後ともよろしくお願いいたします。

来年に向けては別記事で書きます。

HashiCorp Vault×Ansible Automation Platform×AWS

はじめに

お疲れ様です。 こんにちは たそ(@taso_int)です。
Ansibleのアドベントカレンダーに参加しています。
今回は18日目の記事になります。

qiita.com

今回はHashiCorp Vaultの動的シークレットエンジンを利用して、
AWSアクセスキーを発行します。
それをAnsible Automation Platformに登録して、 AWSモジュールを使いたいと思います。

やりたいこと

AnsibleでAWSのモジュールを利用する際AWSアクセスキーが必要になります。
権限によってはいろんな操作が可能です。
アクセスキーの流出で、不正利用されるなどの事例もあったかと思います。

これをHashicorp Vaultの動的シークレットエンジンを利用して、
VaultからAWSアクセスキーを発行し、それをAnsible Automation Platformに登録します。
Vaultから作成されたAWSアクセスキーは、期限を付けたり、
破棄が可能なため流出したとしても利用されるリスクが少なくなります。
それにより安全に利用することが可能です。

参考情報

Vaultドキュメント

developer.hashicorp.com

sampleリポジトリ

github.com

環境

AWS EC2

Ansible Automation Platform v2.3

HashiCorp Vault v1.12.2

今回はお互い違うサーバーを用意していますが、
検証目的であれば同じサーバーで構築しても問題ないと思います。
またAWSシークレットキーが必要になります。

構築方法に関しては以下参考にしてください

Ansible

qiita.com

Vault

taso-int.hatenablog.com

Vaultの設定

VaultではAWSシークレットエンジンの設定以下の設定を行います。
本来だと追加でapproleの設定を行い、トークンを発行しておくことをお勧めします。 時間の都合上rootトークンを使います。
ポリシーはread,list,createの設定を入れた方がいいかもしれません。

AWSシークレットエンジンの設定

Vaultが提供する機能の1部に動的シークレットというものがあります。
これは、必要な時に必要な期限を設けてシークレットを生成する機能であります。
今回はAWSですが、その他クラウドにも対応をしております。
従来だとシークレットをファイルに書いて管理しますが、
ファイルが不要になり、また期限を設けることで流出後のリスクも抑えられます。
IAMやSTSなどの発行が出来ますが、今回はIAMを作成します。

参考情報

https://developer.hashicorp.com/vault/docs/secrets/aws

今回はCLIで設定していきます。

# AWSシークレットキーの有効化
vault secrets enable aws

# root用のアクセスキーの登録
vault write aws/config/root \
   access_key=アクセスキー \
   secret_key=シークレットキー \
   region=リージョン

# root用のアクセスキーののローテート
vault write -f aws/config/rotate-root

# 発行後の失効期限を15分に設定(更新操作があっても15分)
vault write aws/config/lease lease=15m lease_max=15m

# IAMを作成するVaultロールの作成
vault write aws/roles/my-role \
        credential_type=iam_user \
        policy_document=-<<EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1426528957000",
      "Effect": "Allow",
      "Action": [
        "ec2:*"
      ],
      "Resource": [
        "*"
      ]
    }
  ]
}
EOF

これにてVault側の設定は終わりになります。
vault read aws/creds/my-roleを実行すると発行されます。
期限切れてますが、ぼかしてます。

$ vault read aws/creds/my-role
Key                Value
---                -----
lease_id           aws/creds/my-role/wYG6EegJWviT8rl7Ea0BYBpY
lease_duration     15m
lease_renewable    true
access_key         AKI***********
secret_key         geGnVnUxW**********
security_token     <nil>

これは15分以上経過するもしくはvault lease revoke aws/creds/my-role/<lease_id>を実行することで失効します。

Ansible Automation Platformの設定

手動で設定するのも悪くないのですが、
いちいち発行して、登録するのが面倒くさいのでPlaybookを書いていきます。
uriモジュールを利用して、vault read aws/creds/my-roleに相当するAPIを叩きます。
そこからawx.awx collectionを利用して、機密情報を上記の結果から登録します。
たぶん他にもやり方はあると思います。

APIを叩く

uriモジュールを使います。 ANSIBLE_HASHI_VAULT_ADDRはvaultのURL、
ANSIBLE_HASHI_VAULT_TOKENはrootのトークンが入ります。 今回は変数として置いています。

参考情報

docs.ansible.com

sample

- name: make credential
  ansible.builtin.uri:
    url: "{{ ANSIBLE_HASHI_VAULT_ADDR }}/v1/aws/creds/my-role"
    method: GET
    body_format: json
    headers:
      X-Vault-Token: "{{ ANSIBLE_HASHI_VAULT_TOKEN }}"
  register: res_newCredential

Ansible Automation Platformの登録

awx.awx.credentialモジュールを利用して登録を行います。
モジュールを利用するのが初めてで、ちゃんと書く方法があると思います。
controller_usernameとかを書かない方法が知りたいです。
知ってる方がいれば教えてください。
urlはAnsible Automation PlatformのURL
userはユーザー、passwordはログインパスワードになります。

参考情報

docs.ansible.com

sample

- name: update AWS credential
  awx.awx.credential:
    name: AWS
    organization: Default
    credential_type: Amazon Web Services
    inputs:
      username: "{{ res_newCredential['json']['data']['access_key'] }}"
      password: "{{ res_newCredential['json']['data']['secret_key'] }}"
    controller_username: "{{ user }}"
    controller_password: "{{ password }}"
    controller_host: "{{ url }}"
    validate_certs: false

実行したいと思いますが、awx.awx collectionはデフォルトEEにはないので、
リポジトリを作成して、requirements.ymlに記載しました。

実行してみる

Playbookは問題なく動いて、登録されました。

AWSを動かしてみる

試しにセキュリティグループを作成したいと思います。
すぐ実行するとエラーになったのでpauseで少し待ちます。
おそらくここはIAMではなくSTSの発行で改善できます。

tasks:
  - name: pause 3 minutes
    ansible.builtin.pause:
      minutes: 3

  - name: example using security group rule descriptions
    amazon.aws.ec2_security_group:
      name: test_vault_sg
      description: sg with rule descriptions
      vpc_id: "{{ vpc_id }}"
      region: ap-northeast-1
      rules:
        - proto: tcp
          ports:
          - 80
          cidr_ip: 0.0.0.0/0
          rule_desc: allow all on port 80

Playbookは無事動き、AWS側でも確認できました。

また期限が切れると認証エラーになります。

以上でこの記事は終わりになりますが、改善箇所が多いので、
次週またやりたいと思います。

箇所としては以下です。

  • revokeの実装
  • approleの実装
  • STSの発行
  • Playbookの修正

以上になります。少しVaultの機能をAnsibleでも生かせることが出来て良かったと思います。
ここまで読んでいただきありがとうございました。

HashiCorp Vault×Ansible Automation Platform

HashiCorp Vault×Ansible Automation Platform

お疲れ様です。

こんにちは たそ(@taso_int)です。
アドベントカレンダー2回目です。

今回はHashiCorp VaultにCiscoルータのアクセス情報(ユーザー パスワード)を保管し、
HashiCorp Vaultから接続情報を参照して、
Ansible Automation PlatformでPlaybookを実行していきたいと思います。

やりたいこと

Ansible Automation Plafromを利用する上で、
接続する機器のユーザーとパスワードを設定しておく必要があります。

これをVault側で接続情報を保管し、
Vaultから参照する方法を行っていきたいと思います。 これにより、Ansible側で機密情報を持たず、 Vault側で管理することでよりセキュアになります。

参考情報

Vaultドキュメント

developer.hashicorp.com

連携について

t.co

環境

AWS EC2

Ansible Automation Platform v2.3

HashiCorp Vault v1.12.2

Ciscoルータ Cisco sandbox(https://devnetsandbox.cisco.com/RM/Diagram/Index/27d9747a-db48-4565-8d44-df318fce37ad?diagramType=Topology)を利用

お互いに疎通が取れてる前提で行います。

今回はお互い違うサーバーを用意していますが、
検証目的であれば同じサーバーで構築しても問題ないと思います。

構築方法に関しては以下参考にしてください

Ansible

qiita.com

Vault

taso-int.hatenablog.com

Vaultの設定

Vaultでは以下の設定を行います。

  1. KVシークレットエンジンの設定
  2. Approleの設定

KVシークレットエンジンの設定

まず、Ciscoルータの情報を保管するための設定をします。
ここではKVシークレットエンジンを利用します。
KVシークレットエンジンとはシークレットエンジンの機能で、
静的シークレットの提供を行っています。
Key:Value形式で値を保管することが可能となっています。
今回はバージョン2を利用します。
参考情報

developer.hashicorp.com

CLIGUIどっちでも設定が可能です。 CLIはサクッと紹介します。

# 環境変数の登録
export VAULT_ADDR='http://127.0.0.1:8200'
# rootトークンを利用してログイン
vault login 
# kv(v2)シークレットエンジンの有効化 パスはデフォルト
vault secrets enable -version=2 kv
# ciscoというパスを作成して、各情報をkey value形式で登録する
vault kv put -mount=kv cisco user=developer password=C1sco12345
# 確認
vault kv get -mount=kv cisco

GUIでも画面交えて説明します。
アクセス画面はrootトークンでログインします。
SecretsからEnable new engineをクリックして、KVシークレットエンジンを選択します。

バージョン2であることを確認できればそのまま作成してください。

次に情報を登録します。
パスはciscoで今回保管したいユーザーとパスワードを設定します。

Approleの設定

AnsibleがvaultへアクセスするためのApproleの設定を行います。
ApproleはマシンやアプリがVaultにアクセスできる認証を提供します。
また権限を付与するためのポリシーを設定します。
Vaultではデフォルトの権限だと操作する権限がありません。
参考情報 Approle

developer.hashicorp.com

policies

developer.hashicorp.com

GUIでは一部設定が出来ないので右上のターミナルでCLIを使用します。
CLIはサクッと紹介します。

# roleに付与するpolicyのファイルの作成
cat <<EOF > aap-policy.hcl
path "kv/*" {
  capabilities = ["read"]
}
EOF

# policyの作成
vault policy write aap-policy aap-policy.hcl
# Approleの登録
vault auth enable approle
# 名前付きroleの作成
vault write auth/approle/role/aap policies=aap-policy
# RoleIDの取得(値はAAPで使うのでメモる)
vault read auth/approle/role/aap/role-id
# SecretIDの取得(値はAAPで使うのでメモる)
vault write -f auth/approle/role/aap/secret-id
# tokenの発行(値はAAPで使うのでメモる)
vault write auth/approle/login \
    role_id=<RoleID> \
    secret_id=<SecretID>

GUIでも画面交えて説明します。
Policisesをクリックし、Create ACL policyをクリックします。
名前とポリシーを記述します。

次にAccessに移動します。
Enable new methodをクリックして、Approleを選択します。
そのまま作成へ

右上のターミナルから以下実行

# 名前付きroleの作成
vault write auth/approle/role/aap policies=aap-policy
# RoleIDの取得(値はAAPで使うのでメモる)
vault read auth/approle/role/aap/role-id
# SecretIDの取得(値はAAPで使うのでメモる)
vault write -f auth/approle/role/aap/secret-id
# tokenの発行(値はAAPで使うのでメモる)
vault write auth/approle/login \
    role_id=<RoleID> \
    secret_id=<SecretID>

これにてVault側の設定は終わりです。
RoleIDとSecretIDとtokenはAAPで使用するのでメモしておきましょう

Ansible Automation Platformの設定

Ansible Automation Platformでは以下の設定を行います。

  1. Vaultの登録
  2. 認証情報で登録

Vaultの登録

たぶん画像を見た方が早いので認証情報から追加をクリックし、
以下の画像のように設定してください。
RoleIDとSecretIDとtokenはVaultで発行したものを使います。
テストで実際に利用できるかのチェックもできます。

認証情報で登録

認証情報の作成で鍵アイコンの場所をクリックすると
外部シークレット管理システムという画面が表示され
認証情報はVaultの登録で作成したものを選択します。

メタデータに使用したいパスとkey名を設定します。

実際に使ってみる

Playbookとホストの設定を入れて実行します。
ここに関しては省略します。
念のためdebugモジュールで、ansible_userを出力させました。 ジョブテンプレートを登録する時にマシンの認証情報を忘れずに

問題なく動きましたね。

これによりAnsible側で機密情報を持たせずに運用することが出来ます。
以上で終わりとなります。ここまで読んでいただきありがとうございました。

HashiCorp Vaultを構築してみる

はじめに

こんにちは たそ(@taso_int)です。
12月の寒い季節になりました。体調にはお気を付けください。

今回はHashiCorp Vaultを構築していきたいと思います。
正直内容的には薄いです…

HashiCorp Vaultとは

HashiCorp vaultとはHashiCorpがリリースしたソフトウェアで、
機密データを保護し、それを必要とするアプリケーションに提供することが出来ます。
クラウド運用モデルにおけるシークレットやデータを安全に保護し、
クラウドセキュリティ自動化の基盤を提供を行います。

主な機能としては以下です。

  • key、valueを管理する静的シークレット
  • クラウドSQLなどのアクセス情報を発行し、管理する動的シークレット
  • Encryption as a service(Eaas)によるデータ暗号化
  • PKI(公開鍵基盤)の提供

これらを信頼できる認証接続方式とポリシーによる認可を行うことで、
セキュアに管理することが可能です。

公式情報

vaultの公式

www.vaultproject.io

vaultのinstall

developer.hashicorp.com

vaultのドキュメント

developer.hashicorp.com

環境

AWS EC2
Amazon linux
インスタンスタイプ: t2.medium
ディスク:8GB

Vault
バージョン1.12.2

セキュリティグループはSSH、HTTP、HTTPS、8200、8201を開けることをおすすめします

インストール

今回はyumでインストールを行います。
またVaultはk8sでも構築可能らしいので機会があればやりたいと思います。

sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://rpm.releases.hashicorp.com/AmazonLinux/hashicorp.repo
sudo yum -y install vault

これにてインストール完了です。

devモードで起動する

Vaultには検証用として利用できるdevモードの起動法があります。
あくまでも検証用なので本番環境では利用を推奨していません。

vault server -dev
=> Vault server configuration:
             Api Address: http://127.0.0.1:8200
                     Cgo: disabled
         Cluster Address: https://127.0.0.1:8201
              Go Version: go1.19.3
              Listener 1: tcp (addr: "127.0.0.1:8200", cluster address: "127.0.0.1:8201", max_request_duration: "1m30s", max_request_size: "33554432", tls: "disabled")
               Log Level: info
                   Mlock: supported: true, enabled: false
           Recovery Mode: false
                 Storage: inmem
                 Version: Vault v1.12.2, built 2022-11-23T12:53:46Z
             Version Sha: 415e1fe3118eebd5df6cb60d13defdc01aa17b03

==> Vault server started! Log data will stream in below:

起動後ターミナルを取られるので、新しいターミナルを開いて、 export VAULT_ADDR='http://127.0.0.1:8200環境変数を設定します。

また起動したプロンプトにUnseal KeyトークンとRootトークンが発行されるのでメモします。
vault loginを実行し、Rootトークンを入力することでloginできます。

ちなみにdevモードでもGUIが利用できますが、クラウド環境だと接続できないと思います。
そのためconfigを作成してproductionモードで起動したいと思います。

productionモードで起動する

productionモードで起動するにはconfigの設定が必要になります。
configファイルを作成します。
vault用のディレクトリも作成することをお勧めします。
vault server -config=ファイル名で起動します。

設定例(storageはお好み 自分もあまりわかってない)

listener "tcp" {
 address = "0.0.0.0:8200"
 tls_disable = 1
}
storage "file" {
  path = "/home/ec2-user/vault/file"
}
disable_mlock = true
api_addr = "http://localhost:8200"
ui=true

問題なく起動できたら今度はhttp://EC2グローバルIP:8200でログインします。
初期状態だとしたのような画面になります。

この状態はseal状態と呼び、まだ機能が有効になっていません。
ここでUnseal用のトークンとrootトークンを発行します。
今回は便宜上どちらにも1を入力します。
CLIで同じことをする場合は、
vault operator init -key-shares=1 -key-threshold=1 を実行してください

エラーがないと下の画面になるので、それぞれのトークンをメモしてください

Continue Unsealをクリックし、先ほどのUnsealトークンを入れます。
成功するとseal状態からUnseal状態になり、statusが緑になり、
機能が有効になりました。

rootトークンでログインします。
問題なくログイン出来れば完了です。

ちなみにVaultを止めると再びseal状態になり、Unsealを再度行う必要があります。

2022-12-03T12:39:47.847Z [INFO]  core: vault is sealed

ちなみにVaultはGUICLIAPIに対応しております。
本当はKVシークレットエンジンの登録までやりたかったのですが、
思ったより長くなってしまったので次やります。
弊社のアドベントカレンダーでAAPとVaultの連携を書くので楽しみに…
他の方も素晴らしい記事を書いているのでぜひチェックしてください。

qiita.com

以上で終わりとなります。ここまで読んでいただきありがとうございました。

コンテナレジストリを使ったEEの登録

はじめに

こんにちは たそ(@taso_int)です。
1週間ぶりです。前よりモチベが上がってます。

前回はEE(execution environment)を作成し、
AWXユーザーにイメージを直接置くことで、AAP上に実行環境として登録することができました。
今回はコンテナレジストリーを使って、AAP上に実行環境として登録させたいと思います。

コンテナレジストリとは

本題ではないので、ざっくりと説明しますが、
コンテナイメージを保管するリポジトリのことです。
Dockerの学習でbuild,ship,runという内容があり、
ここのshipでイメージの共有としてよく使われるところのことを指してます。

コンテナレジストリサービスは色々あります。
今回はクラウドサービスを利用したいと思います。

やり方はそこまで差がないと思います。

環境

AAPおよびEEイメージは既にある状態で行います。
各構築方法はこちらへ

taso-int.hatenablog.com

taso-int.hatenablog.com

AAPのライセンスに関しては
Red HatさんのRed Hat Developer Programに参加し、
Developer Subscriptionを利用しています。

詳細はこちらへ

rheb.hatenablog.com

ECRを使ったやり方

EEをECRにpushするまで

今回はPrivate Registoryの方でイメージの登録をします。

リポジトリの作成を選択し、必要な設定をします。
たぶんリポジトリ名を決めるだけで問題ないと思います。

awscliをインストールおよび設定をします。
以降はrootユーザーで作業します

awscliのインストール(venvを作らずにpipするの怖い)
pip3 install awscli

awscliの設定
aws configure
AWS Access Key ID [None]: アクセスキー
AWS Secret Access Key [None]: シークレットキー
Default region name [None]: リージョン名
Default output format [None]: json

これで準備が出来たのでimageのpushを行います。

レジストリに対して認証を行う
aws ecr get-login-password --region リージョン名 | podman login --username AWS --password-stdin アカウントID.dkr.ecr.リージョン.amazonaws.com
Login Succeeded!

イメージのタグ付け
podman tag smartcs_ee:latest アカウントID.dkr.ecr.リージョン.amazonaws.com/smartcs_ee:latest

イメージのpush
podman push アカウントID.dkr.ecr.リージョン.amazonaws.com/smartcs_ee:latest

AAPで使用するパスワードの取得(メモる)
aws ecr get-login-password

上手くいくとイメージタグにlatestがついたものがリストに載ります。

これで完了です。

コンテナレジストリを利用するとAAP上で無理にEEイメージを作成する必要性が 無くなるが割といいかなと思いました。

AAPの設定

AAPで設定を行います。
イメージをpullするのに認証情報が必要になります。

認証情報の追加

名前: ECR(なんでも)  
認証情報タイプ: コンテナーレジストリー  
タイプの詳細  
認証URL: アカウントID.dkr.ecr.リージョン.amazonaws.com  
ユーザー名: AWS  
パスワードまたはトークン: aws ecr get-login-passwordの結果  

実行環境の追加

名前: なんでも  
イメージ: アカウントID.dkr.ecr.リージョン.amazonaws.com/smartcs_ee:latest(pushした時のタグ)
プル: 実行前に必ずコンテナーをプルするorイメージが存在しない場合のみプルする
レジストリーの認証情報: 上で設定した認証情報  

これで試しに実行してみましょう
問題なく実行できました。

認証情報とかを間違えるとunauthorized: authentication required みたいなエラーが出ます。

ACRを使ったやり方

EEをACRにpushするまで

コンテナーレジストリから作成をクリックします。

設定を入れます。
リソースグループはなければ作りましょう。

サーバー側にazure-cliはいりませんでした。

そのままimageのpushを行います。

レジストリに対して認証を行う
podman login レジストリ名.azurecr.io
Username: ACRの設定にあるアクセスキーのユーザー名
Password: ACRの設定にあるアクセスキーのパスワード
Login Succeeded!

イメージのタグ付け
podman tag smartcs_ee:latest レジストリ名.azurecr.io/smartcs_ee:latest

イメージのpush
podman push レジストリ名.azurecr.io/smartcs_ee:latest

imageのpushが出来ました。

AAPで設定を行います。
こちらも同様にイメージをpullするのに認証情報が必要になります。

認証情報の追加

名前: ACR(なんでも)  
認証情報タイプ: コンテナーレジストリー  
タイプの詳細  
認証URL: レジストリ名.azurecr.io  
ユーザー名: ACRの設定にあるアクセスキーのユーザー名  
パスワードまたはトークン: ACRの設定にあるアクセスキーのパスワード 

実行環境の追加

名前: なんでも  
イメージ: レジストリ名.azurecr.io/smartcs_ee:latest(pushしたタグ)
プル: 実行前に必ずコンテナーをプルするorイメージが存在しない場合のみプルする
レジストリーの認証情報: 上で設定した認証情報  

これで試しに実行してみましょう
問題なく実行できました。

最後にAWXユーザーに入ってちゃんとイメージを取得してるか
確認して終わりたいと思います。

[awx]$ podman images
REPOSITORY                                                            TAG         IMAGE ID      CREATED      SIZE
*******.azurecr.io/smartcs_ee                                         latest      cfd020121b4a  6 days ago   449 MB
***********************************.amazonaws.com/smartcs_ee          latest      cfd020121b4a  6 days ago   449 MB
registry.redhat.io/ansible-automation-platform-22/ee-supported-rhel8  latest      5b5c0fdeca9a  5 weeks ago  1.45 GB
registry.redhat.io/ansible-automation-platform-22/ee-minimal-rhel8    latest      c2450081e5d1  5 weeks ago  286 MB
registry.redhat.io/ansible-automation-platform-22/ee-29-rhel8         latest      c39fb0c046f4  5 weeks ago  799 MB

以上となります。
ここまで読んでいただきありがとうございました。
次の記事はAAPのローカルサーバーに 生成したファイルを保存する方法について書ければなと思います。

EEを作成し、AAPの実行環境として登録する

はじめに

こんにちは たそ(@taso_int)です。
久しぶりです。

今日はEE(execution environment)を作成し、AAP上で
実行環境として登録する方法について書きたいと思います。

EEとは

本題ではないので、ざっくりと説明しますが、
AAP2.0以降ではコンテナ内でAnsibleが実行されます。
そのコンテナの実行環境をEEと呼ばれます。

EEイメージ → EEが作成 → PlaybookがEEで動く

AAPインストール時にデフォルトで3つEEイメージが登録されていますが、
場合によっては自前でイメージを作成する必要があリます。

よくあるケースとしては、
独自でcollectionおよびpythonパッケージを用意したい場合です。

collectionに関してはrequirements.ymlで指定することで
Playbook実行時にインストールするなどの対処も可能ですが
collectionインストールに時間がかかり結果的に
Playbookの処理に時間がかかるなどのデメリットがあります。

環境

AAPは既にある状態で行いたいと思います。
構築方法はこちらへ

taso-int.hatenablog.com

AAPのライセンスに関しては
Red HatさんのRed Hat Developer Programに参加し、
Developer Subscriptionを利用しています。

詳細はこちらへ

rheb.hatenablog.com

公式情報

https://access.redhat.com/solutions/6654601

ansible-builderのインストール

EEイメージをビルドしてくれるansible-builderを用意します。

ansible-builderにはdnfとpipの2種類があり、
それぞれEEイメージのベース元が異なります。

dnfだとregistry.redhat.io、pipだとquay.ioとなります。

今回はdnfを使いたいと思います。

rootユーザーで操作

サブスクリプション登録
subscription-manager register
Registering to: subscription.rhsm.redhat.com:443/subscription
Username: (サブスクリプションユーザー名)
Password:(パスワード)

リポジトリ有効化
subscription-manager list --available 

Red Hat Ansible Automation Platformが入っているpool値をメモ

subscription-manager attach --pool=<メモしたpool値> 有効になればOK

クラウド環境の場合(リポジトリを引っ張れるように)
subscription-manager config --rhsm.manage_repos=1

ansible-builderのインストール
dnf install --repo=ansible-automation-platform-2.2-for-rhel-8-x86_64-rpms ansible-builder

バージョン確認
ansible-builder --version
1.1.0

これでansible-builderのインストールは終わりました。

EEイメージの作成

EEイメージを作成するには必要なファイルを用意する必要があります。

おまけで/etc/ansible/ansible.cfgを設定したいので、
Ansibleの設定であるansible.cfgを用意します。
イメージにファイルを埋め込みたい場合はcontextディレクトリを作成し、
そこにファイルをおきます。

ディレクトリ構造が分かりづらいので補足

.
└── /opt/
    └── /builder/
        └── /smartcs/ # イメージごとにディレクトリを分けた
            ├── ansible.cfg
            ├── requirements.txt
            ├── requirements.yml
            ├── bindep.txt
            ├── execution-environment.yml
            └── /context/
                └── ansible.cfg # /etc/ansible/ansible.cfg用のファイル

今回はciscoとjunosとsmartcsのcollectionを インストールしたいと思います。
必ずrootユーザーで行ってください(違うユーザーでやるとハマる)

各ファイル内容

execution-environment.yml

---
version: 1

ansible_config: 'ansible.cfg'

build_arg_defaults:
  EE_BASE_IMAGE: 'registry.redhat.io/ansible-automation-platform-22/ee-minimal-rhel8:latest'

dependencies:
  galaxy: requirements.yml
  python: requirements.txt
  system: bindep.txt

additional_build_steps:
  prepend:
    - COPY ansible.cfg /etc/ansible/ansible.cfg

requirements.yml

collections:
  - cisco.ios
  - junipernetworks.junos
  - seiko.smartcs

requirements.txt

paramiko
Jinja2

bindep.txtは空

ansible.cfg

[galaxy]
server_list = automation_hub

[galaxy_server.automation_hub]
url=https://console.redhat.com/api/automation-hub/
auth_url=https://sso.redhat.com/auth/realms/redhat-external/protocol/openid-connect/token
token=取得したtoken

/context/ansible.cfg

[defaults]
host_key_checking=False
duplicate_dict_key=error

[inventory]
host_pattern_mismatch=error
any_unparsed_is_failed=True

用意出来たら以下のコマンドで実行します。

podmanにてregistry.redhat.ioにログイン
podman login registry.redhat.io
Username: (サブスクリプションユーザー名)
Password:(パスワード)

イメージの作成
ansible-builder build -t smartcs_ee -v 3

イメージが出来ているか確認します。

podman images
REPOSITORY                                                               TAG         IMAGE ID      CREATED         SIZE
localhost/smartcs_ee                                                     latest      cfd020121b4a  44 seconds ago  449 MB
<none>                                                                   <none>      c4e9bac37c9e  19 hours ago    519 MB
<none>                                                                   <none>      b438ee1082ca  19 hours ago    323 MB
registry.redhat.io/ansible-automation-platform-22/ansible-builder-rhel8  latest      33140ad06359  10 days ago     313 MB
registry.redhat.io/ansible-automation-platform-21/ee-minimal-rhel8       latest      529e936c115c  2 weeks ago     299 MB

おまけで設定した/etc/ansible/ansible.cfgも確認します.

podman run -it --rm localhost/smartcs_ee bash
bash-4.4# cat /etc/a
adjtime         adjtime.rpmnew  aliases         alternatives/   ansible/        
bash-4.4# cat /etc/ansible/ansible.cfg 
[defaults]
host_key_checking=False
duplicate_dict_key=error

[inventory]
host_pattern_mismatch=error
any_unparsed_is_failed=True

EEイメージを置く

EEイメージは作成できましたが、
AWXユーザー内にEEイメージがないとAAPでは動きません。

AWXユーザーに読み込むためには、
イメージをどこかに保管して引っ張ってAWXユーザーに入れるか
事前にAWXユーザーの中に置いておく必要があります。

イメージを保管する場合は、コンテナレジストリーを使用する方法があります。

まずはEEイメージをAWXユーザーに置く方法を行います。

eeイメージをtarファイルとして保存
podman save -o /tmp/smartcs_ee.tar localhost/smartcs-ee:latest

tarファイルの所有の変更
chown awx:awx /tmp/smartcs_ee.tar 

AWXユーザーに切り替え
su - awx

tarファイルを解凍しイメージを作成
podman load -i /tmp/smartcs_ee.tar

イメージの確認
podman images
REPOSITORY                                                            TAG         IMAGE ID      CREATED         SIZE
localhost/smartcs_ee                                                  latest      cfd020121b4a  11 minutes ago  449 MB
registry.redhat.io/ansible-automation-platform-22/ee-supported-rhel8  latest      5b5c0fdeca9a  4 weeks ago     1.45 GB
registry.redhat.io/ansible-automation-platform-22/ee-minimal-rhel8    latest      c2450081e5d1  4 weeks ago     286 MB
registry.redhat.io/ansible-automation-platform-22/ee-29-rhel8         latest      c39fb0c046f4  4 weeks ago     799 MB

これで置けたのであとはAAPで設定をします。

管理から実行環境をクリックし、以下のように設定します。

これでEEの追加が終わりました。
実行環境を設定してDemo Job Templateを動かしてみましょう
問題ないですね。

実際にcollectionが入ってるかを確認してみます。

やり方はてくなべより
https://tekunabe.hatenablog.jp/entry/2022/03/30/234632

ちゃんとcollectionが入ってますね
以上となります。
コンテナレジストリーを使ったイメージの取得も
次回の記事で紹介出来たらなと思います。
ここまで読んでいただきありがとうございました。

自称最速 AAP2.2 on RHEL9.0 構築してみた

はじめに

こんにちは たそ(@taso_int)です。
超久しぶりです。
全然ブログ書けずに申し訳ないです。

今日は2022年5月26日にリリース?されたAAP2.2を
最新のRHEL9.0にインストールしたいと思います。

環境

VMware Workstation Playerは商用利用でなければ
無料で使用可能です。

またRHELやAAPのライセンスに関しては
Red HatさんのRed Hat Developer Programに参加し、
Developer Subscriptionを利用しています。

詳細はこちらへ

rheb.hatenablog.com

公式情報

www.ansible.com

www.redhat.com

インストール資材

RHEL9.0

URL
https://access.redhat.com/downloads/content/479/ver=/rhel---9/9.0/x86_64/product-software

色々あって迷うかもしれませんがとにかくサイズが大きいものを選べば問題ないです。(雑)

AAP2.2

URL https://access.redhat.com/downloads/content/480/ver=2.2/rhel---9/2.2/x86_64/product-software

RHEL9とRHEL8の2種類があります。今回はRHEL9
setupとSetup BundleがありますがSetup Bandleの方が無難です。

またRHEL9.0でAAP2.1をインストールしようとすると失敗します。

RHELのインストール

ここに関しては特に躓くところはないと思います。

最初 Terminalをどうやって出せばいいかわかりませんでした。

AAPのインストール

展開および移動

tar xvfz ansible-automation-platform-setup-bundle-2.2.0-6.tar.gz
cd ansible-automation-platform-setup-bundle-2.2.0-6

inventoryの追記

inventoryの中身が変わってます。
比較画像上げれずすみません。

記述箇所が増えました。
[automationcontroller]が新しく増えた追記部分です(正解かはわかりませんが)

[automationcontroller]
ホスト名 ansible_connection=local ←記述 ホスト名がlocalhostだとエラーになる

[automationcontroller:vars]
peers=execution_nodes


[all:vars]
required_ram=true メモリが少ない場合は追記
admin_password='' 記述

pg_host=''
pg_port=5432

pg_database='awx'
pg_username='awx'
pg_password='' 記述
pg_sslmode='prefer'  # set to 'verify-full' for client-side enforced SSL

# Execution Environment Configuration
# Credentials for container registry to pull execution environment images from,
# registry_username and registry_password are required for registry.redhat.io
registry_url='registry.redhat.io'
registry_username='' 記述
registry_password='' 記述

インストール

./setup.sh

AAPはスペック(特にメモリ)が低い場合インストールに失敗します。
回避としてinventoryにrequired_ram=trueを追記するが有効です。(運用する場合は非推奨)

無事インストール出来ました。

新機能もありますね

結局何が変わったの?

インストール方法の大幅な変更とかはないです。

大きなところとしては

  • ダウンロードパッケージのバージョンアップ
    • ansible-coreが2.12→2.13
    • ansible-navigatorが1.1.0→2.1.0
    • ansible-lintが5.0.8→6.0.2
  • inventoryの記述が増えた
  • ee-supported-rhel8にLibSSHがサポートされた(ネットワーク関連)
  • 新機能トポロジービュー
  • RHEL9はAAP2.2以上でないとインストール不可

ぐらいですかね。ここら辺は情報待ちかもしれません

最後に

久しぶりにブログでしたが書きたいことがあるので、関連して書きました。

AAPでEEを作成して実行環境に乗せる方法について書いていこうと思います。

ここまで読んでいただきありがとうございました。

よい自動化を