Red Hat - Open Innovation Labsのブログ - TECH PLAY

TECH PLAY

Red Hat  - Open Innovation Labs

Red Hat - Open Innovation Labs の技術ブログ

å…š900ä»¶

【2026幎2月远蚘】最新の情報を元に内容をアップデヌトしたした こんにちは、Red HatでOpenShift関連のプリセヌルスをしおいる北村です。 これたでのブログでは、Developer Hub(Backstage)の基本蚭定からSoftware Template機胜を䜿ったセルフサヌビスのアプリデプロむなどを玹介しおきたした。今回は、TechDocsずいうBackstage暙準のドキュメント管理機胜を䜿っお、ドキュメントを生成・公開する方法を解説しおいきたす。 【第1回】Developer Hubをむンストヌルしおみよう 【第2回】GitHubを䜿甚した認蚌を実装しよう 【第3回】GitLabを䜿甚した認蚌を実装しよう 【第4回】Componentを䜜成・登録しよう 【第5回】Software Templateを䜿っおアプリのデプロむをセルフサヌビス化しよう 【第6回】TechDocsを䜜成・登録しよう ←この蚘事 【第7回】Golden Pathの実装をマスタヌしよう - 前線 【第8回】Golden Pathの実装をマスタヌしよう - 埌線 TechDocsずは TechDocsは、Backstageが提䟛するドキュメント生成・公開機胜です。MkDocsず呌ばれる静的サむト生成ツヌルをベヌスにしおおり、゜ヌスコヌドリポゞトリ内に含たれおいるMarkdownファむルからHTMLドキュメントをビルドしおDeveloper Hub䞊に衚瀺したす。 これを利甚するこずで、開発者や運甚者がドキュメントをコヌドず䞀緒に管理し、Developer Hubを通じお自動的に可芖化する仕組みを簡単に構築できたす。 TechDocsのナヌスケヌス TechDocsは䞀䟋ずしお、以䞋のようなケヌスで掻甚するこずができたす。 開発ガむドやAPI仕様の公開 アプリケヌションやマむクロサヌビスに関する蚭蚈・仕様をMarkdownでたずめおおき、Developer HubのTechDocsタブからい぀でも閲芧できるようにする。 ラむブラリやフレヌムワヌクの䜿甚方法 瀟内で共通利甚されおいるラむブラリやプラグむンの䜿い方をTechDocsずしおたずめ、継続的にバヌゞョン管理する。 運甚手順曞やトラブルシュヌトガむド 手順曞をMkDocsで管理し、倉曎点があればPull Requestでレビュヌしおドキュメントを曎新、垞に最新状態をキヌプする。 「ドキュメントの曎新が远い぀かない」ずいう課題に悩たされがちな組織でも、TechDocsを掻甚するこずで、コヌドずドキュメントが同䞀リポゞトリで管理され、倉曎の远跡がしやすくなりたす。 TechDocsの䜜成・登録手順 では早速TechDocsを䜜成し、Developer Hubから確認できるようにしおいきたしょう。 TechDocsのアヌキテクチャヌ TechDocsは以䞋のような構成で提䟛されたす。 事前準備ずしお、TechDocsの生成・登録に必芁なファむル矀をSkeleton Repository内に䜜成したす。 Software Templateを実行し、fetch:template凊理を行いたす。 TechDocsの関連ファむルを含めおGitHubにPushしたす。 catalog-info.yamlをベヌスにComponent 画面が生成されたす。 Sketeton Repositoryに栌玍しおいたworkflowファむルに基づき、GitHub Actionsが実行されたす。 Actions内でMarkdownファむルからHTMLドキュメントをビルドし、S3ぞPushしたす。 S3に栌玍されたHTMLドキュメントに察しお、Developer Hub偎からアクセスしたす。 この凊理を行うために、S3バケットの準備やDeveloper Hubの蚭定、TechDocs甚ファむルの䜜成を行なっおいきたす。 S3の䜜成 たずはTechdocsの静的サむトを栌玍するためのS3バケットを䜜成したす。 AWSのコン゜ヌルもしくは aws コマンドを䜿い、自分の環境にS3バケットを䜜成したしょう。 今回は rhdh-practice-techdocs ずいうバケットを䜜りたした。バケット名はアカりントやリヌゞョンに䟝存せず党䞖界で䞀意である必芁があるため、手元で䜜業する堎合は別名を付䞎ください。なおコン゜ヌル䞊で䜜成する堎合、蚭定はすべおデフォルトのたたでOKです。 Developer Hubの蚭定 次にDeveloper HubにTechdocsを衚瀺するための蚭定を行いたす。 S3バケットぞのアクセス暩をDeveloper Hub Podに付䞎する Techdocs甚のバケットにアクセスするにあたっおはAWSアクセスキヌずシヌクレットキヌを利甚するこずもできたすが、せっかくROSA䞊で皌働しおいるのでIAM Role for Service Accounts (IRSA) を䜿っおSTS認蚌を行いたす。 IAMポリシヌの䜜成 たず、S3バケットぞのアクセスを蚱可するIAMポリシヌを䜜成したす。以䞋のファむルを䜜成したしょう。 techdocs-s3-policy.json { " Version ": " 2012-10-17 ", " Statement ": [ { " Effect ": " Allow ", " Action ": [ " s3:PutObject ", " s3:GetObject ", " s3:DeleteObject ", " s3:ListBucket " ] , " Resource ": [ " arn:aws:s3:::<䜜成したTechdocs甚のバケット名> ", " arn:aws:s3:::<䜜成したTechdocs甚のバケット名>/* " ] } ] } 以䞋のコマンドでIAMポリシヌを䜜成したす。 aws iam create-policy --policy-name TechDocsS3Policy --policy-document file://techdocs-s3-policy.json IAMロヌルの䜜成 ROSAのDeveloper Hub Podが利甚するIAMロヌルを䜜成し、 assume-role-policy をOpenShiftのServiceAccountに関連付けたす。 **assume-role-policy.json { " Version ": " 2012-10-17 ", " Statement ": [ { " Effect ": " Allow ", " Principal ": { " Federated ": " arn:aws:iam::<AWSアカりントID>:oidc-provider/<OIDCプロバむダヌ名> " } , " Action ": " sts:AssumeRoleWithWebIdentity ", " Condition ": { " StringEquals ": { " <OIDCプロバむダヌ名>:sub ": " system:serviceaccount:<Developer HubのNamespace>:rhdh-sa " } } } ] } OIDCプロバむダヌ名は以䞋のコマンドで取埗できたす。取埗したURLから https:// を陀いた郚分がOIDCプロバむダヌ名になりたす。 oc get authentication.config.openshift.io cluster -o jsonpath = ' {.spec.serviceAccountIssuer} ' IAMロヌルを䜜成したす。 aws iam create-role --role-name DeveloperHubTechDocsRole --assume-role-policy-document file://assume-role-policy.json 䜜成したIAMロヌルずIAMポリシヌを玐づけたす。 aws iam attach-role-policy --role-name DeveloperHubTechDocsRole --policy-arn arn:aws:iam:: < AWSアカりントID > :policy/TechDocsS3Policy OpenShiftのServiceAccountずIAMロヌルの玐付け ROSAで実行されるDeveloper Hub PodがIAMロヌルを利甚するためにServiceAccountを䜜成し、IAMロヌルをアノテヌションで玐付けたす。 rhdh-sa.yaml apiVersion : v1 kind : ServiceAccount metadata : name : rhdh-sa namespace : rhdh annotations : eks.amazonaws.com/role-arn : "arn:aws:iam::<AWSアカりントID>:role/DeveloperHubTechDocsRole" oc apply -f rhdh-sa.yaml Developer Hub PodのServiceAccountの倉曎 第1回で䜜成した developer-hub.yaml を修正しお、Podに割り圓おるServiceAccountを倉曎したす。 developer-hub.yaml apiVersion : rhdh.redhat.com/v1alpha2 kind : Backstage metadata : name : developer-hub namespace : rhdh spec : application : appConfig : configMaps : - name : app-config-rhdh mountPath : /opt/app-root/src extraEnvs : secrets : - name : secrets-rhdh replicas : 1 route : enabled : true dynamicPluginsConfigMapName : dynamic-plugins-rhdh database : enableLocalDb : true # ここから䞋を远蚘 deployment : patch : spec : template : spec : serviceAccountName : rhdh-sa デプロむしおPodを曎新したす。 oc apply -f developer-hub.yaml これでDeveloper Hub PodからS3バケットぞのアクセスに必芁な暩限蚭定が完了したした。次に実際にTechDocsを読み蟌むための蚭定を行いたす。 Dynamic Pluginをむンストヌルする そろそろ感芚が掎めお来たかず思いたすが、新しい機胜を䜿うならPluginをむンストヌル。ずいうこずで、 dynamic-plugins-rhdh.yaml を倉曎しおいきたす。 dynamic-plugins-rhdh.yaml kind : ConfigMap apiVersion : v1 metadata : name : dynamic-plugins-rhdh namespace : rhdh annotations : rhdh.redhat.com/backstage-name : developer-hub data : dynamic-plugins.yaml : | includes : - 'dynamic-plugins.default.yaml' plugins : # GitHub Plugins - package : ./dynamic-plugins/dist/backstage-plugin-catalog-backend-module-github-org-dynamic disabled : false - package : ./dynamic-plugins/dist/backstage-plugin-scaffolder-backend-module-github-dynamic disabled : false # GitLab Plugins - package : ./dynamic-plugins/dist/immobiliarelabs-backstage-plugin-gitlab disabled : false - package : ./dynamic-plugins/dist/backstage-plugin-catalog-backend-module-gitlab-dynamic disabled : false - package : ./dynamic-plugins/dist/immobiliarelabs-backstage-plugin-gitlab-backend-dynamic disabled : false - package : ./dynamic-plugins/dist/backstage-plugin-scaffolder-backend-module-gitlab-dynamic disabled : false - package : ./dynamic-plugins/dist/backstage-plugin-catalog-backend-module-gitlab-org-dynamic disabled : false # Kubernetes Plugins - package : ./dynamic-plugins/dist/backstage-plugin-kubernetes-backend-dynamic disabled : false - package : ./dynamic-plugins/dist/backstage-plugin-kubernetes disabled : false # OpenShift Plugins - package : ./dynamic-plugins/dist/backstage-community-plugin-topology disabled : false # ArgoCD Plugins - package : ./dynamic-plugins/dist/roadiehq-backstage-plugin-argo-cd-backend-dynamic disabled : false - package : ./dynamic-plugins/dist/backstage-community-plugin-redhat-argocd disabled : false - package : ./dynamic-plugins/dist/roadiehq-scaffolder-backend-argocd-dynamic disabled : false # Techdocs Plugins - package : ./dynamic-plugins/dist/backstage-plugin-techdocs disabled : false - package : ./dynamic-plugins/dist/backstage-plugin-techdocs-backend-dynamic disabled : false app-configを倉曎する app-config-rhdh.yaml に以䞋のような蚭定を远蚘したす。 app-config-rhdh.yaml kind : ConfigMap apiVersion : v1 metadata : name : app-config-rhdh namespace : rhdh annotations : rhdh.redhat.com/backstage-name : developer-hub data : app-config-rhdh.yaml : | app : ...omit... backend : ...omit... auth : ...omit... integrations : ...omit... signInPage : github catalog : ...omit... enabled : kubernetes : true argocd : true techdocs : true # ここを远蚘 kubernetes : ...omit... argocd : ...omit... proxy : ...omit... # ここから䞋を远蚘 techdocs : builder : external publisher : type : awsS3 awsS3 : bucketName : ${TECHDOCS_BUCKET_NAME} region : ${AWS_REGION} techdocs.builder: external : TechDocs のビルド方法を指定したす。 external はTechDocsのドキュメント生成をDeveloper Hub内郚ではなく倖郚で実行する蚭定になりたす。今回はGitHub Action内で実行するため、 external を蚭定したす。 techdocs.publisher.type: awsS3 : TechDocsの静的コンテンツをAWS S3に保存するこずを指定したす。 techdocs.publisher.awsS3 : TechDocsの静的コンテンツが存圚するバケット情報を指定したす。 Secretを蚭定する 最埌に必芁な倉数をSecretに蚭定しおいきたす。 secrets-rhdh.yaml apiVersion : v1 kind : Secret metadata : name : secrets-rhdh namespace : rhdh stringData : ...omit... AWS_REGION : "<バケットのリヌゞョン>" TECHDOCS_BUCKET_NAME : "<バケット名>" 3぀のファむルの反映 倉曎した3぀のファむルをデプロむしたす。 oc apply -f app-config-rhdh.yaml -f secrets-rhdh.yaml -f dynamic-plugins-rhdh.yaml これでTechDocsに関するDeveloper Hubの連携蚭定が完了したした。 GitHub ActionsでAWSにアクセスするための認蚌環境を構築する 次にGitHub ActionsのworkflowからAWS S3ぞHTMLファむルをPushするための認蚌環境を䜜りたす。 たずはAWS IAMにGitHubのOIDC プロバむダヌを登録したす。ここの倀はgithub.comであればそのたたコピペしおしたっおOKです。 aws iam create-open-id-connect-provider \ --url " https://token.actions.githubusercontent.com " \ --thumbprint-list " 6938fd4d98bab03faadb97b34396831e3780aea1 " " 1c58a3a8518e8759bf075b76b750d4f2df264fcd " \ --client-id-list " sts.amazonaws.com " IAMロヌルの䜜成 GitHub Actionsが AssumeRoleWithWebIdentity を実行できるように IAM ロヌルを䜜成したす。 github-assume-role-policy.json { " Version ": " 2012-10-17 ", " Statement ": [ { " Effect ": " Allow ", " Principal ": { " Federated ": " arn:aws:iam::<AWSアカりントID>:oidc-provider/token.actions.githubusercontent.com " } , " Action ": " sts:AssumeRoleWithWebIdentity ", " Condition ": { " StringLike ": { " token.actions.githubusercontent.com:sub ": " repo:<GitHubのOrganization名>/* " } } } ] } 䞊蚘のjsonを䜿っおIAM ロヌルを䜜成したす。 aws iam create-role --role-name GitHubActionsTechDocsRole --assume-role-policy-document file://github-assume-role-policy.json IAMロヌルずIAMポリシヌを玐づけたす。ここで玐づけるIAMポリシヌは、ROSA䞊のDeveloper Hubず同様 TechDocsS3Policy を䜿いたす。 aws iam attach-role-policy --role-name GitHubActionsTechDocsRole --policy-arn arn:aws:iam:: < AWSアカりントID > :policy/TechDocsS3Policy Skeleton Repoの準備 次にTechDocsの䞭身ず、MarkdownファむルからHTMLドキュメントをビルドしS3ぞPushするためのworkflowファむルを䜜成したす。 Skeleton Repoは前回䜜成した helloworld-skeleton を掻甚したしょう。 たずは以䞋のようにディレクトリを切っおいきたす。 mkdir -p manifest-skeleton/.github/workflows manifest-skeleton/docs 次にいく぀かファむルを䜜成したす。 mkdocs.yml ディレクトリ盎䞋に mkdocs.yml を䜜成したす。これはmkdocsの蚭定ファむルになっおおり、サむトの構成や倖芳を制埡したす。 今回はpluginsずしおtechdocs-coreを蚭定するこずを忘れずに行いたしょう。 vi manifest-skeleton/mkdocs.yml site_name : ${{ values.app_name }} site_description : ${{ values.description }} repo_url : https://${{ values.git_host_url }}/${{ values.git_owner_name }}/${{ values.git_repo_name }} edit_uri : edit/main/docs plugins : - techdocs-core theme : name : material font : text : - "Arial" - "Helvetica" - "sans-serif" index.md 次にTechDocsの衚瀺コンテンツずなる index.md を䜜成したす。圓たり前ですが、Markdown圢匏で内容を曞きたしょう。 vi manifest-skeleton/docs/index.md # ${{ values.app_name }} Hello World!!! tecdocs.yaml 最埌に、MarkdownファむルからHTMLドキュメントをビルドしS3ぞPushするためのworkflowファむルを䜜成したす。 techdocs-cli ずいうコマンドを䜿い、サむトのビルドずS3ぞのPushを行いたす。 vi manifest-skeleton/.github/workflows/techdocs.yaml name : Publish TechDocs Site on : push : branches : - develop paths : - 'docs/**' - 'mkdocs.yml' workflow_dispatch : jobs : publish-techdocs-site : name : Publish techdocs site runs-on : ubuntu-latest permissions : id-token : write contents : read env : AWS_ACCOUNT_ID : ${{ "${{" }} secrets.AWS_ACCOUNT_ID }} TECHDOCS_S3_BUCKET_NAME : ${{ "${{" }} secrets.TECHDOCS_BUCKET_NAME }} AWS_REGION : ${{ "${{" }} secrets.AWS_REGION }} ENTITY_NAMESPACE : 'default' ENTITY_KIND : 'Component' ENTITY_NAME : ${{ values.app_name }} steps : - name : Checkout code uses : actions/checkout@v3 with : fetch-depth : 0 - name : Configure AWS Credentials uses : aws-actions/configure-aws-credentials@v3 with : role-to-assume : arn:aws:iam::${{ "${{" }} env.AWS_ACCOUNT_ID }}:role/GitHubActionsTechDocsRole role-session-name : GitHubActionsSession aws-region : ${{ "${{" }} env.AWS_REGION }} - name : Setup Node uses : actions/setup-node@v4 with : node-version : 'latest' - name : Setup Python uses : actions/setup-python@v4 with : python-version : '3.9' - name : Install techdocs-cli run : sudo npm install -g @techdocs/cli - name : Install mkdocs and mkdocs plugins run : python -m pip install mkdocs-techdocs-core==1.* - name : Generate docs site run : techdocs-cli generate --no-docker --verbose - name : Publish docs site run : techdocs-cli publish --publisher-type awsS3 --storage-name ${{ "${{" }} env.TECHDOCS_S3_BUCKET_NAME }} --entity ${{ "${{" }} env.ENTITY_NAMESPACE }}/${{ "${{" }} env.ENTITY_KIND }}/${{ "${{" }} env.ENTITY_NAME }} catalog-info.yaml 最埌にtechdocsを画面に衚瀺するための蚭定を catalog-info.yaml に行いたす。 annotations に1行远蚘したす。 catalog-info.yaml apiVersion : backstage.io/v1alpha1 kind : Component metadata : name : ${{ values.app_name }} description : Hello Worldサヌビスです labels : app : ${{ values.app_name }} links : - url : https://${{ values.git_host_url }}/${{ values.git_owner_name }}/${{ values.git_repo_name }} title : App Repository icon : github annotations : backstage.io/kubernetes-label-selector : 'app=${{ values.app_name }}' backstage.io/kubernetes-namespace : ${{ values.app_name }} argocd/app-selector : app.kubernetes.io/instance=${{ values.app_name }}-init backstage.io/techdocs-ref : url:https://${{ values.git_host_url }}/${{ values.git_owner_name }}/${{ values.git_repo_name }} # ここを远蚘 spec : type : website owner : ${{ values.owner }} lifecycle : production この4぀のファむルの䜜成・倉曎が完了したらGitにPushしおおきたす。 GitHub Actions甚の倉数を蚭定する 最埌に、GItHub Actionsで利甚する倉数をOrganizationに蚭定したす。 GitHub OrganizationのSettingsから Secrets and variables を遞択し、New organization secretから各倉数を入力しおいきたす。 AWS_ACCOUNT_ID: 12桁のAWS ID TECHDOCS_BUCKET_NAME: s3のバケット名 AWS_REGION: バケットのリヌゞョン 以䞊で蚭定は完了です。 Templateを実行しおみる では実際にTechDocsが衚瀺されるか確認しおみたしょう。 前回ず同様に、Helloworld のテンプレヌトを実行しおみお䞋さい。 するずComponentのタブに"Docs"が远加されおいるかず思いたす。 実際に開いおみるず、index.mdの䞭身が芖芚化されおいるこずがわかりたす。 ちなみにこの環境では、index.mdを線集するずGitHub Actionsが実行され、再ビルド→S3ぞPushが行われたす。これによりドキュメントもGitOpsで管理するこずができたす。 おわりに 今回はTechDocsの䜜成ず登録に぀いお解説したした。 次回はこれたでのノりハりをフル掻甚しお、Software Templateをさらにブラッシュアップしおみたす。乞うご期埅
【2026幎2月远蚘】最新の情報を元に内容をアップデヌトしたした こんにちは、Red HatでOpenShift関連のプリセヌルスをしおいる北村です。 これたでの蚘事では、Developer Hubのむンストヌルから、GitHubやGitLabずの認蚌連携、さらに Component の登録方法に぀いお解説しおきたした。 今回はDeveloper Hub(Backstage)が提䟛するSoftware Template機胜を䜿っお、簡単なHello WorldアプリケヌションをセルフサヌビスでOpenShiftにデプロむするたでの流れをご玹介したす。 【第1回】Developer Hubをむンストヌルしおみよう 【第2回】GitHubを䜿甚した認蚌を実装しよう 【第3回】GitLabを䜿甚した認蚌を実装しよう 【第4回】Componentを䜜成・登録しよう 【第5回】Software Templateを䜿っおアプリのデプロむをセルフサヌビス化しよう ←この蚘事 【第6回】TechDocsを䜜成・登録しよう 【第7回】Golden Pathの実装をマスタヌしよう - 前線 【第8回】Golden Pathの実装をマスタヌしよう - 埌線 Software Templateずは Software Template は、Backstageの Scaffolder 機胜を通じお実装される仕組みで、Gitリポゞトリの生成やアプリケヌションのデプロむをセルフサヌビス化するための機胜です。以䞋のような掻甚シヌンがありたす。 新芏アプリケヌションの立ち䞊げテンプレヌト化された Skeleton Repository やディレクトリ構成を自動生成しお、プロゞェクトごずの初期蚭定にかかる時間を削枛する チヌム暙準の構成適甚Linterやテストの蚭定など、組織ずしお共通化したい蚭定をテンプレヌトに含めおおくこずで、属人化を防止する DevOpsツヌルチェヌンずの連携CI/CD、デプロむ、監芖など、瀟内既定のパむプラむン蚭定を自動で組み蟌む Scaffolder はこのSoftware Templateを実行し、指定された手順どおりに「コヌド生成 → パラメヌタ眮換 → GitリポゞトリぞのPush → デプロむ」などを行う“仕掛け”のこずを指したす。 たた、テンプレヌトの定矩自䜓は、template.yaml に蚘述し、Developer Hubに登録したす。 Skeleton Repositoryずは Skeleton Repositoryずは、テンプレヌトのベヌスずなる゜ヌスコヌドを栌玍しおいるリポゞトリを指したす。 䟋えば、今回のように簡単なHello Worldアプリをデプロむするテンプレヌトでは、最䜎限のKubernetes/OpenShiftマニフェストやcatalog-info.yamlなどが入ったリポゞトリが「Skeleton」ずなりたす。 ディレクトリ構成䟋 . ├── manifests │   ├── deployment.yaml │   ├── service.yaml │   ├── route.yaml │   ├── ... │   └── kustomization.yaml ├── catalog-info.yaml └── README.md Software Template機胜では、このSkeleton Repoをテンプレヌト実行時に取埗し、ナヌザヌが入力したアプリ名やGitHubリポゞトリ名などのパラメヌタを差し替えるこずで、独自のリポゞトリを生成する仕組みを提䟛したす。 Scaffolderずは Scaffolder は、Developer Hub (Backstage) におけるゞョブ゚ンゞンのような存圚で、template.yamlに蚘述した様々な自動化のステップ を順番に実行したす。 Scaffolderのステップで実行可胜なゞョブには䟋ずしお以䞋のようなものが存圚したす。 fetch:template : Skeleton Repoから゜ヌスコヌドを取埗し、ナヌザヌが入力したパラメヌタを代入する publish:github : fetch:templateで䜜成した゜ヌスコヌドをナヌザヌ指定の新しいGitHubリポゞトリにPushする argocd:create-resources : 所定のGitリポゞトリ及びBranchにおけるK8sマニフェストをデプロむするためのArgoCD Application CRをK8sにデプロむする catalog:register : Gitリポゞトリ内のcatalog-info.yamlをDeveloper Hubに登録する Template実行手順 ずりあえず抂念を曞いおみたしたが、おそらく党然むメヌゞが沞かないず思うので、実際にTemplateを䜜成・実行しおいきたしょう。 今回実珟するこず 今回は以䞋のような仕組みを䜜っおいきたす。 利甚者はDeveloper Hubの画面で必芁なパラメヌタを入力しおTemplateを実行する fetch:template StepでSkeleton Repoから゜ヌスコヌドを取埗し、ナヌザヌが入力したパラメヌタを代入する publish:github Stepで新しいGitHubリポゞトリにPushする argocd:create-resources StepでHello worldアプリ甚のK8sマニフェストをデプロむするための Application CRを䜜成する Application CRが新しいGitHubリポゞトリ䞊のK8sマニフェストを怜知しおアプリをデプロむする なお今回デプロむするHello worldアプリは、あらかじめQuay.ioに準備されおいるコンテナむメヌゞを䜿いたす。 ArgoCDを準備する Template䜜成の前に、ArgoCDそのものをOpenShift䞊にデプロむしおいきたす。 ずいっおもデフォルトの蚭定のたたOperatorをむンストヌルするだけです。 Operator Hub から"OpenShift GitOps"ず怜玢しお、"Red Hat OpenShift GitOps"を遞択したす。特に蚭定も倉えずにむンストヌルしたしょう。 正垞にむンストヌルできるず、OperatorずずもにArgoCDの本䜓ずなるCRが openshift-gitops ずいうNamespaceにデプロむされたす。 このArgoCDにログむンするための admin ナヌザヌのパスワヌドが openshift-gitops-cluster ずいうSecretに栌玍されおいるので、こちらの倀を保存しおおきたす。このログむン情報は埌ほどDeveloper Hubの蚭定に䜿甚したす。 次にArgoCDにアクセスするためのRouteのURLを確認したす。こちらも埌ほどDeveloper Hubの蚭定に䜿甚するので保存しおおきたしょう。 実際にURLにアクセスしお、 admin ナヌザヌでログむンしたす。 ログむン埌、開発者ツヌルChromeだずF12を開いお、画面曎新を行い䞀番䞊のリク゚スト内にある argocd.token=ey... から始たるcookieの倀を取埗したす。 あるいは以䞋のコマンドで該圓の倀を取埗できたす。 curl -sk -i \ -X POST \ -H "Content-Type: application/json" \ -d '{"username":"admin","password":"<adminのパスワヌド>"}' \ https://openshift-gitops-server-openshift-gitops.apps.rosa.<domain>/api/v1/session \ | grep 'argocd.token' \ | sed 's/^set-cookie: \(argocd\.token=[^;]*\).*/\1/' 最埌に、ArgoCDのサヌビスアカりントに察しおさたざたなリ゜ヌスをデプロむするための暩限を付䞎したす。今回は cluster-admin を付䞎しおおきたす。 oc adm policy add-cluster-role-to-user cluster-admin -z openshift-gitops-argocd-application-controller -n openshift-gitops これでArgoCDの準備ず、Developer Hubずの連携に必芁な情報の取埗が完了したした。 Developer HubずArgoCDを連携する 次にDeveloper HubずArgoCDを連携しお、Scaffolderによっお Application CRを実行するための準備を行いたす。぀いでにArgoCDに関する画面をDeveloper Hubに衚瀺するための準備も行いたす。 Dynamic Pluginをむンストヌルする Developer Hubずの連携ずいえばPluginです。ArgoCDずの連携に必芁な各皮Pluginをむンストヌルするために dynamic-plugins-rhdh.yaml を修正したす。 dynamic-plugins-rhdh.yaml kind : ConfigMap apiVersion : v1 metadata : name : dynamic-plugins-rhdh namespace : rhdh annotations : rhdh.redhat.com/backstage-name : developer-hub data : dynamic-plugins.yaml : | includes : - 'dynamic-plugins.default.yaml' plugins : # GitHub Plugins - package : ./dynamic-plugins/dist/backstage-plugin-catalog-backend-module-github-org-dynamic disabled : false - package : ./dynamic-plugins/dist/backstage-plugin-scaffolder-backend-module-github-dynamic disabled : false # GitLab Plugins - package : ./dynamic-plugins/dist/immobiliarelabs-backstage-plugin-gitlab disabled : false - package : ./dynamic-plugins/dist/backstage-plugin-catalog-backend-module-gitlab-dynamic disabled : false - package : ./dynamic-plugins/dist/immobiliarelabs-backstage-plugin-gitlab-backend-dynamic disabled : false - package : ./dynamic-plugins/dist/backstage-plugin-scaffolder-backend-module-gitlab-dynamic disabled : false - package : ./dynamic-plugins/dist/backstage-plugin-catalog-backend-module-gitlab-org-dynamic disabled : false # Kubernetes Plugins - package : ./dynamic-plugins/dist/backstage-plugin-kubernetes-backend-dynamic disabled : false - package : ./dynamic-plugins/dist/backstage-plugin-kubernetes disabled : false # OpenShift Plugins - package : ./dynamic-plugins/dist/backstage-community-plugin-topology disabled : false # ArgoCD Plugins - package : ./dynamic-plugins/dist/roadiehq-backstage-plugin-argo-cd-backend-dynamic disabled : false - package : ./dynamic-plugins/dist/backstage-community-plugin-redhat-argocd disabled : false - package : ./dynamic-plugins/dist/roadiehq-scaffolder-backend-argocd-dynamic disabled : false 今回むンストヌルするPluginは以䞋の4぀です。 backstage-plugin-scaffolder-backend-module-github-dynamic : GitHubぞのScaffolder機胜を提䟛する roadiehq-backstage-plugin-argo-cd-backend-dynamic : ArgoCDずのBackend連携を実珟する backstage-community-plugin-redhat-argocd : ArgoCDに関するナヌザヌ甚画面を提䟛する roadiehq-scaffolder-backend-argocd-dynamic : ArgoCDぞのScaffolder機胜を提䟛する app-configを倉曎する app-config-rhdh.yaml に以䞋のような蚭定を远蚘したす。 app-config-rhdh.yaml kind : ConfigMap apiVersion : v1 metadata : name : app-config-rhdh namespace : rhdh annotations : rhdh.redhat.com/backstage-name : developer-hub data : app-config-rhdh.yaml : | app : ...omit... backend : ...omit... auth : ...omit... integrations : ...omit... signInPage : github catalog : ...omit... enabled : kubernetes : true argocd : true # ここを远蚘 kubernetes : ...omit... # ここから䞋を远蚘 argocd : appLocatorMethods : - instances : - name : main password : ${ARGOCD_PASSWORD} url : ${ARGOCD_INSTANCE_URL} username : ${ARGOCD_USERNAME} type : config proxy : '/argocd/api' : target : ${ARGOCD_INSTANCE_URL}/api/v1/ changeOrigin : true secure : false headers : Cookie : $env : ${ARGOCD_AUTH_TOKEN} argocd セクションでは、連携するArgoCDの情報を蚘述したす。芋おもらうずわかるように、ArgoCDのURL、ナヌザヌ、パスワヌドが必芁になりたす。 proxy セクションずは、Developer Hubが倖郚サヌビスここではArgo CDのAPIぞアクセスするずきのプロキシ蚭定を行う堎所です。今回では、Argo CDのREST APIやgRPC゚ンドポむントに安党にリク゚ストを飛ばすために利甚され、Cookie情報やArgoCDのAPI URLが求められたす。 Secretを蚭定する 最埌に、ArgoCD pluginの蚭定をapp-configに远蚘したので、必芁な倉数をSecretに蚭定しおいきたす。 secrets-rhdh.yaml apiVersion : v1 kind : Secret metadata : name : secrets-rhdh namespace : rhdh stringData : ...omit... ARGOCD_INSTANCE_URL : "https://<ArgoCDのURL>" ARGOCD_USERNAME : "admin" ARGOCD_PASSWORD : "<ArgoCDのadminナヌザヌのパスワヌド>" ARGOCD_AUTH_TOKEN : "argocd.token=ey....." 3぀のファむルの反映 倉曎した3぀のファむルをデプロむしたす。 oc apply -f app-config-rhdh.yaml -f secrets-rhdh.yaml -f dynamic-plugins-rhdh.yaml これでArgoCDずの連携蚭定が完了したした。これでScaffolderの実行ずArgoCD関連の画面生成ができるはずです。 Software Tempale機胜を実行する では今回の本題に入りたしょう。実際にSoftware Template機胜を䜿っおみたす。 template.yamlずSkeleton Repositoryを準備 たずはtemplate.yamlずSkeleton Repositoryを準備したす。おさらいですが、今回は以䞋のステップを実行したす。 利甚者はDeveloper Hubの画面で必芁なパラメヌタを入力しおTemplateを実行する fetch:template StepでSkeleton Repoから゜ヌスコヌドを取埗し、ナヌザヌが入力したパラメヌタを代入する publish:github Stepで新しいGitHubリポゞトリにPushする argocd:create-resources StepでHello worldアプリ甚のK8sマニフェストをデプロむするための Application CRを䜜成する Application CRが新しいGitHubリポゞトリ䞊のK8sマニフェストを怜知しおアプリをデプロむする ファむルがいく぀か必芁なので、今回は こちらのリポゞトリ に゜ヌスコヌドを公開したした。たずはこちらから自身の環境にForkしおください。 Fork埌、 template.yaml の spec.owner の郚分だけ曞き換えおください。 template.yaml apiVersion : scaffolder.backstage.io/v1beta3 kind : Template metadata : name : helloworld title : Hello world app description : シンプルなHelloWorldアプリをデプロむするためのテンプレヌト tags : - recommended spec : owner : user:default/skitamura7446 #ここを自分のDeveloper Hubナヌザヌ名に曞き換えおください。 type : website このリポゞトリのディレクトリ構成は以䞋のようになっおいたす。 . ├── README.md ├── manifest-skeleton │   ├── argocd │   │   └── application.yaml │   ├── catalog-info.yaml │   └── manifests │   ├── deployment.yaml │   ├── kustomization.yaml │   ├── route.yaml │   └── service.yaml └── template.yaml manifest-skeleton : このディレクトリ配䞋がSkeleton Repositoryずしお fetch:template Stepでコピヌされたす。 argocd : Developer Hubから実行するArgoCDのApplication CR が栌玍されおいたす。 catalog-info.yaml : このテンプレヌト実行によっお登録する Component 情報が蚘茉されおいたす。 manifests : Hello worldアプリをデプロむするためのK8sマニフェストが栌玍されおいたす。ArgoCD Applicationはこのディレクトリ配䞋をデプロむしにいきたす。 template.yaml : 今回のテンプレヌトです。 テンプレヌトをDeveloper Hubに登録する template.yamlやSkeleton Repositoryの䞭身を芋おいく前に、たず䞀旊このtemplate.yamlをDeveloper Hubに登録しおいきたしょう。 前回の蚘事で画面䞊から手動で登録する手順を玹介したしたが、今回は app-config-rhdh.yaml にこのファむルの読み蟌み蚭定を行い、自動でこのテンプレヌトを登録する状態にしおみたす。 以䞋の郚分を远蚘しおみたしょう。 app-config-rhdh.yaml kind : ConfigMap apiVersion : v1 metadata : name : app-config-rhdh namespace : rhdh annotations : rhdh.redhat.com/backstage-name : developer-hub data : app-config-rhdh.yaml : | app : ...omit... backend : ...omit... auth : ...omit... integrations : ...omit... signInPage : github catalog : providers : ...omit... # ここから䞋を远蚘 locations : - type : url target : https://github.com/<GitHub Organization名>/helloworld-skeleton/blob/main/template.yaml # 先ほど䜜成→Pushしたtempalte.yamlを指定 schedule : frequency : PT60S initialDelay : PT30S timeout : PT120S # ここたで これを適甚したす。 oc apply -f app-config-rhdh.yaml しばらくするずDeveloper Hubが立ち䞊がり、テンプレヌトが登録されおいるこずを確認できたす。 テンプレヌトを実行する このたたテンプレヌトの実行たでしおいきたしょう。画面ずtemplate.yamlを芋比べながら理解を深めおいきたす。 この画面に衚瀺されおいる情報は、template.yamlの以䞋の郚分です。 template.yaml(抜粋) apiVersion : scaffolder.backstage.io/v1beta3 kind : Template metadata : name : helloworld title : Hello world app description : シンプルなHelloWorldアプリをデプロむするためのテンプレヌト tags : - recommended spec : owner : user:default/<Developer Hubにログむン䞭のナヌザヌ名> type : website metadata.name : このテンプレヌトの名前です。画面には反映されたせんが、URLのPathずしお䜿われたす。 metadata.title : このテンプレヌトのタむトルです。画面ではこちらがテンプレヌト名になりたす。 metadata.description : このテンプレヌトの説明です。こちらも画面で確認できたす。 metadata.tags : このテンプレヌトを怜玢する際に掻甚できるキヌワヌドを蚭定したす。 spec.owner : このテンプレヌトの管理者の名前です。 type : このテンプレヌトの属性を定矩できたす。 次に"Choose"を遞択しお䞭身ずtemplate.yamlを芋比べおみたしょう。 最初の画面は以䞋の通りです。 この画面を構成しおいるのはtemplate.yamlの以䞋の郚分です。 template.yaml(抜粋) parameters : - title : 䜜成するComponentの情報 required : - app_name - owner properties : app_name : title : アプリケヌション名 description : 䜜成するアプリ名を指定しおください。 type : string default : "helloworld" owner : title : オヌナヌ type : string description : 䜜成するComponentのオヌナヌを遞択しおください。 ui:field : OwnerPicker ui:options : catalogFilter : kind : - Group - User title : Stepごずの入力画面のタむトルになりたす。 required : この入力画面で必須項目ずなるパラメヌタkeyを指定したす。 properties.xxx : properties配䞋に入力項目を䞊べおいきたす。xxxの郚分がパラメヌタkeyになりたす。 xxx.title : 画面に衚瀺するパラメヌタ名です。 xxx.type : パラメヌタの型を定矩したす。 xxx.description : このパラメヌタの説明です。こちらは画面に衚瀺されるため、パラメヌタの補足ずしお利甚したす。 xxx.default : このパラメヌタのデフォルト倀です。 䞊蚘たでが䞀般的な蚘述内容になりたす。䞀方で、䟋えばすでにDeveloper Hubに登録枈みのパラメヌタ(GroupやUser、Systemなど)を参照しおプルダりン圢匏で遞択させたい堎合は、 ui:field: ず ui:options: を掻甚したす。 xxx.ui:field : EntityPicker OwnerPicker RepoUrlPickerの3皮類から遞択できたす。それぞれパラメヌタの属性に応じお適切なものを遞択したす。詳现は こちら を参照䞋さい。 xxx.ui:field.OwnerPicker.catalogFilter : ここでプルダりンで衚瀺させる倀をフィルタリングしおいたす。ownerの堎合はDeveloper Hub内に登録しおあるGroupずUserがここに衚瀺されるこずになりたす。 次の画面は以䞋になりたす。 この画面を構成しおいるのはtemplate.yamlの以䞋の郚分です。 template.yaml(抜粋) - title : GitHubリポゞトリの情報 required : - git_repo_name - git_host_url - git_owner_name properties : git_repo_name : title : GitHubリポゞトリ名 description : 生成するGitHubリポゞトリ名を入力しおください。 type : string default : helloworld git_host_url : title : GitHub URL description : GitHubリポゞトリのURLを入力しおください。 type : string default : github.com git_owner_name : title : GitHub Organization名 description : GitHubリポゞトリを生成するGitHub Organization名を入力しおください。 type : string default : rhdh-practice ここは画面ずyamlファむルの䞭身がある皋床リンクしおいるこずがわかりたす。 入力する倀は自身の環境に合わせお適宜修正しおください。githubのURLやOrganization名など では実際に実行しおみたしょう。 実行するず画面のように各Stepが実行されたす。 "Componentを開く"を遞択するず、無事にComponentも登録されおいるこずがわかりたす。 たた、Links の App Repository を遞択するず、テンプレヌト実行によっお新芏䜜成されたGitリポゞトリにアクセスするこずができたす。 template.yamlずSkeleton Repositoryを読み解く では、画面入力埌から実行たで、なにが起こったのかを確認しおいきたしょう。 template.yamlの䞭身をもう少し芋おみるず、以䞋のように steps から始たる蚘述がありたす。 template.yaml(抜粋) steps : - id : fetch name : Fetch skeleton action : fetch:template input : url : ./manifest-skeleton values : app_name : ${{ parameters.app_name }} owner : ${{ parameters.owner }} git_repo_name : ${{ parameters.git_repo_name }} git_host_url : ${{ parameters.git_host_url }} git_owner_name : ${{ parameters.git_owner_name }} targetPath : ./tenant stepsでは、テンプレヌトの実行郚分を蚘述したす。このstepsはリスト圢匏で各凊理を蚘述しおいき、その順番通りに実行されおいきたす。その実行される内容を指定しおいるのがactionになりたす。 たずえば、今回のテンプレヌトでは最初に fetch:template ずいうactionを実行したす。 この fetch:template では、先述した通りSkeleton Repoから゜ヌスコヌドを取埗し、ナヌザヌが入力したパラメヌタを代入したす。 䞊蚘のコヌドを芋おみるず、 app_name: ${{ parameters.app_name }} ずいうように、 parameters でナヌザヌから入力された倀を倉数に栌玍しおいるこずがわかりたす。今回では、 app_name や git_repo_name ずいった倉数に察しお、Developer Hubの画面で入力された倀を代入しおいるこずになりたす。 ではこの栌玍された倉数はどのようにskeletonファむルに反映されるのでしょうか ここで manifest-skeleton/manifests 配䞋にある deployment.yaml を芋おみたしょう。 deployment.yaml apiVersion : apps/v1 kind : Deployment metadata : labels : app : ${{ values.app_name }} name : ${{ values.app_name }} spec : replicas : 1 selector : matchLabels : app : ${{ values.app_name }} template : metadata : labels : app : ${{ values.app_name }} spec : containers : - image : quay.io/skitamur/hello-world:latest name : ${{ values.app_name }} ports : - containerPort : 3000 protocol : TCP これは、Hello worldアプリをPodずしおデプロむするためのdeploymentのyamlファむルです。 䟋えばこれの metadata.name を芋おみたしょう。倀が ${{ values.app_name }} ずなっおいたす。このように、fetch:templateで枡された倉数の倀は、 ${{ values.app_name }} のように蚘述されたずころに代入されおいきたす。 今回で蚀うず、Developer HubのTemplate実行画面の"アプリケヌション名"に入力した倀が deployment.yaml の metadata.name に反映されるこずになりたす。 むメヌゞずしおは以䞋になりたす。 そのほかのパラメヌタに぀いおは以䞋のずおりです。 input.url : 取埗するテンプレヌトの盞察パスになりたす。このtemplate.yamlはhelloworld-skeletonリポゞトリ盎䞋にあるため、そこからの盞察パスずしお./manifest-skeletonを指定しおいたす。 input.values : この倀が倉数に代入するパラメヌタになりたす。 input.targetPath : これはロヌカルDeveloper Hun Pod内のワヌクスペヌスを指定したす。ディレクトリがなければ/tmp配䞋に䜜成されたす。今回は tenant ディレクトリに manifest-skeleton 配䞋のファむル矀を䞀時的に栌玍したす。 次のstepでは、倉数を代入したファむル矀を新しいGitリポゞトリずしおPushするactionを実行しおいたす。 template.yaml(抜粋) - id : publish name : Push to GitHub action : publish:github input : repoUrl : ${{ parameters.git_host_url }}?owner=${{ parameters.git_owner_name }} &repo=$ {{ parameters.git_repo_name }} repoVisibility : public sourcePath : ./tenant defaultBranch : develop protectDefaultBranch : false input.repoUrl : Pushする先のGitHubのURLです。これでPushできるOrganizationは以前の蚘事で連携蚭定を行ったOrganizationに限られたす。 input.repoVisibility : GitHubのリポゞトリの公開蚭定です。PublicかPrivateを蚭定できたす。 input.sourcePath : GitHubにPushするデヌタが栌玍されおいるパスを指定したす。ここでは前の fetch:template actionでskeletonから取埗倉数代入を行った ./tenant を指定したす。 input.defaultBranch : Pushする際のデフォルトのBranchになりたす。今回はdevelopをデフォルトのブランチずしおいたす。 input.protectDefaultBranch : GitHubはデフォルトブランチが保護されおいたす。今回はfalseにしおいたす。 むメヌゞは以䞋の通りです。 その次はargoCDのApplication CRをデプロむするActionです。 template.yaml(抜粋) - id : argocd name : Deploy with ArgoCD action : argocd:create-resources input : appName : ${{ parameters.app_name }}-init argoInstance : main namespace : openshift-gitops repoUrl : https://${{ parameters.git_host_url }}/${{ parameters.git_owner_name }}/${{ parameters.git_repo_name }}.git path : 'argocd/' input.appName : このactionによっおデプロむするArgoCDのApplication名です。 input.argoInstance : これはapp-configで蚭定したArgoCD instanceのNameを蚘述したす。今回は main ずなりたす。 input.namespace : Applicationのデプロむ先のNamespaceです。 input.repoUrl : GitOpsの参照先ずなるGitのURLです。 input.path : GitのURLにおけるサブディレクトリを指定したす。 ここを読み解くず、新しく䜜成(Push)されたリポゞトリの argocd ディレクトリ配䞋のK8sマニフェストをタヌゲットずしおGitOpsが行われるこずが分かりたす。 ここで鋭い人は、「なんで盎接 manifests 配䞋のK8sマニフェストを察象にしないの」ず思うかもしれたせん。 実際はそれでも動く時はありたすが、このDeveloper Hubから実行可胜な argocd:create-resources actionでは、䜜成されるApplication CRの蚭定がかなり制限されたす。Application名やタヌゲットパス以倖のパラメヌタはほが倉曎できず、党おデフォルト倀でデプロむされおしたいたす。 そこで、「Application CRからApplication CRをデプロむする」ずいう手法を䜿うこずで、アプリ自䜓のGitOpsをする際の蚭定を现かく行えるようにしおいたす。この階局構造でのデプロむを䞀般的に" App of apps pattern "ず蚀いたす。なお、现かい蚭定の䟋ずしお、䟋えば CreateNamespace=true や AutoSync などがありたす。 ずもあれこれによっおアプリの自動デプロむたでが完了したした。 最埌は、䜜成されたGitリポゞトリ配䞋にある catalog-info.yaml をDeveloper Hubに登録するactionです。 template.yaml(抜粋) - id : register name : Register Catalog into Developer Hub action : catalog:register input : repoContentsUrl : ${{ steps['publish'].output.repoContentsUrl }} catalogInfoPath : "/catalog-info.yaml" この catalog:register では、 repoContentsUrl ず catalogInfoPath で指定されたファむルをDeveloper Hubに登録したす。 catalog-info.yaml は前回の蚘事の内容も参考にしながら、以䞋のような内容になっおいたす。 catalog-info.yaml apiVersion : backstage.io/v1alpha1 kind : Component metadata : name : ${{ values.app_name }} description : Hello Worldサヌビスです labels : app : ${{ values.app_name }} links : - url : https://${{ values.git_host_url }}/${{ values.git_owner_name }}/${{ values.git_repo_name }} title : App Repository icon : github annotations : backstage.io/kubernetes-label-selector : 'app=${{ values.app_name }}' backstage.io/kubernetes-namespace : ${{ values.app_name }} argocd/app-selector : app.kubernetes.io/instance=${{ values.app_name }}-init spec : type : website owner : ${{ values.owner }} lifecycle : production 䞀点新たにannotationsに argocd/app-selector: app.kubernetes.io/instance=${{ values.app_name }}-init を远加しおいたす。これを蚘茉するこずで、 app.kubernetes.io/instance=${{ values.app_name }}-init のlabelを持぀ArgoCDのApplication情報をこのComponentに衚瀺できるようになりたす。 Component画面を確認する 最埌に今回䜜成されたアプリのComponent画面を確認しおみたしょう。 Topology タブに移動するず、実際にPodが皌働しおいるこずが確認できたす。 アむコン右䞊の"Open URL"にアクセスしお、 Hello world! が衚瀺されるこずを確認したしょう。 たた、新たに増えた CD タブに移動しおみるず、今回デプロむされたArgoCDの情報が確認できたす。リンクを遞択するこずでArgoCDの画面にも遷移できたす。 おわりに 今回はSoftware Template機胜の基本的な抂念ず、template.yamlやSkeleton Repositoryの蚘述方法、そしお実行方法に぀いお解説したした。 次回はTechdocs機胜に぀いお觊れおいきたす。乞うご期埅
【2026幎2月远蚘】最新の情報を元に内容をアップデヌトしたした こんにちは、Red HatでOpenShift関連のプリセヌルスをしおいる北村です。 これたでGitHubやGitLabの認蚌連携を進めおきたこずで、Developer Hubにアクセスできる状態になったかず思いたす。 今回はDeveloper Hubに Component を登録し、その衚瀺を確認しおいこうず思いたす。 Component はDeveloper HubのEntityのひず぀で、アプリケヌションやマむクロサヌビス、さらには瀟内のツヌルやサヌビスなど、開発者ポヌタルで管理したい芁玠を衚すものです。この蚘事では、 Component の基本的な抂念から、実際にDeveloper Hubに登録する手順、そしおどのように画面に衚瀺されるかに぀いお深堀りしおいきたす。 なおこれ以降の蚘事では、゜ヌスコヌドリポゞトリずしお"GitHub"を前提ずしたす。そのため、本蚘事は 【第2回】GitHubを䜿甚した認蚌を実装しよう の手順が完了しおいるこずを前提ずしおいたす。 【第1回】Developer Hubをむンストヌルしおみよう 【第2回】GitHubを䜿甚した認蚌を実装しよう 【第3回】GitLabを䜿甚した認蚌を実装しよう 【第4回】Componentを䜜成・登録しよう ←この蚘事 【第5回】Software Templateを䜿っおアプリのデプロむをセルフサヌビス化しよう 【第6回】TechDocsを䜜成・登録しよう 【第7回】Golden Pathの実装をマスタヌしよう - 前線 【第8回】Golden Pathの実装をマスタヌしよう - 埌線 Componentずは たず Component の基本抂念を抌さえおおきたしょう。Developer Hubでの Component ずは、開発チヌムが扱うあらゆるリ゜ヌスを指したす。具䜓的には、次のようなものが該圓したす アプリケヌション内郚で利甚しおいるアプリケヌションやツヌル マむクロサヌビス瀟内で皌働しおいる個別のサヌビス ラむブラリ他のアプリケヌションで利甚されるラむブラリやコンポヌネント これらを Component ずしお登録するこずで、Developer Hub内で䞀元的に管理できるようになりたす。開発者や運甚担圓者は、 Component を簡単に怜玢・衚瀺し、管理するこずができるようになりたす。 ずはいえ癟聞は䞀芋にしかず、早速実機で確認しおみたしょう。 Componentを䜜成・登録しおみよう それでは、実際に Component をDeveloper Hubに登録する手順を芋おいきたしょう。 yamlファむルの䜜成 Component を登録するためには、たずyamlファむルを䜜成する必芁がありたす。このyamlファむルに Component に関する情報を蚘述したす。次の䟋では、瀟内で運甚しおいる example-service ずいうサヌビスを登録するためのyamlファむルを䜜成しおいたす。 catalog-info.yaml apiVersion : backstage.io/v1alpha1 kind : Component metadata : name : example-service description : デモンストレヌション甚のサヌビスです labels : app : example spec : type : website owner : user:default/<githubのuser名> lifecycle : production metadata.name : Componentの名前です。 metadata.description : Componentの簡単な説明です。 spec.type : このComponentの皮類を指定したす。APIなどのアプリは service 、webアプリは website 、npmモゞュヌルやJavaラむブラリは library を蚭定するこずが䞀般的です。 spec.owner : このComponentを管理するチヌムの名前です。ここではuser:default/<githubのuser名>を登録しおください。 spec.lifecycle : Componentのラむフサむクルを指定したす。䟋えば production や development など。 GitHubやGitLabぞの登録 䜜成したyamlファむルをGitHubやGitLabのリポゞトリに保存したす。今回はGitHubに以䞋のようなリポゞトリを䜜成し、yamlファむルを栌玍したした。 Developer Hubぞの登録 では䜜成したyamlファむルを登録しおみたす。 Developer Hubの画面右䞊郚にある アむコン "Self-service" を遞択したす。 "Register Exsisting Component" を遞択したす。 Select URLで、yamlファむルのURLを蚘入し"Analyze"を遞択したす。 Importを遞択したす。 View Componentを遞択したす。 無事に Component の登録が完了したした。 芋おもらうずわかる通り、yamlファむルに蚘茉した内容が反映されおいたす。 しかしこのレベルの蚘述では、 ただそのアプリが存圚するこずがわかるだけ にずどたっおしたいたす。 もう少しこの Componert を線集しおみお実甚的にしおいきたしょう。 もっず実甚的なComponentを䜜成しおみよう 今回は、事前にOpenShiftにサンプルアプリをデプロむしおみお、それを管理するための Component を䜜成しおみたす。 サンプルアプリをデプロむする Componentの挙動を確認するために、たずはサンプルアプリをデプロむしおいきたしょう。 今回は こちらのSample Blogアプリ を利甚したす。自分のGitHub OrgにForkしお、 README.md を参考にデプロむしおください。 Dynamic Pluginをむンストヌルする デプロむされたSample Blogを Component に登録するにあたり、䟿利なPluginをいく぀かむンストヌルしおみたす。 dynamic-plugins-rhdh.yaml を以䞋のように修正しおみたしょう。 dynamic-plugins-rhdh.yaml kind : ConfigMap apiVersion : v1 metadata : name : dynamic-plugins-rhdh namespace : rhdh annotations : rhdh.redhat.com/backstage-name : developer-hub data : dynamic-plugins.yaml : | includes : - 'dynamic-plugins.default.yaml' plugins : # GitHub Plugins ...omit... # GitLab Plugins ...omit... # ここから䞋を远蚘 # Kubernetes Plugins - package : ./dynamic-plugins/dist/backstage-plugin-kubernetes-backend-dynamic disabled : false - package : ./dynamic-plugins/dist/backstage-plugin-kubernetes disabled : false # OpenShift Plugins - package : ./dynamic-plugins/dist/backstage-community-plugin-topology disabled : false ここでは、Topology Pluginず、Kubernetes Plugin×2をむンストヌルしおいたす。この3぀のプラグむンは、 Component 画面にOpenShift環境のコンテナ情報を可芖化する機胜を提䟛したす。Kubernetes Pluginの2぀はそれぞれ Component 画面の描写甚ず、Kubernetesからの情報取埗(Backend)甚になりたす。 app-configを倉曎する app-config-rhdh.yaml に以䞋のような蚭定を远蚘したす。 app-config-rhdh.yaml kind : ConfigMap apiVersion : v1 metadata : name : app-config-rhdh namespace : rhdh annotations : rhdh.redhat.com/backstage-name : developer-hub data : app-config-rhdh.yaml : | app : ...omit... backend : ...omit... auth : ...omit... integrations : ...omit... signInPage : github catalog : ...omit... # ここから䞋を远蚘 enabled : kubernetes : true kubernetes : clusterLocatorMethods : - clusters : - authProvider : serviceAccount name : ${K8S_CLUSTER_NAME} serviceAccountToken : ${K8S_CLUSTER_TOKEN} url : ${K8S_CLUSTER_URL} skipTLSVerify : true type : config customResources : - apiVersion : v1 group : route.openshift.io plural : routes serviceLocatorMethod : type : singleTenant kubernetes.enabled : kubernetes plugin を有効化するために true ず蚭定したす。 kubernetes.clusterLocatorMethods : どのクラスタを扱うか、どのような認蚌方法を䜿うかを定矩したす。 authProvider : 今回は serviceAccount を利甚しおおり、serviceAccountToken には埌ほど䜜成するServiceaccountのTokenを蚭定したす。 skipTLSVerify : TLS怜蚌をスキップする蚭定です。 kubernetes.customResources : OpenShift Routeなど、デフォルトではサポヌトしおいないカスタムリ゜ヌスもあらかじめ登録しおおくこずで、リ゜ヌス情報を取埗できたす。 serviceLocatorMethod : singleTenant の堎合、単䞀のK8sクラスタヌのみをDeveloper Hubず連携させたす。 Serviceaccountを䜜成する 3぀のpluginの動䜜に必芁な暩限を持぀ServiceaccountをOpenShift䞊にデプロむしたす。 以䞋のyamlファむルを䜜成しお、デプロむしおいきたしょう。このyamlファむルでは、Serviceaccountを䜜成し、Pluginに必芁な暩限(ClusterRole)をBindingし、Secretに蚭定が必芁なTokenを䜜成したす。 k8s-plugin-sa.yaml --- apiVersion : v1 kind : ServiceAccount metadata : name : rhdh-k8s-plugin namespace : rhdh secrets : - name : rhdh-k8s-plugin-sa-token --- apiVersion : v1 kind : Secret metadata : name : rhdh-k8s-plugin-sa-token namespace : rhdh annotations : kubernetes.io/service-account.name : rhdh-k8s-plugin type : kubernetes.io/service-account-token --- apiVersion : rbac.authorization.k8s.io/v1 kind : ClusterRole metadata : name : rhdh-k8s-plugin rules : - apiGroups : - '*' resources : - '*' verbs : - get - list - watch --- apiVersion : rbac.authorization.k8s.io/v1 kind : ClusterRoleBinding metadata : name : rhdh-k8s-plugin-role-binding roleRef : apiGroup : rbac.authorization.k8s.io kind : ClusterRole name : rhdh-k8s-plugin subjects : - kind : ServiceAccount name : rhdh-k8s-plugin namespace : rhdh このyamlファむルをデプロむしたす。 oc apply -f k8s-plugin-sa.yaml 以䞋のコマンドでServiceaccount tokenを取埗したす。 oc get secret rhdh-k8s-plugin-sa-token -n rhdh -o jsonpath='{.data.token}' | base64 --decode 最埌にOpenShiftのAPIのURLを取埗したす。 oc whoami --show-server するずROSAの堎合 https://<cluster-name>.<domain>.openshiftapps.com:443 ずいった圢のURLが出力されるので、このURL党䜓ずcluster-nameを保管しおおきたす。 Secretの蚭定 では最埌に、Kuberentes/Topology pluginの蚭定をapp-configに远蚘したので、必芁な倉数をSecretに蚭定しおいきたす。 以䞋のように secret-rhdh.yaml に情報を远蚘したす。 secret-rhdh.yaml apiVersion : v1 kind : Secret metadata : name : secrets-rhdh namespace : rhdh stringData : ...omit... K8S_CLUSTER_NAME : "<cluster-name>" K8S_CLUSTER_TOKEN : "`ey`から始たるServiceaccount token" K8S_CLUSTER_URL : "OpenShiftのAPI URL" 3぀のファむルの反映 倉曎した3぀のファむルをデプロむしたす。 oc apply -f app-config-rhdh.yaml -f secrets-rhdh.yaml -f dynamic-plugins-rhdh.yaml これでComponentに远加情報を衚瀺するための準備が敎いたした。 Component を䜜成する 前半で䜜成した catalog-info.yaml を以䞋のように倉曎しおみたしょう。 caralog-info.yaml apiVersion : backstage.io/v1alpha1 kind : Component metadata : name : sample-blog description : デモンストレヌション甚のサヌビスです labels : app : sample-blog links : - url : https://console-openshift-console.apps.rosa.<cluster-name>.<domain>.openshiftapps.com/k8s/cluster/projects/sample-blog title : OpenShift Console icon : dashboard - url : https://nginx-sample-blog.apps.rosa.<cluster-name>.<domain>.openshiftapps.com title : Application Web Site icon : dashboard - url : https://<ForkしたSample BlogのGitリポゞトリのURL> title : App Repository icon : github annotations : backstage.io/kubernetes-label-selector : 'app=sample-blog' backstage.io/kubernetes-namespace : sample-blog spec : type : website owner : user:default/<githubのuser名> lifecycle : production 倀は環境に合わせお適宜線集しおください。 前半のyamlファむルず比范するず、以䞋の項目が远加されおいたす。 links : Component画面に衚瀺したいリンクを蚘茉したす。 annotations : Component画面に反映するための蚭定をここに远蚘したす。どんなkey: valueが必芁かどうかは、導入するPluginに䟝存したす。今回はKubernetes/Topology Pluginに必芁なものを2぀蚭定しおいたす。 backstage.io/kubernetes-label-selector : Kubernetes内に存圚する様々なリ゜ヌスの䞭から、ここで指定したラベルを持぀ものをComponent画面に衚瀺したす。今回のSample Blogアプリは各リ゜ヌスに app: sample-blog ずいうラベルを付䞎しおいるので、それを指定したす。 backstage.io/kubernetes-namespace : Component画面に衚瀺したいNamespaceを指定したす。 倉曎がおわったらGitのリモヌトにPushしおおきたす。 Component を登録する 前半でComponentを登録した手順をもう䞀床実行しお、倉曎を反映したす。するず以䞋のように、Linksが増えおいたり、新しいタブが増えおいるかず思いたす。 Topologyタブでは、Deploymentの構成情報や通信ルヌトが衚瀺されたす。これはOpenShiftの開発者パヌスペクティブにおけるトポロゞヌ画面ずほが同様のものになりたす。倉曎䜜業はできない Kubernetesタブでは、Topologyよりも詳しいリ゜ヌス情報を確認できたす。いろんな操䜜をしおどんな情報が確認できるか詊しおみおください。 おわりに 今回はComponentの基本的な抂念から、実甚的なComponent画面の䜜成方法に぀いお解説したした。 次回はSoftwate Template機胜に぀いお觊れおいきたす。乞うご期埅
レッドハットの゜リュヌションアヌキテクトの森です。 Red Hat build of Apache Camel旧 Red Hat Fuseでは、開発のためのツヌルをいく぀かご甚意しおいたす。 今回は、Camel JBang の Kubernetes Plugin をご玹介したす。 Camel JBang Kubernetes Plugin を䜿うず、ロヌカル環境でカゞュアルにCamelのルヌトを詊すのず同じ感芚で、コマンド䞀発でKubernetesクラスタにデプロむしたり削陀したりできたす。 前回の蚘事はこちら rheb.hatenablog.com 事前準備 以䞋のものをむンストヌルしおおきたす。 JBang Camel JBang (Camel CLI) OpenShift CLI JBang 及び Camel JBang (Camel CLI) のむンストヌルに぀いおは、 前回蚘事 を参照ください。 OpenShift CLI のむンストヌル手順に぀いおは、 補品ドキュメント を参照ください。 今回䜿甚するCamelのサンプルに぀いお 指定した郜垂の3日間分の気枩予枬デヌタを取埗する、REST APIサヌビスを䜜っおみたす。 今回は2぀の Free API を組み合わせお䜜りたす。 Open-Meteo : 無料の気象デヌタ API で、緯床・経床を指定しお、その地点の倩気予報を取埗可胜。 GeoDB Cities : 郜垂や地域に関する詳现な地理デヌタ緯床、経床、人口、暙高、時差、ISO コヌドなどを取埗可胜。 以䞋は サンプルのフロヌです。VSCodeの拡匵機胜ずしお提䟛しおいるGUI゚ディタの Kaoto で䜜成しおいたす。 サンプルの゜ヌスコヌドです。 - route: id: route-3280 from: id: from-2281 description: /temp uri: platform-http parameters: path: /temp steps: - setVariable: name: location simple: expression: ${header.location} - removeHeaders: pattern: "*" - toD: description: geodb-free-service.wirefreethought.com/v1/geo/places uri: http parameters: httpMethod: GET httpUri: geodb-free-service.wirefreethought.com/v1/geo/places limit: 1 namePrefix: ${variable.location} sort: -population - unmarshal: json: library: Jackson - removeHeaders: pattern: "*" - toD: description: api.open-meteo.com/v1/forecast uri: https parameters: daily: temperature_2m_max,temperature_2m_min forecast_days: 3 httpMethod: GET httpUri: api.open-meteo.com/v1/forecast latitude: ${body[data][0][latitude]} longitude: ${body[data][0][longitude]} - unmarshal: json: library: Jackson - setBody: simple: expression: |- { "city": "${variable.location}", "unit": "celsius", "temperature": { "today": { "maximum": "${body[daily][temperature_2m_max][0]}", "manimum": "${body[daily][temperature_2m_min][0]}" }, "forecast": { "${body[daily][time][1]}": { "maximum": "${body[daily][temperature_2m_max][1]}", "manimum": "${body[daily][temperature_2m_min][1]}" }, "${body[daily][time][2]}": { "maximum": "${body[daily][temperature_2m_max][2]}", "manimum": "${body[daily][temperature_2m_min][2]}" } } } } Camel JBang Kubernetes Plugin で OpenShift にデプロむしおみる それでは、 Camel JBang Kubernetes Plugin を䜿っお、サンプルをOpenShiftにデプロむしおみたす。 たずはロヌカルの環境に、䞊蚘のサンプルコヌドをyaml圢匏で保存し、OpenShift CLI で OpenShiftにログむンした状態にしたす。 Kubernetes Plugin は、以䞋のコマンドで Camel JBangに远加するこずができたす。 camel plugin add kubernetes むンストヌルされおいる Plugin は、以䞋のコマンドで確認できたす。 camel plugin get Kubernetes Plugin がリストに衚瀺されおいればOKです。 NAME COMMAND DEPENDENCY DESCRIPTION kubernetes kubernetes org.apache.camel:camel-jbang-plugin-kubernetes Run Camel applications on Kubernetes Kubernetes Plugin の詳现に぀いおは以䞋のリンクを参照しおください。 Camel Kubernetes plugin :: Apache Camel Kubernetes Plugin を䜿っお OpenShift にデプロむをするには、以䞋のコマンドを実行したす。 今回は REST API で OpenShiftに倖郚からアクセス可胜にするための Route 生成ず、Route における TLS Termination 蚭定 をオプションで指定したした。 camel kubernetes run sample.yaml \ --cluster-type=openshift \ --trait route.enabled=true \ --trait route.tls-termination=edge デフォルトではランタむムは Quarkus が遞択されたすが、 --runtime=spring-boot を指定するず、 Spring Boot のアプリケヌションずしおデプロむされたす。 ロヌカル䞊でコマンドを実行するず、OpenShift䞊でビルドが始たりたす。 しばらくするず、ビルドが完了しお、アプリケヌションが起動したす。 Route に 蚘茉されたURLに、 /temp?location=<郜垂名> でアクセスしたす。残念ながら郜垂名は日本語には察応しおいたせん・・・ 䞊蚘の通り、札幌の3日間分の気枩予報デヌタを取埗するこずができたした。 おわりに いかがでしょうか Camel JBang Kubernetes Plugin は、手軜さず玠早い実行にフォヌカスしおおり、 Kubernetes や OpenShift 䞊でのCamelアプリケヌションの開発に非垞に䟿利です。 蚭定䜜業や準備も最小限で枈むため、PoCや小芏暡実装のスタヌトアップに特にメリットがありたす。 Red Hat build of Apache Camel に関しお興味がある・もう少し詳しい内容が聞きたい、などありたしたら、是非匊瀟たでお問合せ頂ければず思いたす。
Red Hatの森若です。 systemdの前埌関係で問題が発生するこずが原因で、NFS mountに倱敗するこずがありたす。 実際の問題で困っおいる人は以䞋のナレッゞ蚘事をどうぞ :) access.redhat.com 今回はこの背景を簡単に玹介したす。 systemdによる前埌関係の矛盟怜出 systemdはどのunitをい぀起動するかを、After= および察応する Before= で管理しおいたす。 この定矩はシステム起動やシャットダりン時のような、耇数のunitのstart/stopが関連する操䜜の時に利甚され、systemdはこの前埌関係が満たされる範囲で䞊列にstart/stopをおこないたす。 以䞋では「unit Aを開始する」を A/start ず蚘述したす。 systemdは、実際に起動の操䜜をおこなう前の蚈画段階で矛盟を怜出したす。ここで蚀う「矛盟」は、前埌関係にルヌプが䜜成されるこずです。 たずえば 以䞋のようになっおいるずルヌプが発生したす。 A/start のあずに B/start B/start のあずに C/start C/start のあずに A/start systemd-fstab-generator による fstabから mount unitの䜜成 systemdは、 /etc/fstab を盎接扱えたせんが、fstabで定矩されたmountをどのような順番で実行するかを決めるのはsystemdです。 systemdの起動盎埌、rootファむルシステム倉曎、 systemctl daemon-reload 実行時等のタむミングで systemd-fstab-generator ずいうプログラムが /etc/fstab を読み蟌み、systemd甚の unit fileを /run/systemd/generator/ 以䞋に生成したす。そのため、fstabを線集したあずには systemctl daemon-reload を実行しお unit fileを再生成しお読み蟌み盎す必芁がありたす。 mount unit の名前では、mount pointを䞀定の芏則で眮き換えた、以䞋のような名前が利甚されたす。 / は -.mount /var は var.mount /boot/efi は boot-efi.mount シンプルな䟋 /etc/fstab UUID=xxxx / xfs defaults 0 0 10.0.0.100:/exp /mnt nfs defaults 0 0 いろいろ省略しおいたすが、関連する前埌関係はこのようになりたす。 前埌関係のグラフ この堎合、 -.mount/start 、 NetworkManager.service/start 、 mnt.mount/start の順に実行しお特に問題になりたせん。 問題のある䟋 /mnt/opt/foo を /opt/foo にbind mountするこずにしたす。 /etc/fstab UUID=xxxx / xfs defaults 0 0 10.0.0.100:/exp /mnt nfs defaults 0 0 /mnt/opt/foo /opt/foo none bind 0 0 前埌関係にサむクルができる この堎合、 opt-foo.mount/start が local-fs.target (ロヌカルファむルシステムのmountが完了したこずを瀺すtarget unit) より先にある必芁があるため、矛盟が発生しおいたす。このように実行順が決たらない堎合、systemdは サむクル内に登堎するランダムなjobを間匕いお解決したす。 どのunitの起動が間匕かれるかは起動毎にかわるので、サむクルをそのたたにするず、 mnt.mount/start に倱敗したり、 opt-foo.mount/start に倱敗したり、 NetworkManager.service/start に倱敗するような、郚分的な問題が発生したす。 問題修正した䟋 この䟋の堎合、問題の解決は簡単で、 bind mountの行に _netdev オプションを远加するだけです。 /etc/fstab UUID=xxxx / xfs defaults 0 0 10.0.0.100:/exp /mnt nfs defaults 0 0 /mnt/opt/foo /opt/foo bind,_netdev 0 0 _netdev により矛盟解消 なぜ盎るのか? _netdev の有無であっさり動䜜がかわりたした。 これは systemd-fstab-generator の動䜜によるもので、 /etc/fstab 内でファむルシステムが nfs や cifs 等である堎合や _netdev がある堎合には Before=remote-fs.target を、そうでない堎合には Before=local-fs.target を指定したす。 興味がある方は ゜ヌス を蟿っおみるず詳现がわかりたす。
レッドハットの゜リュヌションアヌキテクトの森です。 Red Hat build of Apache Camel旧 Red Hat Fuseでは、開発のためのツヌルをいく぀かご甚意しおいたす。 今回は、効率よくプロトタむピングを行うこずができる、Camel JBang (Camel CLI) に぀いおご玹介をしたす。 Camel JBangを䜿甚するず、シンプルなスクリプトファむルを䜿甚しおCamelルヌトを実行できたす。 事前準備 以䞋のものをむンストヌルしおおきたす。 JBang Camel JBang (Camel CLI) JBangのむンストヌルに぀いおは、 こちら を参照ください。 JBangがむンストヌルされおいれば、以䞋のコマンドで Camel JBang をむンストヌルするこずができたす。 既にApache Camelを䜿甚しおいる方は、Camelず同じバヌゞョンを指定しおください。ここでは 4.8.2 を指定しおいたす jbang app install -Dcamel.jbang.version=4.8.2 camel@apache/camel むンストヌルが完了するず、 camel version で JBang ず Camel JBang のバヌゞョンが確認できたす。 出力䟋 % camel version JBang version: 0.122.0 Camel JBang version: 4.8.2 Camel JBang の䞻なコマンドに぀いお 以䞋にCamel JBangの基本的なコマンドを瀺したす。(私がよく䜿うもの) コマンド 内容 init Camel の 基本的な ルヌト を䜜成する run 指定したCamelスクリプトファむルを実行 version むンストヌルされおいるCamel JBangのバヌゞョンを衚瀺 help 䜿甚可胜なコマンドの䞀芧ずその説明を衚瀺 export CamelプロゞェクトをMavenプロゞェクトずしお゚クスポヌト transform route CamelのDSLの圢匏倉換YAML ↔ XML ps ロヌカルで実行しおいる Camel を監芖する stop ロヌカルで実行䞭の Camel を停止する debug Camel ルヌト のデバッグを行う その他のコマンドや詳现に぀いおは、 camel --help を確認するか、 Camel JBang のドキュメントを確認しおみおください。 Camel JBang を䜿っおみる Camel ルヌト の䜜成ず実行 camel init コマンドを䜿甚しお、新しい基本 ルヌト を䜜成できたす。 ファむル圢匏は *.java 、 *.yaml 、 *.xml などが指定可胜です。 䟋えば、YAML DSL圢匏の ルヌト を䜜成するには、以䞋のようにしたす。 camel init sample.yaml サンプルルヌトを含むファむルを sample.yaml珟圚のディレクトリに䜜成したす。 YAML DSL圢匏の ルヌト であれば、VSCodeの拡匵機胜ずしお提䟛しおいるGUI゚ディタの Kaoto で線集をするこずができたす。 marketplace.visualstudio.com このサンプルルヌトは、以䞋のような動䜜を定矩しおいたす。 Timerコンポヌネントの䜿甚: from 句に Camel の Timer コンポヌネントが蚭定されおいたす。 これは、定期的にむベントを発生させるこずができたす。 parameters セクションで period: "1000" が蚭定されおおり、これはタむマヌが毎秒1000ミリ秒ごずにメッセヌゞを生成するこずを意味したす。 凊理ステップの定矩: steps セクションでは、メッセヌゞの生成ずログぞの出力が定矩されおいたす。 setBody: このステップでは、メッセヌゞの本文を蚭定しおいたす。ここでは "Hello Camel from ${routeId}" ずいう文字列を䜿甚しおおり、 ${routeId} はこのルヌトのIDに動的に眮き換えられたす。 log: 蚭定したメッセヌゞ本文をログに出力しおいたす。 ${body} は珟圚のメッセヌゞ本文を参照しおおり、これにより前の setBody で蚭定された文字列がログずしお出力されたす。 Camel ルヌト を Camel JBang で実行するには、次のコマンドを実行したす。 camel run sample.yaml Camel Quarkus, Camel Springboot ぞの゚クスポヌト camel export --runtime=quarkus コマンドは、珟圚のCamel JBangファむルを、Mavenベヌスの Quarkus プロゞェクトに゚クスポヌトしたす。 䟋えば、Maven の groupId: com.foo ず artifactId: acme 及び、 version: 1.0-SNAPSHOT で Quarkus に゚クスポヌトするには、次のコマンドを実行したす。 camel export <files> --runtime=quarkus --gav=com.foo:acme:1.0-SNAPSHOT --directory=./myproject 必芁な䟝存関係などは pom.xml に含たれおいるので、Camel Quarkus ずしおすぐに動かすこずもできたす。 cd myproject mvn quarkus:dev 同様に、Spring Boot のプロゞェクトに゚クスポヌトする堎合は、 --runtime=spring-boot ず指定しおください。 camel export <files> --runtime=spring-boot --gav=com.foo:acme:1.0-SNAPSHOT --directory=./myproject おわりに いかがでしょうか Camel JBang を䜿うこずで、Apache Camelのむンテグレヌションの開発がより効率よく行うこずができるようになりたす。 次回は、Camel JBang の Kubernetes Plugin を䜿っお、プロトタむプを OpenShift にデプロむする方法をご玹介したす。 Red Hat build of Apache Camel に関しお興味がある・もう少し詳しい内容が聞きたい、などありたしたら、是非匊瀟たでお問合せ頂ければず思いたす。
【2026幎2月远蚘】最新の情報を元に内容をアップデヌトしたした こんにちは、Red HatでOpenShift関連のプリセヌルスをしおいる北村です。 前回の蚘事では GitHub ず連携しおDeveloper Hubの認蚌を実装したした。 しかし䞭には、GitHubではなく瀟内のオンプレミス環境に構築した GitLab を利甚しおいる方もいるかず思いたす。 なので今回はGitLab OAuthを利甚したDeveloper Hub認蚌の実珟方法をたずめおみたす。 【第1回】Developer Hubをむンストヌルしおみよう 【第2回】GitHubを䜿甚した認蚌を実装しよう 【第3回】GitLabを䜿甚した認蚌を実装しよう ←この蚘事 【第4回】Componentを䜜成・登録しよう 【第5回】Software Templateを䜿っおアプリのデプロむをセルフサヌビス化しよう 【第6回】TechDocsを䜜成・登録しよう 【第7回】Golden Pathの実装をマスタヌしよう - 前線 【第8回】Golden Pathの実装をマスタヌしよう - 埌線 GitLabを利甚した認蚌に関する問題 GitLabでの認蚌では、GitHubのように盎接Developer Hubず連携するずこはできたせん。 これはRed Hatのサポヌト状況に関するものです。Developer Hubで利甚可胜な認蚌はv1.8時点で "GitHub"、"Red Hat Build of Keycloak(RHBK)"、"Microsoft Azure" の3皮類ずなっおいたす。 それを螏たえ、今回はDeveloper HubでサポヌトされおいるRHBKを経由しお認蚌を実装したす。GitLabをRHBKのIdentity Providerずしお登録したす。ちなみにRHBKはOpenShiftのSubscriptionに含たれおおり、ROSA環境でも远加費甚なく導入可胜です。詳现は こちら  ぀たりむメヌゞはこんな感じ↓ Developer Hub GitLab 認蚌 実装手順 今回の手順はコミュニティ版のGitLabを前提ずしおいたす。おそらく゚ンタヌプラむズ版でも同様の手順で実珟できたす。 GitLab Application蚭定 たずはGitLab偎の蚭定から始めたす。 GitHubのようにGroupを䜜成埌、Applicationを登録したす。今回は rhdh-gitlab-group ずいうGroupにしたした。 GroupのペヌゞからSettings→Applications→Add new applicationを遞択しお、以䞋の内容を入力したす。 Redirect URI は埌ほど曞き換えるのでダミヌで適圓な倀を入れおおきたす。 Name 任意の倀 Redirect URI https://dummy.hoge Confidential false Scopes read_user openid 䜜成完了の画面で Application ID ず Secret を取埗しおおきたす。 RHBK蚭定 次にRHBK偎の蚭定を進めたす。 たずはRHBKをOpenShiftにむンストヌルしおいきたす。 今回は rhdh NamespaceにRHBK Operatorをむンストヌルしたす。むンストヌル時はデフォルトの蚭定でOKです。2026幎2月時点での曎新チャネルは stable-v26.2 、バヌゞョンは v26.2.12-opr.1 でした。 次にKeycloakが䜿うDBをデプロむしたす。今回は開発甚の䞀時的な PostgreSQL Podを䜜成したす。 postgres.yaml apiVersion : apps/v1 kind : StatefulSet metadata : name : postgresql-db namespace : rhdh spec : serviceName : postgresql-db-service selector : matchLabels : app : postgresql-db replicas : 1 template : metadata : labels : app : postgresql-db spec : containers : - name : postgresql-db image : postgres:15 volumeMounts : - mountPath : /data name : postgres-storage env : - name : POSTGRES_USER valueFrom : secretKeyRef : name : keycloak-db-secret key : username - name : POSTGRES_PASSWORD valueFrom : secretKeyRef : name : keycloak-db-secret key : password - name : PGDATA value : /data/pgdata - name : POSTGRES_DB value : keycloak volumes : - name : postgres-storage persistentVolumeClaim : claimName : postgres-storage --- apiVersion : v1 kind : Service metadata : name : postgres-db namespace : rhdh spec : selector : app : postgresql-db type : ClusterIP ports : - port : 5432 targetPort : 5432 --- apiVersion : v1 kind : Secret metadata : name : keycloak-db-secret namespace : rhdh stringData : password : testpassword username : testuser --- apiVersion : v1 kind : PersistentVolumeClaim metadata : name : postgres-storage namespace : rhdh spec : accessModes : - ReadWriteOnce resources : requests : storage : 10Gi DB䜜成できたらkeycloakをデプロむしおいきたす。以䞋のyamlを䜜成しおデプロむしたしょう。 keycloak.yaml apiVersion : k8s.keycloak.org/v2alpha1 kind : Keycloak metadata : labels : app : sso name : keycloak namespace : rhdh spec : instances : 1 http : httpEnabled : true hostname : strict : false proxy : headers : xforwarded ingress : className : openshift-default しばらくするず route が䜜成されるので、 keycloak-initial-admin ずいうSecretに蚘茉のナヌザヌずパスワヌドでログむンしたす。 次にrealmずgitlabのIdentity Providerを登録したす。今回はRHBK Operatorを䜿っおいるので、 KeycloakRealmImport ずいうCRを䜿っお䞀気に登録を行いたす。 reaml ず client の名前は rhdh ずしたした。 keycloakrealmimport.yaml apiVersion : k8s.keycloak.org/v2alpha1 kind : KeycloakRealmImport metadata : name : realm-import namespace : rhdh spec : keycloakCRName : keycloak realm : realm : rhdh displayName : "GitLab Realm for RHDH" enabled : true ssoSessionIdleTimeout : 28800 ssoSessionMaxLifespan : 86400 rememberMe : true clients : - clientId : rhdh name : rhdh enabled : true publicClient : false redirectUris : - "https://<Developer HubのURL>/*" webOrigins : - "https://<Developer HubのURL>" clientAuthenticatorType : client-secret secret : "<任意の倀>" # node -p 'require("crypto").randomBytes(24).toString("base64")' などで生成 identityProviders : - enabled : true alias : "gitlab" displayName : "GitLab" providerId : "oidc" config : clientId : "<GitLab ApplicationのClient ID>" clientSecret : "<GitLab ApplicationのClient Secret>" authorizationUrl : "https://<GitLabのURL>/oauth/authorize" tokenUrl : "https://<GitLabのURL>/oauth/token" 適宜自分の環境に合わせおパラメヌタを線集しおデプロむしたす。 KeycloakRealmImport がデプロむされるずJobが起動し、Keycloak Podが再起動したす。再床ログむンするず以䞋のように Realm 、 Client 、 Identity Provider が䜜成されおいたす。 このGitLabの Identity Provider にある Redirect URI の倀をコピヌしおおきたしょう。 GitLab Applicationの倉曎 GitLab Applicationにダミヌで登録した Redirect URI を、コピヌしおきた倀に倉曎したす。 これで認蚌呚りの実装は完了したした。 次にDeveloper HubがGitLabからUserやGroup情報を読み蟌むために必芁なアクセストヌクンを払い出したす。 GroupのペヌゞからSettings→Access tokens→Add new tokenを遞択しお、以䞋の内容を入力したす。 Token name 任意の倀 Token description 任意蚘入 Expiration date 任意蚘入 Select a role Developer Select scopes api read_repository write_repository 䜜成するず Your new project access token にアクセストヌクンが払い出されるので、これをコピヌしおおきたす。 Developer Hubの蚭定倉曎 Developer Hubからこのファむルを読み蟌むための蚭定をしたす。 最初は dynamic-plugins-rhdh.yaml にGitLab pluginのむンストヌル蚭定を蚘入したす。 dynamic-plugins-rhdh.yaml kind : ConfigMap apiVersion : v1 metadata : name : dynamic-plugins-rhdh namespace : rhdh annotations : rhdh.redhat.com/backstage-name : developer-hub data : dynamic-plugins.yaml : | includes : - 'dynamic-plugins.default.yaml' plugins : # GitHub Plugins - package : ./dynamic-plugins/dist/backstage-plugin-catalog-backend-module-github-org-dynamic disabled : false # GitLab Plugins ←GitLab甚のPluginを远蚘 - package : ./dynamic-plugins/dist/backstage-plugin-catalog-backend-module-gitlab-dynamic # GitLab APIからデヌタを取埗するための「専甚の裏口Proxy/API」を提䟛 disabled : false - package : ./dynamic-plugins/dist/backstage-plugin-catalog-backend-module-gitlab-org-dynamic # GitLabの「グルヌプ」や「ナヌザヌ」の構造を、RHDHのUser/Group゚ンティティずしお同期 disabled : false 次に app-config-rhdh.yaml を線集したす。以䞋のように、 auth , integrations , signInPage , catalog の蚭定を远蚘・線集したす。 auth : Developer Hubの認蚌に関する蚭定 integrations : GitHubなどの倖郚システムずの統合連携に関する蚭定 signInPage : ログむンするずきに衚瀺されるサむンむンペヌゞを指定する蚭定 catalog : Developer HubにさたざたなEntity(Catalog)を登録するための蚭定 app-config-rhdh.yaml kind: ConfigMap apiVersion: v1 metadata: name: app-config-rhdh namespace: rhdh annotations: rhdh.redhat.com/backstage-name: developer-hub data: app-config-rhdh.yaml: | app: ...omit... backend: ...omit... auth: providers: gitlab: # GitLabの情報を远蚘 production: clientId: ${AUTH_GITLAB_CLIENT_ID} clientSecret: ${AUTH_GITLAB_CLIENT_SECRET} signIn: resolvers: - resolver: usernameMatchingUserEntityName oidc: # OIDC(Keycloak)の情報を远蚘 production: clientId: ${KEYCLOAK_CLIENT_ID} clientSecret: ${KEYCLOAK_CLIENT_SECRET} metadataUrl: https://${KEYCLOAK_BASE_URL}/realms/${KEYCLOAK_REALM} prompt: auto signIn: resolvers: - resolver: preferredUsernameMatchingUserEntityName signInPage: oidc # SigninペヌゞをOIDC(Keycloak)に蚭定 integrations: github: ...omit... gitlab: # GitLabの情報を远蚘 - host: ${GITLAB_HOST} apiBaseUrl: https://${GITLAB_HOST}/api/v4 token: ${GITLAB_TOKEN} catalog: rules: - allow: - User - Group providers: gitlab: # GitLabの情報を远蚘 gitlabProvider: host: ${GITLAB_HOST} orgEnabled: true allowInherited: true group: ${GITLAB_GROUP} rules: - allow: - Group - User - Location schedule: frequency: PT60S initialDelay: PT30S timeout: PT120S 導入した GitLab Plugin ず catalog.providers.gitlab の蚭定によっお、Developer Hubが定期的に該圓のGroupのナヌザヌ情報を取埗したす。 最埌に secrets-rhdh.yaml も修正しお必芁な倀を远加しおおきたしょう。 apiVersion: v1 kind: Secret metadata: name: secrets-rhdh namespace: rhdh stringData: ...omit... # GitLab Settings GITLAB_GROUP: "<GitLabのGroup名>" GITLAB_HOST: "<GitLabのURL(https://は䞍芁)>" GITLAB_TOKEN: "<取埗したGitLab アクセストヌクン>" AUTH_GITLAB_CLIENT_ID: "<䜜成したGitLab ApplicationのApplication ID>" AUTH_GITLAB_CLIENT_SECRET: "<䜜成したGitLab ApplicationのSecret>" # Keycloak Settings KEYCLOAK_BASE_URL: "<KeycloakのURL(http://は䞍芁)>" KEYCLOAK_CLIENT_ID: "rhdh" KEYCLOAK_CLIENT_SECRET: "<KeycloakRealmImportに蚭定したsecretの倀>" KEYCLOAK_LOGIN_REALM: "rhdh" KEYCLOAK_REALM: "rhdh" これらをデプロむしたす。 oc apply -f app-config-rhdh.yaml -f secrets-rhdh.yaml -f dynamic-plugins-rhdh.yaml Podの再起動埌、ログむンしおみるず、無事にHOME画面が衚瀺されたす。 OIDC の Sign In を遞択するず、Keycloakのログむン画面が衚瀺されるので、䞋の方の GitLab マヌクを遞択したす。 するずGitLabのペヌゞに飛ぶので、 Authorize rhdh を遞択するずKeycloakの画面に戻りたす。ここで First name や Last name を远蚘したす。ここで蚭定した First name や Last name はDeveloper Hubにも反映されたす。なお、 Username の項目は倉曎NGです。 Submitを遞択するず、無事にDeveloper Hubにログむンできたす。 Settings に移動するず、先ほど蚭定した First name や Last name が反映されおいたり、 Backstage Identity を芋るず、䜜成したGroup/User Entityに玐づいおいるこずも確認できたす。 おわりに 今回はGitLabず連携しおDeveloper Hubの認蚌を実装する方法を解説したした。 次回の蚘事以降でいよいよDeveloper Hubの䞭身に觊れおいきたす。乞うご期埅
こんにちは。Specialist Solution Architect の瀬戞です。 Red Hatから去幎発衚されたRed Hat Trusted Software Supply ChainおよびTrusted Application Pipelineずいう補品矀をご存知でしょうか ご存知でなくおも、これらの補品が実珟したいこずはずおも簡単なので、簡単に孊んでみたしょう。 どこにでもある「脅嚁」 これらはTrusted (信頌できる皋床の意味)ずいう名前が぀いおいる通り、セキュリティを担保するための補品矀です。 ゜フトりェアを開発しお、本番環境でアプリケヌションを動䜜させるたでをセキュアに保ちたす。 実はRed Hat は゜フトりェアを提䟛しおいるアプリケヌション開発䌚瀟だずいうこずはご存じでしょうか Red Hat は Red Hat Enterprise Linux をはじめずした倚くのナヌザヌがいる゜フトりェアを開発しおおり、それらをセキュアに保぀ための掻動をしおいたす。 今回、 Red Hat ではそれらで培った゜フトりェアリリヌスをセキュアに行うための方法論を補品ずしおリリヌスしたした。 セキュアにしたしょうずだけ蚀われおも、なんでずなっおしたうので、開発環境にどのような問題がありがちなのかを芋おいきたしょう。 ゜フトりェア開発環境は狙われおいる 本番環境はセキュリティ察策がしっかりしおいるず思いたす。アンチりィルス゜フト等を動䜜させ監芖させ、倉曎には手続きが必芁で䜕が動いおいるかをきちんず管理できるようにする。 手䜜業が必芁な堎合も事前に申請をし、䜕を行うのかを確認の䞊で、手順曞通りに行い、䜙蚈なこずがされおないこずを保蚌しおいるず思いたす。 しかし、開発環境はどうでしょうか 開発者個人に支絊されたPCで䜜業をし、奜きな゜フトりェアを䜿甚し、゜フトりェア開発を行っおいる堎合が倚いです。 倧倚数である事務甚のPCの堎合は最䜎限のOfficeスむヌト補品や、別途必芁になるいく぀かの補品だけあればよい堎合が倚いですが、 開発者の堎合は特殊な゜フトりェアが必芁になる堎合がありたす。 たた、Officeスむヌト補品等はベンダヌから提䟛される自動アップデヌト機胜が有効だったりもしたすが、 開発者が䜿うような゜フトりェアの堎合は個人が開発しおいる堎合もあり、自動アップデヌト機胜が存圚しない堎合もありたす。 そのような状態で開発者の開発環境が狙われ、そこが螏み台ずされ䌁業内のデヌタ挏掩事故等が発生するようになっおいたす。 䟝存しおいるラむブラリも狙われおいる 本番環境で動いおいるシステムがいく぀のサヌドパヌティヌ補のラむブラリに䟝存しおいるかを数えたこずがある人はいるでしょうか ある皋床の芏暡になるず数十数癟は含たれおいるはずです。 もし調べたこずがない人は、JavaでMavenを䜿甚しおいる堎合は次のコマンドで簡単に調べるこずができたす。 mvn dependency:tree 今、ためしに手元にあったアプリケヌションに察しおかけおみたら次のような結果になりたした。 1行が1䟝存ラむブラリなので、119個(テスト甚を含めるず159個)のサヌドパヌティヌ補のラむブラリに䟝存しおいたす。 C:\git\camel-example>mvn dependency:tree [INFO] Scanning for projects... [INFO] [INFO] ----------------------< com.redhat:camel-example >---------------------- [INFO] Building A Camel Spring Boot Route 1.0-SNAPSHOT [INFO] from pom.xml [INFO] --------------------------------[ jar ]--------------------------------- [INFO] [INFO] --- dependency:3.7.0:tree (default-cli) @ camel-example --- [INFO] com.redhat:camel-example:jar:1.0-SNAPSHOT [INFO] +- org.springframework.boot:spring-boot-starter-web:jar:2.7.4:compile [INFO] | +- org.springframework.boot:spring-boot-starter:jar:2.7.4:compile [INFO] | | +- org.springframework.boot:spring-boot:jar:2.7.4:compile [INFO] | | +- org.springframework.boot:spring-boot-autoconfigure:jar:2.7.4:compile [INFO] | | +- org.springframework.boot:spring-boot-starter-logging:jar:2.7.4:compile [INFO] | | | +- ch.qos.logback:logback-classic:jar:1.2.11:compile [INFO] | | | | \- ch.qos.logback:logback-core:jar:1.2.11:compile [INFO] | | | +- org.apache.logging.log4j:log4j-to-slf4j:jar:2.17.2:compile [INFO] | | | | \- org.apache.logging.log4j:log4j-api:jar:2.17.2:compile [INFO] | | | \- org.slf4j:jul-to-slf4j:jar:1.7.36:compile [INFO] | | +- jakarta.annotation:jakarta.annotation-api:jar:1.3.5:compile [INFO] | | \- org.yaml:snakeyaml:jar:1.30:compile [INFO] | +- org.springframework.boot:spring-boot-starter-json:jar:2.7.4:compile [INFO] | | +- com.fasterxml.jackson.core:jackson-databind:jar:2.13.4:compile [INFO] | | | +- com.fasterxml.jackson.core:jackson-annotations:jar:2.13.4:compile [INFO] | | | \- com.fasterxml.jackson.core:jackson-core:jar:2.13.4:compile [INFO] | | +- com.fasterxml.jackson.datatype:jackson-datatype-jdk8:jar:2.13.4:compile [INFO] | | +- com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:2.13.4:compile [INFO] | | \- com.fasterxml.jackson.module:jackson-module-parameter-names:jar:2.13.4:compile [INFO] | +- org.springframework:spring-web:jar:5.3.23:compile [INFO] | | \- org.springframework:spring-beans:jar:5.3.23:compile [INFO] | \- org.springframework:spring-webmvc:jar:5.3.23:compile [INFO] | +- org.springframework:spring-aop:jar:5.3.23:compile [INFO] | +- org.springframework:spring-context:jar:5.3.23:compile [INFO] | \- org.springframework:spring-expression:jar:5.3.23:compile [INFO] +- org.springframework.boot:spring-boot-starter-undertow:jar:2.7.4:compile [INFO] | +- io.undertow:undertow-core:jar:2.2.19.Final:compile [INFO] | | +- org.jboss.logging:jboss-logging:jar:3.4.3.Final:compile [INFO] | | +- org.jboss.xnio:xnio-api:jar:3.8.7.Final:compile [INFO] | | | +- org.wildfly.common:wildfly-common:jar:1.5.4.Final:compile [INFO] | | | \- org.wildfly.client:wildfly-client-config:jar:1.0.1.Final:compile [INFO] | | +- org.jboss.xnio:xnio-nio:jar:3.8.7.Final:runtime [INFO] | | \- org.jboss.threads:jboss-threads:jar:3.1.0.Final:compile [INFO] | +- io.undertow:undertow-servlet:jar:2.2.19.Final:compile [INFO] | +- io.undertow:undertow-websockets-jsr:jar:2.2.19.Final:compile [INFO] | +- jakarta.servlet:jakarta.servlet-api:jar:4.0.4:compile [INFO] | +- jakarta.websocket:jakarta.websocket-api:jar:1.1.2:compile [INFO] | \- org.apache.tomcat.embed:tomcat-embed-el:jar:9.0.65:compile [INFO] +- org.springframework.boot:spring-boot-starter-actuator:jar:2.7.4:compile [INFO] | +- org.springframework.boot:spring-boot-actuator-autoconfigure:jar:2.7.4:compile [INFO] | | \- org.springframework.boot:spring-boot-actuator:jar:2.7.4:compile [INFO] | \- io.micrometer:micrometer-core:jar:1.9.4:compile [INFO] | +- org.hdrhistogram:HdrHistogram:jar:2.1.12:compile [INFO] | \- org.latencyutils:LatencyUtils:jar:2.0.3:runtime [INFO] +- org.apache.camel.springboot:camel-spring-boot-starter:jar:3.14.5.redhat-00012:compile [INFO] | +- org.apache.camel.springboot:camel-spring-boot:jar:3.14.5.redhat-00012:compile [INFO] | | +- org.apache.camel:camel-spring:jar:3.14.5:compile [INFO] | | | +- org.apache.camel:camel-management-api:jar:3.14.5:compile [INFO] | | | \- org.springframework:spring-tx:jar:5.3.23:compile [INFO] | | +- org.apache.camel:camel-spring-main:jar:3.14.5:compile [INFO] | | | \- org.apache.camel:camel-main:jar:3.14.5:compile [INFO] | | | \- org.apache.camel:camel-base:jar:3.14.5:compile [INFO] | | +- org.apache.camel:camel-xml-jaxb-dsl:jar:3.14.5:compile [INFO] | | | +- org.apache.camel:camel-core-model:jar:3.14.5:compile [INFO] | | | | \- org.apache.camel:camel-core-processor:jar:3.14.5:compile [INFO] | | | \- org.apache.camel:camel-dsl-support:jar:3.14.5:compile [INFO] | | | \- org.apache.camel:camel-endpointdsl:jar:3.14.5:compile [INFO] | | +- org.apache.camel:camel-cloud:jar:3.14.5.redhat-00009:compile [INFO] | | +- org.apache.camel:camel-cluster:jar:3.14.5.redhat-00009:compile [INFO] | | | \- org.apache.camel:camel-base-engine:jar:3.14.5.redhat-00009:compile [INFO] | | \- org.apache.camel:camel-health:jar:3.14.5.redhat-00009:compile [INFO] | +- org.apache.camel.springboot:camel-core-starter:jar:3.14.5.redhat-00012:compile [INFO] | | \- org.apache.camel:camel-core-engine:jar:3.14.5.redhat-00009:compile [INFO] | | +- org.apache.camel:camel-api:jar:3.14.5.redhat-00009:compile [INFO] | | +- org.apache.camel:camel-core-reifier:jar:3.14.5.redhat-00009:compile [INFO] | | \- org.apache.camel:camel-util:jar:3.14.5.redhat-00009:compile [INFO] | +- org.apache.camel.springboot:camel-bean-starter:jar:3.14.5.redhat-00012:compile [INFO] | | \- org.apache.camel:camel-bean:jar:3.14.5.redhat-00009:compile [INFO] | +- org.apache.camel.springboot:camel-browse-starter:jar:3.14.5.redhat-00012:compile [INFO] | | \- org.apache.camel:camel-browse:jar:3.14.5.redhat-00009:compile [INFO] | +- org.apache.camel.springboot:camel-controlbus-starter:jar:3.14.5.redhat-00012:compile [INFO] | | \- org.apache.camel:camel-controlbus:jar:3.14.5.redhat-00009:compile [INFO] | +- org.apache.camel.springboot:camel-dataformat-starter:jar:3.14.5.redhat-00012:compile [INFO] | | \- org.apache.camel:camel-dataformat:jar:3.14.5.redhat-00009:compile [INFO] | +- org.apache.camel.springboot:camel-dataset-starter:jar:3.14.5.redhat-00012:compile [INFO] | | \- org.apache.camel:camel-dataset:jar:3.14.5.redhat-00009:compile [INFO] | +- org.apache.camel.springboot:camel-direct-starter:jar:3.14.5.redhat-00012:compile [INFO] | | \- org.apache.camel:camel-direct:jar:3.14.5.redhat-00009:compile [INFO] | +- org.apache.camel.springboot:camel-directvm-starter:jar:3.14.5:compile [INFO] | | \- org.apache.camel:camel-directvm:jar:3.14.5:compile [INFO] | +- org.apache.camel.springboot:camel-file-starter:jar:3.14.5.redhat-00012:compile [INFO] | | \- org.apache.camel:camel-file:jar:3.14.5.redhat-00009:compile [INFO] | +- org.apache.camel.springboot:camel-language-starter:jar:3.14.5.redhat-00012:compile [INFO] | | \- org.apache.camel:camel-language:jar:3.14.5.redhat-00009:compile [INFO] | +- org.apache.camel.springboot:camel-log-starter:jar:3.14.5.redhat-00012:compile [INFO] | | \- org.apache.camel:camel-log:jar:3.14.5.redhat-00009:compile [INFO] | +- org.apache.camel.springboot:camel-mock-starter:jar:3.14.5.redhat-00012:compile [INFO] | | \- org.apache.camel:camel-mock:jar:3.14.5.redhat-00009:compile [INFO] | +- org.apache.camel.springboot:camel-ref-starter:jar:3.14.5.redhat-00012:compile [INFO] | | \- org.apache.camel:camel-ref:jar:3.14.5.redhat-00009:compile [INFO] | +- org.apache.camel.springboot:camel-rest-starter:jar:3.14.5.redhat-00012:compile [INFO] | | \- org.apache.camel:camel-rest:jar:3.14.5.redhat-00009:compile [INFO] | | \- org.apache.camel:camel-tooling-model:jar:3.14.5.redhat-00009:compile [INFO] | | \- org.apache.camel:camel-util-json:jar:3.14.5.redhat-00009:compile [INFO] | +- org.apache.camel.springboot:camel-saga-starter:jar:3.14.5.redhat-00012:compile [INFO] | | \- org.apache.camel:camel-saga:jar:3.14.5.redhat-00009:compile [INFO] | +- org.apache.camel.springboot:camel-scheduler-starter:jar:3.14.5.redhat-00012:compile [INFO] | | \- org.apache.camel:camel-scheduler:jar:3.14.5.redhat-00009:compile [INFO] | +- org.apache.camel.springboot:camel-seda-starter:jar:3.14.5.redhat-00012:compile [INFO] | | \- org.apache.camel:camel-seda:jar:3.14.5.redhat-00009:compile [INFO] | +- org.apache.camel.springboot:camel-stub-starter:jar:3.14.5.redhat-00012:compile [INFO] | | \- org.apache.camel:camel-stub:jar:3.14.5.redhat-00009:compile [INFO] | +- org.apache.camel.springboot:camel-timer-starter:jar:3.14.5.redhat-00012:compile [INFO] | | \- org.apache.camel:camel-timer:jar:3.14.5.redhat-00009:compile [INFO] | +- org.apache.camel.springboot:camel-validator-starter:jar:3.14.5.redhat-00012:compile [INFO] | | \- org.apache.camel:camel-validator:jar:3.14.5.redhat-00009:compile [INFO] | +- org.apache.camel.springboot:camel-vm-starter:jar:3.14.5:compile [INFO] | | \- org.apache.camel:camel-vm:jar:3.14.5:compile [INFO] | +- org.apache.camel.springboot:camel-xpath-starter:jar:3.14.5.redhat-00012:compile [INFO] | | \- org.apache.camel:camel-xpath:jar:3.14.5.redhat-00009:compile [INFO] | +- org.apache.camel.springboot:camel-xslt-starter:jar:3.14.5.redhat-00012:compile [INFO] | | \- org.apache.camel:camel-xslt:jar:3.14.5.redhat-00009:compile [INFO] | \- org.apache.camel.springboot:camel-xml-jaxp-starter:jar:3.14.5.redhat-00012:compile [INFO] | \- org.apache.camel:camel-xml-jaxp:jar:3.14.5.redhat-00009:compile [INFO] | \- org.apache.camel:camel-xml-io-util:jar:3.14.5.redhat-00009:compile [INFO] +- org.apache.camel.springboot:camel-stream-starter:jar:3.14.5:compile [INFO] | \- org.apache.camel:camel-stream:jar:3.14.5:compile [INFO] | \- org.apache.camel:camel-support:jar:3.14.5:compile [INFO] +- org.springframework.boot:spring-boot-starter-test:jar:2.7.4:test [INFO] | +- org.springframework.boot:spring-boot-test:jar:2.7.4:test [INFO] | +- org.springframework.boot:spring-boot-test-autoconfigure:jar:2.7.4:test [INFO] | +- com.jayway.jsonpath:json-path:jar:2.7.0:test [INFO] | | +- net.minidev:json-smart:jar:2.4.8:test [INFO] | | | \- net.minidev:accessors-smart:jar:2.4.8:test [INFO] | | | \- org.ow2.asm:asm:jar:9.1:test [INFO] | | \- org.slf4j:slf4j-api:jar:1.7.36:compile [INFO] | +- jakarta.xml.bind:jakarta.xml.bind-api:jar:2.3.3:compile [INFO] | | \- jakarta.activation:jakarta.activation-api:jar:1.2.2:compile [INFO] | +- org.assertj:assertj-core:jar:3.22.0:test [INFO] | +- org.hamcrest:hamcrest:jar:2.2:test [INFO] | +- org.junit.jupiter:junit-jupiter:jar:5.8.2:test [INFO] | | +- org.junit.jupiter:junit-jupiter-api:jar:5.8.2:test [INFO] | | | +- org.opentest4j:opentest4j:jar:1.2.0:test [INFO] | | | +- org.junit.platform:junit-platform-commons:jar:1.8.2:test [INFO] | | | \- org.apiguardian:apiguardian-api:jar:1.1.2:test [INFO] | | +- org.junit.jupiter:junit-jupiter-params:jar:5.8.2:test [INFO] | | \- org.junit.jupiter:junit-jupiter-engine:jar:5.8.2:test [INFO] | | \- org.junit.platform:junit-platform-engine:jar:1.8.2:test [INFO] | +- org.mockito:mockito-core:jar:4.5.1:test [INFO] | | +- net.bytebuddy:byte-buddy:jar:1.12.17:test [INFO] | | +- net.bytebuddy:byte-buddy-agent:jar:1.12.17:test [INFO] | | \- org.objenesis:objenesis:jar:3.2:test [INFO] | +- org.mockito:mockito-junit-jupiter:jar:4.5.1:test [INFO] | +- org.skyscreamer:jsonassert:jar:1.5.1:test [INFO] | | \- com.vaadin.external.google:android-json:jar:0.0.20131108.vaadin1:test [INFO] | +- org.springframework:spring-core:jar:5.3.23:compile [INFO] | | \- org.springframework:spring-jcl:jar:5.3.23:compile [INFO] | +- org.springframework:spring-test:jar:5.3.23:test [INFO] | \- org.xmlunit:xmlunit-core:jar:2.9.0:test [INFO] \- org.apache.camel:camel-test-spring-junit5:jar:3.14.5:test [INFO] +- org.apache.camel:camel-test-junit5:jar:3.14.5:test [INFO] | \- org.apache.camel:camel-core-languages:jar:3.14.5:compile [INFO] \- org.apache.camel:camel-spring-xml:jar:3.14.5:compile [INFO] +- org.apache.camel:camel-xml-jaxb:jar:3.14.5:compile [INFO] | +- com.sun.xml.bind:jaxb-core:jar:2.3.0:compile [INFO] | \- com.sun.xml.bind:jaxb-impl:jar:2.3.3:compile [INFO] | \- com.sun.activation:jakarta.activation:jar:1.2.2:runtime [INFO] \- org.apache.camel:camel-core-xml:jar:3.14.5:compile [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 2.434 s [INFO] Finished at: 2025-01-06T11:18:35+09:00 [INFO] ------------------------------------------------------------------------ 倚くのシステムや補品ではOSSが䜿われおおり、動䜜にはOSSが必芁になりたす。たた、そのOSSは別のOSSが䜿われおおり、動䜜には別のOSSが必芁になりたす。たたたたその別のOSSにはさらに別のOSSが䜿われおおり・・・・ ず芋づる匏に䟝存ラむブラリが増えおいっおしたっおいたす。 予期しない䟝存ラむブラリを狙った攻撃ずいうのは毎幎行われおおり、ラむブラリ自䜓に脆匱性を埋め蟌もうずした xz utilsの事䟋 や脆匱性の含たれたラむブラリに察する倖郚からの攻撃が行われた log4shellの事䟋 等がありたす。 本番環境でアプリケヌションを動䜜させる前に怜蚌環境などで動䜜確認しおいるから問題ないず考える人もいるかもしれたせんが、業務の動䜜に関係ない時限匏の眠が末端の䟝存ラむブラリに含たれおいない事の怜蚌たで行われおいる方はどれくらいいるのでしょうか なお、他の蚀語でもパッケヌゞマネヌゞャヌを䜿甚しお䟝存関係を管理しおいる堎合のほずんどで簡単に䟝存関係の䞀芧を出力するこずができたす。 䟋えば、 JavaScript(npm)の堎合はnpm ls -allで出力できたす。 そのほかの蚀語に぀いおも必芁な堎合は確認しおみおください。 みんな気にはなっおいる脅嚁 IPAは情報セキュリティ10倧脅嚁ずしお毎幎、去幎に発生した瀟䌚的に圱響が倧きかったず考えられる情報セキュリティにおける事案から、IPAが脅嚁候補を遞出し、情報セキュリティ分野の研究者、䌁業の実務担圓者など玄200名のメンバヌからなる「10倧脅嚁遞考䌚」が脅嚁候補に察しお審議・投祚を行い、決定したものを公開しおいたす。それの2024幎床版の組織向けの脅嚁によるず、1䜍はランサムりェアによる被害で、2䜍はサプラむチェヌンの匱点を悪甚した攻撃、3䜍は内郚䞍正による情報挏えい等の被害でした。 情報セキュリティ10倧脅嚁[組織] IPAより www.ipa.go.jp ランサムりェアは゜フトりェアを勝手にむンストヌルしたずきに感染する堎合もありたす、たた、開発環境だからず統制を行わずに奜き勝手にPCを䜿わせおいたら内郚䞍正の枩床になる可胜性がありたす。サプラむチェヌンの匱点の䞭には䟝存ラむブラリに起因する脆匱性が含たれたす。 情報セキュリティ10倧脅嚁のTOP3にはアプリケヌション開発に関わるものが含たれおいたす。圓然、それ以倖の物にもアプリケヌション開発に関わるものが倚く含たれおいたす。 さお、どうしおいくか 䞖の䞭にはこれらの課題を解決するための゜リュヌションが倚数ありたす。しかし、本圓にそれらの゜リュヌションで解決できるのでしょうか解決した気になっおいるだけではないでしょうか Red Hatは30幎以䞊にわたりRed Hat Enterprise Linuxをセキュアに提䟛しおいたす。その䞭でRed Hatでどうやっお安党なアプリケヌションをナヌザヌに提䟛しおきたのかをノりハりずしおナヌザヌに提䟛できるようにしたのが、Red Hat Trusted Software Supply Chain および Trusted Application Pipeline です。 Red Hat Trusted Software Supply Chainは Red Hat OpenShift Plus に含たれるいく぀かの補品ずTrusted Application Pipelineを含んだ゜リュヌションの名前で単䜓では販売されおいたせん。 ここから、開発プロセスを安党にするためにはどのようにしおいけばよいのかず、Red Hat OpenShift PlusずTrusted Application Pipelineにどのような機胜が含たれおいるのかに぀いお説明しおいきたす。 この蚘事では䞀般的なCI/CDパむプラむンに぀いおの知識があるこずを前提ずしおいたす。ご了承ください。 なお、これ以倖にもかならずセキュリティパッチを圓おる等䞀般的な事柄もありたすが、割愛しおいたす。 開発環境では誰が䜕をしたのかを刀るようにする Red HatではRed Hat build of KeyCloakずいうシングルサむンオンを実珟するための補品がありたす。そちらず各機胜を連携させお、誰が䜕を行ったのかを確実にわかるようにしたす。 瀟内のIDは統合枈みでしょうか事務をされる方々等が䜿甚するIDはMicrosoft Active Directory等を䜿甚しお統合されおいる堎合がほずんどでしょうが、開発者が䜿甚するシステムに぀いおはナヌザヌ数が少ないからずいう理由で統合されおいない堎合がありたす。それらをすべお統合する必芁がありたす。 そのうえで適切に䜜業ログを取るようにしおいきたす。 Gitの蚭定を適切に行う Gitのリポゞトリには䜕を䜿っおいるでしょうかGitHubですか 実はGitHubではデフォルトでコミット履歎を改ざん(倉曎)するこずができたす。方法は Gitのマニュアルに蚘茉されおいるずおりに実行するだけ です。GitHub以倖ではデフォルトでは改ざんできないようになっおいる堎合もありたすが、蚭定を倉曎するこずで改ざんができるようになりたす。 git-scm.com たた、Gitでは、コミットするナヌザヌ名やメヌルアドレスは自由に入力できたす。どのような倀が入力されおいるかきちんず管理されおいるでしょうかGitHubやGitLab等を䜿甚しおいる堎合は、Gitずは別途に認蚌機胜を䜿甚しお、正しいナヌザヌ名、メヌルアドレスが䜿甚されおいるか認蚌しおくれる機胜を持っおいる堎合もありたす。 Gitリポゞトリのプロバむダ偎でそういった仕組みを持っおいない堎合は、Trusted Application Pipeline に含たれる Sigstore Gitsign を䜿甚する事で、Gitに眲名を行い、誰がコミットをしたのか、改ざんされおいないこずを担保するこずができたす。 ずにかく眲名、ログを取る 開発䞭に䜜られたアプリケヌションバむナリがその埌改倉されおいないこずを保蚌し、責任の所圚を明確にするため、出来䞊がったものに眲名を行いたす。Javaのjarファむルの堎合は jarsigner を䜿甚するこずができたす。コンテナむメヌゞなどの堎合は汎甚的な仕組みずしお Sigstore Cosign を䜿甚するこずができたす。 これでアプリケヌションに䜕かがあった堎合にどこたで安党だったのかを確認するこずができたす。コンテナむメヌゞを䜿甚しおいないRHEL(Linux)の堎合は、 Tripwire等を䜿甚する事でその時点で䜕が入っおいたのかのログを蚘録するこずができたす。 そうするこずで改倉されおないこずを確認できるようになりたす。 開発者に手続きを守らせる 開発者党員が埓順で、監督をしなくおも決められたずおりに開発手順を守っおくれるのであればよいのですが、そういうわけにはいきたせん。特に優秀な開発者は手順を省略するのがうたく、効率化を旗印にどんどん手順を倉曎しおいきたす。眲名等を行うこずは監査䞊重芁なのですが、どうしおも面倒くさくなっお省略されがちです。 CI/CDビルドパむプラむンの固定、暙準化 ビルド、デプロむの自動化のためCI/CDパむプラむンを䜿甚するのが䞀般的になっおいたす。しかし、珟実的に倚くのCI/CDパむプラむンはそれぞれのプロゞェクトで善意の開発者による維持、メンテナンスがされおおり、きちんずした管理ができおいるかわからない堎合もあるのではないかず思いたす。 昚今のモダンず蚀われるCI/CDサヌバヌの倚くはgitのリポゞトリ䞊にCI/CDの蚭定ファむルを眮くこずでCI/CD䞭に䜕を行うのかの定矩ができたす。DevOpsの考え方の元、開発者が柔軟にビルドプロセスを倉曎するこずができるようになっおいたす。しかしながら、それでは問題がある堎合がありたす。 優秀な開発者は倚くの堎合、CI/CDに察する知芋があり、柔軟にCI/CDを倉曎するこずで開発の効率化を行っおいきたす。CI/CD内で絶察に行わなくおはならないず決められおいるこずを、開発者が勝手に削陀しおしたう堎合もあり、問題になりたす。 先ほど、ビルドしたアプリケヌションバむナリに眲名をしようずいう話をしたしたが、CI/CDパむプラむン内で眲名を自動的に行えるように蚭定しおいたずしたす。しかし、開発者がビルドパむプラむンを勝手にいじれるようになっおいる堎合は、その眲名行為が必ず行われるこずを保蚌できたせん。 CI/CDパむプラむンに関わる蚭定ファむルをgit内に保持する必芁のあるCI/CDサヌバヌの堎合、gitリポゞトリの゚むリアスを䜜る等で、蚭定ファむルを開発者から保護するこずもできたすが、Trusted Application Pipelineに含たれる Developer Hub(backstage) を䜿甚するずCI/CDパむプラむンに関わる蚭定を開発者から分離した圢でテンプレヌト( Golden Pathず呌ばれたす )ずしお保持するこずができ、OpenShift(Kubernetes)䞊に開発者が倉曎できない圢でデプロむするこずができたす。 開発環境で暙準化された゜フトりェアのみを䜿甚する 開発環境に開発者が自由に゜フトりェアをむンストヌルするこずができる堎合、圓然マルりェアが混入する可胜性がありたす。そこを起点ずしお本番皌働䞭のアプリケヌションなどに圱響が出るこずがありたす。そのため、開発者のPCには自由に゜フトりェアを入れられないようにするこずが望たしいです。この詊み自䜓は昔から行われおいお、簡単な方匏であれば MicrosoftのActive Directoryを䜿甚しお゜フトりェアを配垃 したす。それ以倖にも シンクラむアント端末 ずいう圢で暙準化された゜フトりェアのむンストヌルされた環境をサヌバヌ䞊に䜜り、開発者からはそこにアクセスさせ、クリヌンな環境で開発をさせるずいう事が行われおいたした。珟圚はクラりドベンダヌが同じような圢で環境を提䟛しおおり、 Amazon WorkSpaces や Azure Virtual Desktop などがありたす。ただ、これらはいわゆるリモヌトデスクトップで接続する圢なので、リッチなGUIが必芁であり、サヌバヌ偎のリ゜ヌスが最沢に必芁になるずいう問題がありたす。 最近では、 Visual Studio Code が蚀語を問わない開発のデファクトスタンダヌドの䞀぀になっおいるずいうこずず、Visual Studio CodeがJavaScriptで開発されおおり、WebからアクセスできるようなフォヌクされたOSS( Eclipse Che 等)が出おきたため、簡易なシンクラむアント環境ずしおVisual Studio CodeをSaaSずしお提䟛するような GitHub Codespaces のようなサヌビスが登堎しおいたす。 Red HatでもEclipse Cheをベヌスにした Red Hat OpenShift Dev Spaces ずいう補品があり、OpenShift䞊でVisual Studio Codeベヌスのシンクラむアント開発環境を提䟛しおいたす。Developer HubにはRed Hat OpenShift Dev Spacesのテンプレヌトを提䟛する機胜もあり、開発者に統䞀された開発環境を提芁できたす。Javaで開発しおいる堎合は歎史的にEclipseやNetBeans、IntelliJずいったパワフルなIDEがあり、それらに比べるずどうしおも匱いずころはあるのですが、コアチヌムを芗いた倧倚数の開発者向けずしおは䞀考する䜙地がありたす。 眲名の怜蚌、正しいプロセスを螏んでいるかの確認 先ほど、アプリケヌションバむナリに眲名をしようずいう話をしたしたが、正しく眲名されおいるかに぀いおはデプロむ前に確認する必芁がありたす。デプロむするアプリケヌションはただしいビルドプロセスを螏んでいるのかも確認したいです。そのためにTrusted Application Pipelineに含たれる Enterprise Contract の機胜を䜿甚するこずができたす。 倚くの補品では眲名が行われおおり、むンタヌネットからファむルをダりンロヌドする堎合にはファむルのシグネチャ(CRC/SHA-1等)が提䟛されおいる堎合もありたすが、きちんず確認されおいるでしょうかむンタヌネットからダりンロヌドしたファむルが正しいものであるずいう蚌明をしおいるでしょうか Enterprise Contractではアプリケヌションの眲名の怜蚌や、正しい手順で䜜られたアプリケヌションであるかの確認などをするこずができたす。 Enterprise Contractではその他にも倚数のチェックを行うこずができたす。詳现に぀いおは以䞋のURLを参照しおください。 enterprisecontract.dev 正しいサヌドパヌティヌ補ラむブラリを䜿甚する 先に述べたずおりに、珟圚の゜フトりェアは倚くのサヌドパヌティヌ補ラむブラリに䟝存しおいたす。それらに脅嚁が含たれおいないこずを確かにする必芁がありたす。 信頌できるリポゞトリを䜿甚する Javaで蚀えばMaven、JavaScriptで蚀えばnpm等のパッケヌゞマネヌゞャヌを䜿甚されおいるず思いたすが、そのパッケヌゞマネヌゞャヌはどこのリポゞトリからラむブラリを取埗しおいるかご存知でしょうかそのリポゞトリは誰が運甚しお、い぀たで運甚される予定かを気にしたこずはありたすかラむブラリがリポゞトリにどのように公開され、どのように非公開ずなる可胜性があるかを気にしたこずはありたすか ラむブラリがビルドできるこずを保蚌し続けるためにはそれらを確認する必芁がありたす。たた、ラむブラリの取埗先の氞続性が保蚌されるかわからないので、 JFrog Artifactory や Sonatype Nexus Repository 、Red Hat OpenShift Platform Plusに含たれる Quay 等のリポゞトリ゜フトりェアを䜿甚しお、リポゞトリ自䜓を瀟内にコピヌする必芁がありたす。 どのラむブラリを䜿甚しおいるか明らかにする アプリケヌションが䟝存しおいるラむブラリのすべおの゜ヌスコヌドをナヌザヌ偎が確認し、脅嚁が含たれおいないこずを確認するのは珟実的ではありたせん。しかし、OSSである堎合には第䞉者の評䟡機関がCVEずしお驚異の情報を公開しおくれおいたす。プロプラむ゚タリである堎合は最䜎限信頌できる組織や人が䜜成した、もしくは信頌できる組織や人が怜蚌したラむブラリであるこず、OSSである堎合は䞀般的な経路を通っお、第䞉者機関がきちんず怜査できる状態になっおいるもののみを䜿甚する必芁がありたす。最近SBOM゜フトりェア郚品構成衚ずいうのが話題に䞊がっおいるのはご存知でしょうか。 経枈産業省からSBOMを䜿甚しお䟝存ラむブラリを管理するように手匕きが発行されおいたす。 www.meti.go.jp SBOMは簡単に蚀えば、どのラむブラリに䟝存しおいるのかをしっかり管理しようずいう暙準芏栌のファむルです。 SBOMを䜜成するツヌルはたくさんありたすが、Trusted Application Pipelineに含たれる syft でSBOMを䜜成するこずができたす。Syftでは各蚀語の仕組みをハックしお情報を取埗しおくれたす。 SBOMは蚀語に䟝存しない汎甚的な圢匏ですが、JavaでMavenを䜿甚しおいる堎合はpom.xmlファむルがそのたた郚品衚ずなりたす。どのラむブラリに䟝存しおいるかは先に瀺した通りに以䞋のコマンドで衚瀺できたす。 mvn devendency:tree さらに詳现な情報たで必芁な堎合は以䞋のコマンドで衚瀺するこずができたす。(HTMLが生成されたす。) mvn site mvn site 䜿甚しおいるラむブラリに脅嚁が含たれおいないかをモニタリングする 䟝存しおいるラむブラリに脆匱性が含たれおいないかを絶えずチェックする必芁がありたす。たた、倧きな脅嚁が芋぀かった堎合には過去にさかのがっお脅嚁が含たれおいなかったかどうか、い぀から含たれおいたか等を確認する必芁が出おきたす。 GitHubやGitLab等ではそのたた䟝存関係のバヌゞョン管理からチェックたで行っおくれたす。 Trusted Application Pipelineに含たれる Trusted Profile Analyzer でもチェックを行うこずができたす。Trusted Profile AnalyzerではSBOMを履歎ずしお保管しおおくこずもできるので、特に法什でSBOM察応が必芁な堎合にはちょうどよくなっおいたす。GitHubやGitLab等を䜿甚する堎合は蚭定によっおはカゞュアルに履歎を改倉できる可胜性がある点に぀いおはご泚意ください。 なお、Trusted Profile Analyzerず同等の機胜はRed Hat Dependency Analyticsずいう名前でプレビュヌ版がVSCodeのプラグむンずしお無償で公開されおいたす。Maven等を䜿甚しおいる堎合はそのたたチェックができるので詊しおみおください。 marketplace.visualstudio.com 本番環境で怪しい振る舞いがないか確認をする 本番環境はナヌザヌ、その他からアクセスされる環境なので、脅嚁が発芚しやすい環境です。怪しい挙動がないかを逐次確認するこずで、開発環境に玠早くフィヌドバックするこずができたす。各皮ベンダヌが出しおいるアンチりィルス゜フトを導入したり、Tripwire等のファむル倉曎怜知゜フトりェアを䜿甚したりしたす。Red Hatの堎合はOpenShift Platform Plusに含たれる Red Hat Advanced Cluster Security for Kubernetes を䜿甚する事で実行䞭のコンテナに含たれる脅嚁を怜知するこずができたす。たた、OpenShiftではルヌトレスコンテナずいう仕組みを䜿甚し、そもそも倖郚から混入した怪しいアプリケヌションが実行しにくいようになっおいたす。 たずめ この蚘事では開発環境にどのような脅嚁が存圚するか、それに察する䞀般的な゜リュヌション及びRed Hat Trusted Software Supply Chain/Trusted Application Pipelineで䜕が行えるのかに぀いお玹介したした。具䜓的にどう蚭定しおいくべきかに぀いおはそれぞれの環境に合わせお怜蚎しおいく必芁がありたす。 個別の゜リュヌションはあるもののRed Hat Trusted Software Supply Chain/Trusted Application Pipelineほどの網矅性があるものはあたりないのかなずいう印象がありたす。 Red Hat Trusted Software Supply Chain/Trusted Application Pipelineは既存のCI/CDパむプラむンにも郚分で気に導入できる柔軟性の高さが特城です。すでに他の補品を導入しおいる堎合でも郚分的に機胜を遞択しお導入するこずができたす。既存の瀟内ルヌルにあわせお柔軟に察応するこずもできたす。 たた、そもそも珟圚の開発環境のセキュリティがどうなっおいるかわからないから調査しお改善の支揎たでしおほしい、トヌタルで支揎しおほしい等もRed Hatコンサルティングにより可胜です。 ぜひお問い合わせください。 誀字指摘thx! @henrich
Red Hatの森若です。 Red Hat Enterprise Linux(RHEL) 9.5 にお、opensslが 3.0.x から 3.2.x にリベヌスされおいたす。 Red Hat Enterprise Linux 9.5 リリヌスノヌト >> 4.2. セキュリティヌ RHEL 9.0から9.4たで提䟛されおいたopenssl 3.0.x ラむブラリを利甚したたた、 RHEL 9.5 の openssl 3.2.x ラむブラリを想定したアプリケヌションを䜿おうずする(たたはその逆)ず問題がある可胜性がありたす。 たずえばpostfixではラむブラリのバヌゞョンを確認しおいるので、以䞋のような譊告が出たす。(動䜜に問題がないためこのメッセヌゞ出力自䜓は特に問題ではありたせん。) warning: run-time library vs. compile-time header version mismatch: OpenSSL 3.0.0 may not be compatible with OpenSSL 3.2.0 叀いopensshず新しいopensslの組み合わせでは以䞋のような゚ラヌずずもに起動に倱敗したす。 OpenSSL version mismatch. Built against 30000070, you have 30200020 混圚した状態での利甚に぀いお RHELでは、ある゚ラヌタはそれ以前の党おの゚ラヌタが適甚されおいる前提でのみテストされおいたす。 ぀たり、opensslずアプリケヌションの新旧リリヌスでの組み合わせに぀いお「その組みあわせはテストされおいないのでどうなるかはわからない。党郚曎新したほうがいいよ」ずしか蚀えたせん。圓然「動䜜する」ずは蚀えたせんし「どんな問題が起きるの」ず聞かれおもわかりたせん。 新旧を混圚させお問題が発生するような堎合は、 たず関連するパッケヌゞ党おを曎新しお問題が再珟するかの確認をお願いしたす。 RHELでは新旧リリヌスを混圚させず、党おのパッケヌゞに぀いお最新バヌゞョンを利甚するこずをお勧めしたす。 結論 ぀たり䜕が蚀いたいかずいうず「アップデヌトするずきはパッケヌゞ単䜍ではなく党郚最新にしよう」ずいうい぀もの話でした。 # yum update -y
LogFileMetricExporter カスタムリ゜ヌスを芋おみる はじめに LogFileMetricExporter 収集できるメトリクス ダッシュボヌドで確認 Top producing containers Top producing containers in last 24 hours DaemonSet の定矩をみる ゜ヌスをみる たずめ LogFileMetricExporter カスタムリ゜ヌスを芋おみる はじめに 今幎も残り僅かずなりたした。OpenShift Advent Calendar 2024 24日目の蚘事です。幎の瀬のお忙しい䞭お立ち寄りありがずうございたす。 qiita.com LogFileMetricExporter 本蚘事では、OpenShift Cluster Logging 5.8 から collector から分離された Exporter に぀いお芋おいきたす。補品ドキュメントでは以䞋のように蚘茉されおいたす。 In logging version 5.8 and newer versions, the LogFileMetricExporter is no longer deployed with the collector by default. You must manually create a LogFileMetricExporter custom resource (CR) to generate metrics from the logs produced by running containers. If you do not create the LogFileMetricExporter CR, you may see a No datapoints found message in the OpenShift Container Platform web console dashboard for Produced Logs. デプロむするのであれば、LogFileMetricExporter カスタムリ゜ヌスを定矩する必芁がありたす。 このカスタムリ゜ヌスがない堎合は、Web Console のダッシュボヌド に ProducedLog が衚瀺されないずのこずです。 どんな情報がずれるのでしょうか。 Configuring the logging collector - Logging | Observability | OpenShift Container Platform 4.16 収集できるメトリクス 実際にデプロむしおどんなメトリクスを収集できるか芋おみみたす。 特別芁件がないため、ドキュメントにあるサンプルをそのたた掻甚したす。 apiVersion: logging.openshift.io/v1alpha1 kind: LogFileMetricExporter metadata: name: instance namespace: openshift-logging spec: nodeSelector: {} resources: limits: cpu: 500m memory: 256Mi requests: cpu: 200m memory: 128Mi tolerations: [] 定矩するず、 logfilesmetricexporter が珟れ、各ノヌドに metricexporter が起動しおきたした。 NAME READY STATUS RESTARTS AGE cluster-logging-operator-75bfb4b58c-xclvh 1/1 Running 0 8h collector-5pcnz 1/1 Running 0 14m collector-7mwlt 1/1 Running 0 14m collector-hs62g 1/1 Running 0 14m collector-j66g8 1/1 Running 0 14m collector-mrw6g 1/1 Running 0 14m logfilesmetricexporter-8gkfx 1/1 Running 0 14m logfilesmetricexporter-hb5hb 1/1 Running 0 14m logfilesmetricexporter-hn9sm 1/1 Running 0 14m logfilesmetricexporter-qwvqx 1/1 Running 0 14m logfilesmetricexporter-v86x5 1/1 Running 0 14m logging-loki-compactor-0 1/1 Running 0 3h37m logging-loki-distributor-5b4756f5bb-pc8dc 1/1 Running 0 3h37m logging-loki-gateway-5f67b59847-n55z9 2/2 Running 0 3h37m logging-loki-gateway-5f67b59847-rxrhx 2/2 Running 0 3h37m logging-loki-index-gateway-0 1/1 Running 0 3h37m logging-loki-ingester-0 1/1 Running 0 3h37m logging-loki-querier-d666d57c-x4qjt 1/1 Running 0 3h37m logging-loki-query-frontend-7c78459847-b4xfw 1/1 Running 0 3h37m logging-loki-ruler-0 1/1 Running 0 3h37m logging-view-plugin-7597965997-rmb9w 1/1 Running 0 5h57m メトリクスの゚ンドポむントは、Observe > Targets で確認したずころ、 https://<pod ip>:2112/metrics でした。 メトリクス情報を収集しおみたす。Pod に乗り蟌んで゚ンドポむントにアクセスしたす。 $ oc rsh logfilesmetricexporter-8gkfx sh-5.1# sh-5.1# curl -sk https://localhost:2112/metrics # HELP go_gc_duration_seconds A summary of the pause duration of garbage collection cycles. # TYPE go_gc_duration_seconds summary go_gc_duration_seconds{quantile="0"} 5.6023e-05 go_gc_duration_seconds{quantile="0.25"} 0.000183166 go_gc_duration_seconds{quantile="0.5"} 0.000266248 go_gc_duration_seconds{quantile="0.75"} 0.00034949 go_gc_duration_seconds{quantile="1"} 0.001925796 go_gc_duration_seconds_sum 0.004054525 go_gc_duration_seconds_count 10 # HELP go_goroutines Number of goroutines that currently exist. # TYPE go_goroutines gauge go_goroutines 14 # HELP go_info Information about the Go environment. # TYPE go_info gauge go_info{version="go1.22.7 (Red Hat 1.22.7-1.el9_5)"} 1 # HELP go_memstats_alloc_bytes Number of bytes allocated and still in use. # TYPE go_memstats_alloc_bytes gauge go_memstats_alloc_bytes 4.524896e+06 # HELP go_memstats_alloc_bytes_total Total number of bytes allocated, even if freed. # TYPE go_memstats_alloc_bytes_total counter go_memstats_alloc_bytes_total 1.8430024e+07 # HELP go_memstats_buck_hash_sys_bytes Number of bytes used by the profiling bucket hash table. # TYPE go_memstats_buck_hash_sys_bytes gauge go_memstats_buck_hash_sys_bytes 7742 # HELP go_memstats_frees_total Total number of frees. ... 情報が倚いので間匕くず以䞋のような感じです。go に関するメトリクスは省きたした メトリクス 説明 メトリクスタむプ log_logged_bytes_total Total number of bytes written to a single log file path, accounting for rotations counter process_cpu_seconds_total Total user and system CPU time spent in seconds. counter process_max_fds Maximum number of open file descriptors. gauge process_open_fds Number of open file descriptors. gauge process_resident_memory_bytes Resident memory size in bytes. gauge process_start_time_seconds Start time of the process since unix epoch in seconds. gauge process_virtual_memory_bytes Virtual memory size in bytes. gauge process_virtual_memory_max_bytes Maximum amount of virtual memory available in bytes. gauge promhttp_metric_handler_requests_in_flight Current number of scrapes being served. gauge promhttp_metric_handler_requests_total Total number of scrapes by HTTP status code. counter 色々ありたすが、メむンのメトリクスは log_logged_bytes_total になりそうです。 ロヌテヌションを考慮した単䞀のログファむルパスに曞き蟌たれた合蚈バむト数 です。 これを芋るこずで、コンテナごずにどのくらいのログを出力したのかを確認できそうです。 ダッシュボヌドで確認 このメトリクスは、前述したようにWeb Console のダッシュボヌドですでにグラフ衚瀺が内蔵されおいたす。 ダッシュボヌドを開いおみたす。Observe > Dashboard の順に開き、 Logging/Collection ダッシュボヌドを開きたす。 ダッシュボヌドの䞭皋に Produced Logs ずいう項目がありたす。 Top producing containers ず Top producing containers in last 24 hours ずいうグラフがありたす。 Top producing containers グラフのク゚リ情報は以䞋ずなっおおり、ログの出力が倚い順に 10 個のコンテナの時系列デヌタを眺めるこずができたす。 topk(10, round(rate(log_logged_bytes_total[5m]))) Top producing containers in last 24 hours topk(10, sum(increase(log_logged_bytes_total[24h])) by (exported_namespace, podname, containername)) 䞀方で、こちらは24時間以内の増加情報をもずに、ログ出力が倚い順に 10 個のコンテナ情報をリストにしおいたす。 DaemonSet の定矩をみる どのような方法で確認しおいるかを芋おいきたす。DaemonSet の定矩をみたす。 $ oc describe ds logfilesmetricexporter Name: logfilesmetricexporter Selector: component=logfilesmetricexporter,logging-infra=logfilesmetricexporter,provider=openshift Node-Selector: kubernetes.io/os=linux Labels: app.kubernetes.io/component=logfilesmetricexporter app.kubernetes.io/instance=logfilesmetricexporter app.kubernetes.io/managed-by=cluster-logging-operator app.kubernetes.io/name=lfme-service app.kubernetes.io/part-of=cluster-logging app.kubernetes.io/version=5.8.0 component=logfilesmetricexporter implementation= logging-infra=logfilesmetricexporter pod-security.kubernetes.io/enforce=privileged provider=openshift security.openshift.io/scc.podSecurityLabelSync=false Annotations: deprecated.daemonset.template.generation: 1 Desired Number of Nodes Scheduled: 5 Current Number of Nodes Scheduled: 5 Number of Nodes Scheduled with Up-to-date Pods: 5 Number of Nodes Scheduled with Available Pods: 5 Number of Nodes Misscheduled: 0 Pods Status: 5 Running / 0 Waiting / 0 Succeeded / 0 Failed Pod Template: Labels: app.kubernetes.io/component=logfilesmetricexporter app.kubernetes.io/instance=logfilesmetricexporter app.kubernetes.io/managed-by=cluster-logging-operator app.kubernetes.io/name=lfme-service app.kubernetes.io/part-of=cluster-logging app.kubernetes.io/version=5.8.0 component=logfilesmetricexporter implementation= logging-infra=logfilesmetricexporter pod-security.kubernetes.io/enforce=privileged provider=openshift security.openshift.io/scc.podSecurityLabelSync=false Annotations: target.workload.openshift.io/management: {"effect": "PreferredDuringScheduling"} Service Account: logfilesmetricexporter Containers: logfilesmetricexporter: Image: registry.redhat.io/openshift-logging/log-file-metric-exporter-rhel9@sha256:daa8fa30560a787835f7f3fa6d584555ddf8f10beda023a1d747b1f7ab8e2d36 Port: 2112/TCP Host Port: 0/TCP Command: /bin/bash Args: -c /usr/local/bin/log-file-metric-exporter -verbosity=2 -dir=/var/log/pods -http=:2112 -keyFile=/etc/logfilemetricexporter/metrics/tls.key -crtFile=/etc/logfilemetricexporter/metrics/tls.crt -tlsMinVersion=VersionTLS12 -cipherSuites=TLS_AES_128_GCM_SHA256,TLS_AES_256_GCM_SHA384,TLS_CHACHA20_POLY1305_SHA256,ECDHE-ECDSA-AES128-GCM-SHA256,ECDHE-RSA-AES128-GCM-SHA256,ECDHE-ECDSA-AES256-GCM-SHA384,ECDHE-RSA-AES256-GCM-SHA384,ECDHE-ECDSA-CHACHA20-POLY1305,ECDHE-RSA-CHACHA20-POLY1305,DHE-RSA-AES128-GCM-SHA256,DHE-RSA-AES256-GCM-SHA384 Limits: cpu: 500m memory: 256Mi Requests: cpu: 200m memory: 128Mi Environment: <none> Mounts: /etc/logfilemetricexporter/metrics from lfme-metrics (ro) /var/log/containers from varlogcontainers (ro) /var/log/pods from varlogpods (ro) Volumes: varlogcontainers: Type: HostPath (bare host directory volume) Path: /var/log/containers HostPathType: varlogpods: Type: HostPath (bare host directory volume) Path: /var/log/pods HostPathType: lfme-metrics: Type: Secret (a volume populated by a Secret) SecretName: lfme-secret Optional: false Priority Class Name: system-node-critical Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal CreateObject 38m logfilemetricexporter CreateObject DaemonSet openshift-logging/logfilesmetricexporter Normal SuccessfulCreate 38m daemonset-controller Created pod: logfilesmetricexporter-hn9sm Normal SuccessfulCreate 38m daemonset-controller Created pod: logfilesmetricexporter-hb5hb Normal SuccessfulCreate 38m daemonset-controller Created pod: logfilesmetricexporter-v86x5 Normal SuccessfulCreate 38m daemonset-controller Created pod: logfilesmetricexporter-qwvqx Normal SuccessfulCreate 38m daemonset-controller Created pod: logfilesmetricexporter-8gkfx HostPath を利甚しお /var/log/containers や /var/log/pods のディレクトリ配䞋を確認しおいるようです。 ゜ヌスをみる ゜ヌスコヌドを探しおみたす。Red Hat Ecosystem Catalog で log file metric exporter を怜玢するず以䞋のコンテナむメヌゞにたどり着きたす。 https://catalog.redhat.com/software/containers/openshift-logging/log-file-metric-exporter-rhel9/6447991f3270b32a256c4e2a?gs=&q=log%20file%20metric&container-tabs=technical-information Technical Information のタブを開くず、゜ヌスコヌドは https://github.com/ViaQ/log-file-metric-exporter にあるこずがわかりたす。 ゜ヌスコヌドで実際に凊理をしおいそうなずころは、 watcher.go でした。 https://github.com/ViaQ/log-file-metric-exporter/blob/main/pkg/logwatch/watcher.go#L123 stat, err := os.Stat(path) if err != nil { return err } if stat.IsDir() { log.V(3).Info("Ignoring path given it is a directory", "path", path) return nil // Ignore directories } defer w.mutex.Unlock() w.mutex.Lock() lastSize, size := w.sizes[l], float64(stat.Size()) log.V(3).Info("Stats", "path", path, "lastSize", lastSize, "size", size) w.sizes[l] = size var add float64 if size > lastSize { // File has grown, add the difference to the counter. add = size - lastSize } else if size < lastSize { // File truncated, starting over. Add the size. add = size } stat 情報を取埗し、ファむルサむズを確認。前回より増えおいれば増分を远加。枛っおいたら新たなファむルずしお、サむズを远加ずいうこずを繰り返しおいたす。 この郚分がロヌテヌションを考慮したずいうこずなのでしょうか。 たずめ LogFileMetricExporter により分割された Exporter に぀いお確認をしたした。 分割されたのはコンテナが出力するログ量を蚈枬しおいたメトリクスです。ダッシュボヌドが定矩されおいたため、LogFileMetricExpoter リ゜ヌスを定矩しない堎合はグラフは衚瀺されたせんが、どのような倀が出力されるかを確認するこずができたした。 LogFileMetricExporter に぀いお䞍明点がなくなりすっきりしたした。これで幎を越せるでしょうか。
みなさん本圓にメリヌクリスマスRed Hatのさいずうです Ansible Advent Calendar 2024 の今幎最埌の蚘事です䟋幎最終日の蚘事では翌幎の予想をしおいるのですが昚日のよこちさんの 蚘事 で玹介されおいたずおりAWXのリニュヌアル工事が進行䞭で来幎の予想がさっぱり぀きたせんもう今幎は来幎の予想をあきらめたした来幎はおずなしく運呜を受け入れるのみです そういったわけで今日の蚘事では来幎の安定したAnsibleラむフに向けお開発環境をコンテナに移行しおみたずいうお話をしようかず思いたす 倧掃陀の時期です 僕はAnsibleの゚ンゞン郚分やモゞュヌルプラグむンの䞍具合の調査そしお修正を生業ずしおいたすその合間にansible.posixコレクションのメンテナずしおの仕事もしおいたす このメンテナずしおの仕事甚に開発環境を䜜っおいるのですがここ数幎の激務で心も開発環境もだいぶ荒れおきたので2025幎のアップストリヌム掻動に向けおコレクションの開発ずテストを行う環境を倧掃陀しおコンテナに移行しようず詊行錯誀しおいたす玆䜙曲折を経おそこそこ䜿い物になりそうな環境ができたのでここでご玹介しようず思いたす アドカレは毎幎曞いおたすが誰かの参考になりそうな蚘事は初めお曞くかもしれない Ansible Collectionの日垞的な開発テスト環境を䜜る 開発環境 RedHatterなのですが開発環境はMacOSですごめんなさい MacBook Pro 16むンチ (Apple M2 Pro / MEM 32GB) ゚ディタ: Visual Studio Code コンテナ環境: Podman Desktop このような環境の䞊に開発環境を構築しおいたすいやpodmanを䜿うならLinux(x86)ですよねMacOSずaarch64でわざわざ苊劎するこずもないわかりたすわかりたすよ しかしRed Hatは自由な瀟颚なので僕はMacOSで暮らしおたす自由䞇歳 ワヌクスペヌスを䜜成する たずは開発拠点ずなるVisual Studio Codeのワヌクスペヌス甚のディレクトリを䜜成したす以降はこのワヌクスペヌスである ansible_dev ディレクトリで䜜業したす % mkdir ansible_dev % cd ansible_dev Ansible Builderをむンストヌルする たずはカスタムコンテナをビルドするためにvirtualenv環境を䜜っおAnsible Builderをむンストヌルしたす % mkdir builder % cd builder % python3 -m venv venv % source venv/bin/activate (venv) % pip install -U pip (venv) % pip install ansible-builder 続いお execution-environment.yml を䜜成したす できるだけ特別なこずはせずに必芁ずなるパッケヌゞ(rsyncのようにsynchronizeモゞュヌルが必芁ずするようなもの)やPythonモゞュヌル(デバッグ甚のqなど)をむンストヌルする皋床にしおいたすAnsible NavigatorずAnsible-lintをむンストヌルしおいるくらい --- version : 3 images : base_image : name : quay.io/fedora/fedora:41 dependencies : ansible_runner : package_pip : ansible-runner ansible_core : package_pip : ansible-core python : - ansible-lint - ansible-navigator - bcrypt - passlib - pexpect - psutil - pypsrp - pywinrm - q - six system : - bind-utils [ platform : rpm ] - gcc [ platform : rpm ] - git [ platform : rpm ] - glibc-langpack-en [ platform : rpm ] - hostname [ platform : rpm ] - iputils [ platform : rpm ] - lsof [ platform : rpm ] - oniguruma-devel [ platform : rpm ] - plocate [ platform : rpm ] - podman [ platform : rpm ] - procps-ng [ platform : rpm ] - rsync [ platform : rpm ] - shellcheck [ platform : rpm ] - sshpass [ platform : rpm ] - sudo [ platform : rpm ] - tar [ platform : rpm ] - tree [ platform : rpm ] - traceroute [ platform : rpm ] options : package_manager_path : /usr/bin/dnf5 additional_build_steps : prepend_base : - RUN echo "Install mandatory packages:" - RUN $PKGMGR -y -q install python3 python3-pip python3-devel - RUN pip install --upgrade pip append_final : - ENV LANG en_US.UTF-8 - ENV LC_ALL en_US.UTF-8 - RUN echo "Create ansible user with sudo privilege:" - RUN useradd -m -s /bin/bash ansible && echo "ansible ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/ansible && chmod 0440 /etc/sudoers.d/ansible ... 開発テスト甚のコンテナ(ansible-dev-tool)をビルドする execution-environment.yml を利甚しおAnsible Builderでカスタムコンテナを構築したす (venv) % ansible-builder build -f execution-environment.yml -t quay.io/saito_hideki/ansible-dev-tools:1.0.0 --no-cache --prune-images (venv) % podman images REPOSITORY TAG IMAGE ID CREATED SIZE quay.io/saito_hideki/ansible-dev-tools 1.0.0 7de76c4274f6 58 seconds ago 1.06 GB quay.io/fedora/fedora 41 75628098827e 23 hours ago 194 MB (venv) % deactivate これでカスタムコンテナは完成ですquay.ioにpushしお必芁に応じお修正しおいくこずになるのでquay.ioにpushしおおきたす % podman push quay.io/saito_hideki/ansible-dev-tools:1.0.0 Visual Studio Codeのワヌクスペヌスファむルを䜜成する ansible_dev ディレクトリにもどっおワヌクスペヌスファむル(ansible_dev.code-workspace)を䜜成したす䞭身はpathだけです % cat << EOF > ansible_dev.code-workspace { "folders": [ { "path": "." } ] } EOF Visual Studio Code Dev Containers環境を蚭定する VIsual Studio CodeのDev Containersを利甚するので devcontainer.json を䜜成したす Ansible Navigatorではpodmanコンテナの実行環境を動かすのでpodman in podmanを想定した蚭定をrunArgsに蚭定しおいたすAnsible Builderで䜜成したカスタムコンテナを指定するのも忘れずに たたここではテスト環境ずしお準備しおある切られ圹のマネヌゞドノヌド3台(server0[012].example.com)をコンテナの/etc/hostsに远加するよう蚭定しおいたすこの蚭定を基本ずしお目的によっお蚭定を線集すればよさそうです % mkdir .devcontainer % cat << EOF > .devcontainer/devcontainer.json { "name": "ansible-dev-container-podman", "image": "quay.io/saito_hideki/ansible-dev-tools:1.0.0", "containerUser": "ansible", "runArgs": [ "--privileged", "--cap-add=CAP_SETUID", "--cap-add=CAP_SETGID", "--cap-add=CAP_MKNOD", "--cap-add=CAP_NET_RAW", "--cap-add=NET_ADMIN", "--cap-add=SYS_ADMIN", "--cap-add=SYS_RESOURCE", "--cap-add=CAP_AUDIT_WRITE", "--device=/dev/fuse", "--security-opt=seccomp=unconfined", "--security-opt=label=disable", "--security-opt=apparmor=unconfined", "--security-opt=unmask=/sys/fs/cgroup", "--userns=host", "--hostname=ansible-dev-container", "--add-host=server00.example.com:172.16.46.100", "--add-host=server01.example.com:172.16.46.101", "--add-host=server02.example.com:172.16.46.102" ], "mounts": [ ], "customizations": { "vscode": { "extensions": ["redhat.ansible"] } } } EOF Visual Studio Codeでワヌクスペヌスを開く 準備ができたらVisual Studio Codeで ansible_dev.code-workspace を開きたすワヌクスペヌスが開いおビルドしたカスタムコンテナが起動しおきたす ファむル => ファむルでワヌクスペヌスを開く => ansible_dev.code-workspace 右䞋に衚瀺されるダむアログボックスからコンテナヌで再床開くを遞択する VSCODE_DEV_CONTAINER タヌミナルから動䜜確認 Visual Studio Codeのタヌミナルを開くずコンテナ内のシェルが操䜜できるようになっおいたす母艊のワヌクスペヌスが眮かれおいる ansible_dev ディレクトリはコンテナの /workspaces/ansible_dev にマりントされおいたす [ansible@ansible-dev-container ansible_dev]$ cat /etc/fedora-release Fedora release 41 (Forty One) [ansible@ansible-dev-container ansible_dev]$ id uid=1000(ansible) gid=1000(ansible) groups=1000(ansible) [ansible@ansible-dev-container ansible_dev]$ pwd /workspaces/ansible_dev 動䜜確認もかねおansible系のコマンドのバヌゞョンを確認しおみたす $ ansible --version ansible [core 2.18.1] config file = None configured module search path = ['/home/ansible/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules'] ansible python module location = /usr/local/lib/python3.13/site-packages/ansible ansible collection location = /home/ansible/.ansible/collections:/usr/share/ansible/collections executable location = /usr/local/bin/ansible python version = 3.13.1 (main, Dec 9 2024, 00:00:00) [GCC 14.2.1 20240912 (Red Hat 14.2.1-3)] (/usr/bin/python3) jinja version = 3.1.5 libyaml = True [ansible@ansible-dev-container ansible_dev]$ ansible-navigator --version ansible-navigator 24.12.0 [ansible@ansible-dev-container ansible_dev]$ ansible-runner --version 2.4.0 [ansible@ansible-dev-container ansible_dev]$ ansible-lint --version ansible-lint 24.12.2 using ansible-core:2.18.1 ansible-compat:24.10.0 ruamel-yaml:0.18.6 ruamel-yaml-clib:None podman in podmanに察応しおいるはずなので念のためpodmanコマンドも機胜するかを確認しおおきしょう [ansible@ansible-dev-container ansible_dev]$ podman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES [ansible@ansible-dev-container ansible_dev]$ podman images REPOSITORY TAG IMAGE ID CREATED SIZE いけおそう Playbookの動䜜確認もしおみたす ansible.cfginvenotryファむル(inventory/hosts)そしおテスト甚のPlaybook(playbook/ping.yml)を準備したしょう ansible.cfg [defaults] log_path = ./logs/ansible.log host_key_checking = False collections_path = ./collections inventory/hosts [testserver] server00.example.com server01.example.com server02.example.com [testserver:vars] ansible_user='testuser' ansible_password='****************' playbook/ping.yml --- - name : Ping all hosts hosts : all tasks : - name : Ping all hosts ansible.builtin.ping : テスト甚のPlaybookを実行しおみたす [ansible@ansible-dev-container ansible_dev]$ ansible-playbook -i inventory/hosts playbook/ping.yml PLAY [Ping all hosts] ************************************************************************************************************************** TASK [Gathering Facts] ************************************************************************************************************************* ok: [server02.example.com] ok: [server01.example.com] ok: [server00.example.com] TASK [Ping all hosts] ************************************************************************************************************************** ok: [server00.example.com] ok: [server02.example.com] ok: [server01.example.com] PLAY RECAP ************************************************************************************************************************************* server00.example.com : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 server01.example.com : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 server02.example.com : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 Ansible Navigatorでコンテナ実行環境をテストする せっかくpodman in podman環境を準備したのでAnsible Navigatorもテストしおみたす実行環境のコンテナずしお awx-ee を指定しおみたした ansible-navigator.yml --- ansible-navigator: execution-environment: image: "quay.io/ansible/awx-ee:latest" logging: level: debug append: False file: ./logs/navigator.log Ansible Navigatorでテスト甚Playbookを実行しおみたす [ansible@ansible-dev-container ansible_dev]$ podman images REPOSITORY TAG IMAGE ID CREATED SIZE [ansible@ansible-dev-container ansible_dev]$ ansible-navigator run playbook/ping.yml --mode stdout -i inventory/hosts $ ansible-navigator run playbook/ping.yml --mode stdout -i inventory/hosts ---------------------------------------------------------------- Execution environment image and pull policy overview ---------------------------------------------------------------- Execution environment image name: quay.io/ansible/awx-ee:latest Execution environment image tag: latest Execution environment pull arguments: None Execution environment pull policy: tag Execution environment pull needed: True ---------------------------------------------------------------- Updating the execution environment ---------------------------------------------------------------- Running the command: podman pull quay.io/ansible/awx-ee:latest Trying to pull quay.io/ansible/awx-ee:latest... Getting image source signatures Copying blob da67aebfb456 done | ... Copying config 9083553381 done | Writing manifest to image destination 90835533812f20b995b153861ab5806f58aa184856559380acc58b3910166b8e PLAY [Ping all hosts] ********************************************************** TASK [Gathering Facts] ********************************************************* ok: [server02.example.com] ok: [server00.example.com] ok: [server01.example.com] TASK [Ping all hosts] ********************************************************** ok: [server00.example.com] ok: [server01.example.com] ok: [server02.example.com] PLAY RECAP ********************************************************************* server00.example.com : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 server01.example.com : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 server02.example.com : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 念のためコンテナ実行環境であるawx-eeがダりンロヌドされおいるこずを確認しおみたす [ansible@ansible-dev-container ansible_dev]$ podman images REPOSITORY TAG IMAGE ID CREATED SIZE quay.io/ansible/awx-ee latest 90835533812f 6 hours ago 2.2 GB ちゃんずできおそう良い感じだ今回ご玹介したワヌクスペヌスのディレクトリ構造(Level2たで)は以䞋のような感じです % tree -L 2 . ├── ansible-navigator.yml ├── ansible.cfg ├── ansible_dev.code-workspace ├── builder │   ├── context │   ├── execution-environment.yml │   └── venv ├── collections │   └── ansible_collections ├── inventory │   └── hosts ├── logs │   ├── ansible.log │   └── navigator.log └── playbook └── ping.yml たずめ 今回ご玹介したように開発環境をコンテナに移行するこずにしたしたansible-testコマンドのコンテナランタむムでのテストがただうたく動䜜しなかったりMacOSずpodmanずの組み合わせゆえの面倒くささなどはありたすがその郜床察凊しながらアップデヌトがあればこの堎でシェアしおいきたいず思っおいたす(いたのずころ) 2025幎はこのコンテナ環境で暮らしながらアップストリヌムに貢献する時間をもう少し䜜りたいなそれではみなさんメリヌクリスマス&ハッピヌニュヌむダヌそしおHappy Automating! :)
【2026幎1月远蚘】最新の情報を元に内容をアップデヌトしたした こんにちは、Red HatでOpenShift関連のプリセヌルスをしおいる北村です。 前回の蚘事でDeveloper Hubのむンストヌルが完了したので、今回はGitHubず連携しおDeveloper Hubの認蚌を実装したす。 【第1回】Developer Hubをむンストヌルしおみよう 【第2回】GitHubを䜿甚した認蚌を実装しよう ←この蚘事 【第3回】GitLabを䜿甚した認蚌を実装しよう 【第4回】Componentを䜜成・登録しよう 【第5回】Software Templateを䜿っおアプリのデプロむをセルフサヌビス化しよう 【第6回】TechDocsを䜜成・登録しよう 【第7回】Golden Pathの実装をマスタヌしよう - 前線 【第8回】Golden Pathの実装をマスタヌしよう - 埌線 前回の状態 前回ログむン画面たで衚瀺されるこずを確認したしたが、この状態でGitHubの"Sign In"を遞択するず、以䞋のような゚ラヌが衚瀺されたす。 これはただGitHubずの連携情報がDeveloper Hubに蚭定されおいないために発生しおいたす。 ではGitHub認蚌を実装しおいきたしょう。 Developer Hub GitHub 認蚌 実装手順 GitHubでの認蚌を実珟するために、GitHub Appの䜜成を行いたす。 ここでGitHubの個人アカりントでGitHub Appを蚭定するずそのナヌザヌのみ認蚌可胜になりたすが、Organizationで登録するこずで、そのOrganization配䞋のナヌザヌ党員が認蚌可胜になりたす。 Developer Hubは耇数の開発メンバヌでの利甚を想定されるケヌスが倚いので、ここでは新たにOrganizationを䜜成しお、そのGitHub Appを登録したす。 GitHubの蚭定 GitHub Organizationは以䞋の公匏URLを参考に䜜成しおください。おそらくすでにOrganizationが存圚するケヌスが倚いので、ここでは手順を割愛したす。 新しい Organization をゼロから作成 - GitHub ドキュメント 今回は"rhdh-practice"ずいうOrganizationを䜜成したした。 次にGitHub Appを䜜成しおいきたす。OrganizationのペヌゞからSetttings→Developer settings→GitHub Apps→New GitHub Appを遞択したす。 以䞋の内容を入力したす。 GitHub App name 任意の倀 Homepage URL https:// (Developer HubのURL) Callback URL https:// (Developer HubのURL) /api/auth/github/handler/frame Webhook URL https:// (Developer HubのURL) (Webhook) Secret 任意の倀 Permissions 以䞋の項目にRead-onlyを付䞎 Repository permissions - Commit statuses - Dependabot alerts - Deployments - Pull Requests - Webhooks Organization permissions - Members 以䞋の項目にRead and writeを付䞎 Repository permissions - Administration - Contents - Workflows Where can this GitHub App be installed? Only on this account 入力が完了したらCreate GitHub Appを遞択したす。 するずGitHub Appが䜜成され、App ID , Client IDが払い出されたす。 そのたたGenerate a new client secretを遞択するず画面䞊にClient Secretが払い出されるため、 App ID , Client ID , Client Secret をコピヌしお手元に残しおおきたしょう。 そしお画面の䞋の方にいき、 Generate a private key を遞択するず、Private Keyが払い出され、pemファむルがダりンロヌドされたす。この䞭身を埌ほど䜿いたす。 ここたで完了したら、最埌に䜜成したGitHub appをOrganizationにむンストヌルしたす。巊偎のメニュヌから Insatall App を遞択しおむンストヌルを実行したす。 これでGitHub偎の準備は完了したした。 Developer Hub の蚭定 GitHub偎の蚭定が完了したので、次にDeveloper Hub偎の蚭定を行いたす。 たずはGitHub Appの情報を、前回の蚘事で䜜成した secrets-rhdh.yaml に反映したす。 GITHUB_PRIVATE_KEY_FILE にはpemファむルの䞭身を蚘茉したす。 secrets-rhdh.yaml apiVersion : v1 kind : Secret metadata : name : secrets-rhdh namespace : rhdh stringData : # Backstage Settings BASE_URL : "https://backstage-developer-hub-rhdh.apps.<ROSAドメむン>" BACKEND_SECRET : "<バック゚ンド認蚌キヌ>" SESSION_SECRET : "<セッションシヌクレット>" # 任意。 node -e "console.log(require('crypto').randomBytes(64).toString('base64'))"などで取埗 # GitHub Settings AUTH_GITHUB_CLIENT_ID : "<GitHub App Client ID>" AUTH_GITHUB_CLIENT_SECRET : "<GitHub App Client Secret>" GITHUB_APP_ID : "<GitHub App ID>" GITHUB_APP_CLIENT_ID : "<GitHub App Client ID>" # AUTH_GITHUB_CLIENT_IDず同じ倀でOK GITHUB_APP_CLIENT_SECRET : "<GitHub App Client Secret>" # AUTH_GITHUB_CLIENT_SECRETず同じ倀でOK GITHUB_WEBHOOK_URL : "https://backstage-developer-hub-rhdh.apps.<ROSAドメむン>" GITHUB_WEBHOOK_SECRET : "<Webhook Secretに蚭定した任意の倀>" GITHUB_PRIVATE_KEY_FILE : | -----BEGIN RSA PRIVATE KEY----- [ PRIVATE_KEY_PLACEHOLDER ] -----END RSA PRIVATE KEY----- このSecretをデプロむしたす。 oc apply -f secrets-rhdh.yaml 次にDeveloper Hubの蚭定ファむル app-config-rhdh.yaml を線集したす。以䞋のように、 auth , integrations , signInPage の蚭定を远加したす。 auth : Developer Hubの認蚌に関する蚭定 integrations : GitHubなどの倖郚システムずの統合連携に関する蚭定 signInPage : ログむンするずきに衚瀺されるサむンむンペヌゞを指定する蚭定 app-config-rhdh.yaml kind : ConfigMap apiVersion : v1 metadata : name : app-config-rhdh namesapce : rhdh annotations : rhdh.redhat.com/backstage-name : developer-hub data : app-config-rhdh.yaml : | backend : auth : externalAccess : - type : legacy options : secret : “${BACKEND_SECRET}” subject : legacy-default-config baseUrl : ${BASE_URL} cors : origin : - ${BASE_URL} app : title : Red Hat Developer Hub baseUrl : ${BASE_URL} analytics : segment : enabled : false auth : environment : production session : secret : ${SESSION_SECRET} providers : github : production : clientId : ${AUTH_GITHUB_CLIENT_ID} clientSecret : ${AUTH_GITHUB_CLIENT_SECRET} signInPage : github integrations : github : - host : github.com apps : - appId : ${GITHUB_APP_APP_ID} clientId : ${GITHUB_APP_CLIENT_ID} clientSecret : ${GITHUB_APP_CLIENT_SECRET} webhookUrl : ${GITHUB_APP_WEBHOOK_URL} webhookSecret : ${GITHUB_APP_WEBHOOK_SECRET} privateKey : | ${GITHUB_APP_PRIVATE_KEY} このConfigmapをデプロむしたす。 oc apply -f app-config-rhdh.yaml するずDeveloper Hub Podが再起動されるので、立ち䞊がるたで埅っおからDeveloper Hubにアクセスしおみたしょう。 こんな感じで、Guestのログむン項目がなくなり、GitHubのみでのログむン画面になりたした。 Sign Inを遞択しおログむンしおみるず... ゚ラヌが出るのだが😡 はい、実はただ他に察応しなければならないこずがありたす。 GitHubからUser情報を取埗する Developer Hubではナヌザヌ認蚌の際、Auth Provider先述で蚭定しおきたものによる認蚌行為に加えお、Developer Hub内に玐付け可胜なUser Entityが存圚するかどうかもチェックしたす。 先ほどの゚ラヌはGitHubずの認蚌連携自䜓はできたものの、Developer Hub偎で玐づけるべき User ずいう ゚ンティティ(Entity) が存圚しないために発生しおいる゚ラヌになりたす。 なおDeveloper Hubにおける Entity に぀いおは、次回の蚘事で詳しく説明しおいきたす。 そしおこのUser Entityずいうのは、Developer HubのPluginを掻甚するこずで、GitHubのOrganizationからナヌザヌ情報を取埗するこずができたす。 むメヌゞずしおは以䞋のような圢になりたす。 では蚭定しおいきたしょう。 たず、GitHub Organizationから User / Team 情報を読み取り、Developer Hubに User / Group Entity を䜜成する GitHub Org ずいうPluginを導入したす。 前回の蚘事でしれっず䜜成した dynamic-plugins-rhdh.yaml にdynamic pluginのむンストヌル蚭定を蚘入したす。 plugins : Developer HubにむンストヌルするPluginの情報を蚘茉する。 package にはdynamic pluginのパスを蚘茉する disablded を false にするこずで、Podのinit凊理時にdynamic pluginをむンストヌルする。 今回は GitHub Org Pluginをむンストヌルするので、 GitHub Org Pluginが栌玍されおいるパスを指定しおいたす。 Developer Hubにあらかじめ栌玍されおいるdynamic pluginの䞀芧やパスは以䞋の公匏ドキュメントに蚘茉がありたす。 動的プラグイン参照 | Red Hat Developer Hub | 1.8 | Red Hat Documentation dynamic-plugins-rhdh.yaml kind : ConfigMap apiVersion : v1 metadata : name : dynamic-plugins-rhdh namespace : rhdh annotations : rhdh.redhat.com/backstage-name : developer-hub data : dynamic-plugins.yaml : | includes : - 'dynamic-plugins.default.yaml' plugins : # GitHub Plugins - package : ./dynamic-plugins/dist/backstage-plugin-catalog-backend-module-github-org-dynamic disabled : false 次に app-config-rhdh.yaml に蚭定を远蚘したす。 Developer Hubでは app-config に適切な蚭定を蚘述するず、連携先のシステム今回で蚀うずGitHubそのものやGitリポゞトリ内にあるyamlファむルから、内郚に登録するEntity情報を取埗するこずができたす。 なお、このEntityを登録するための仕組みをDeveloper Hubでは Catalog ずいいたす。 Catalog ず Entity は厳密には別物ですが、ほが同じものず捉えおもらっお構いたせん。 今回は以䞋の項目を远蚘したしょう。 catalog : Developer Hubにさたざたな Entity(Catalog) を登録するための蚭定 catalog.providers : Entity(Catalog) のデヌタを取埗するための Provider(GitHubやGitLabなど) に関する蚭定 catalog.providers.githubOrg : 特定のGitHub Organization内のUserやTeam情報をもずにDeveloper Hub偎に User / Group Entityを䜜成するための蚭定 app-config-rhdh.yaml kind : ConfigMap apiVersion : v1 metadata : name : app-config-rhdh namespace : rhdh annotations : rhdh.redhat.com/backstage-name : developer-hub data : app-config-rhdh.yaml : | backend : ...omit... app : ...omit... auth : ...omit... signInPage : github integrations : ...omit... catalog : providers : githubOrg : githubUrl : 'https://github.com/${GITHUB_ORG}' id : production orgs : [ '${GITHUB_ORG}' ] schedule : frequency : PT60S initialDelay : PT30S timeout : PT120S schedule フィヌルドは、GitHubぞ定期的にアクセスしおOrganizationの情報を取埗するためのパラメヌタです。 ここはpluginによっお蚘述方法が倉わりたす。今回の GitHub Org Pluginでは ISO 8601 Duration 圢匏 で蚘述する必芁がありたす。 ISO 8601 Duration 圢匏の曞き方は以䞋を参照ください。 P2Y3DT6H8M!? この暗号を解読するための ISO 8601 duration specification とは | 株式会社AMG Solution 今回は実装䞭のため、1分ごずにGitHub Organizationの情報を取埗するような蚭定にしおいたす。 安定皌働埌は1時間に䞀回皋床に倉曎するこずをおすすめしたす。 最埌に secrets-rhdh.yaml も修正しお GITHUB_ORGANIZATION を远加しおおきたしょう。 secrets-rhdh.yaml apiVersion : v1 kind : Secret metadata : name : secrets-rhdh namespace : rhdh stringData : ...omit... GITHUB_ORG : "<今回䜿うGitHub Organization名>" これらをデプロむしたす。 oc apply -f app-config-rhdh.yaml -f secrets-rhdh.yaml -f dynamic-plugins-rhdh.yaml これらの蚭定によっお、Developer Hubが定期的にGitHubぞアクセスし、GitHub Organization内のUserやTeamの情報を User Group Entityずしお内郚に登録する凊理が行われたす。 Podの再起動埌、ログむンしおみるず、無事にHOME画面が衚瀺されたす。 ちなみにこの状態で画面巊䞋の Settings を遞択するず、ちゃんずGitHubのナヌザヌでDeveloper Hubにログむンできおいるこずがわかりたす。 おわりに 今回はGitHubず連携しおDeveloper Hubの認蚌を実装する方法を解説したした。 次回の蚘事では、同様の認蚌䜜業をGitLabを䜿っお実装しおみたす。乞うご期埅
はじめに Ansible - Qiita Advent Calendar 2024 - Qiita の12/23 の蚘事になりたす(4時間遅れ) Red Hatでコンサルタントをしおいる山䞋です。 今回の蚘事では2024幎10月にリリヌスされたAAP 2.5 でアップデヌトされたEvent-Driven Ansible (EDA) の新機胜を玹介させおいただきたす。 1.むベントのルヌティングがさらに簡単に AAP 2.5からWebhookを利甚したむベントルヌティングを簡玠化するこずができる、「むベントストリヌム」ずいう新しい仕組みが導入されたした。 これにより、むベント゜ヌスを耇数のルヌルブックに接続するプロセスが倧幅に効率化されたす。 抑えおおきたいポむント 単䞀の゚ンドポむントで管理が可胜になりたした。 以前は、ルヌルブックごずに新しい゚ンドポむントを蚭定する必芁がありたしたが、今では1぀の゚ンドポむントで耇数のルヌルブックに察応できたす。 副次的ではありたすが、ファむアりォヌルに開けるポヌト数が枛り、保守䜜業も簡単になりたす。 あらかじめ甚意された各皮サヌビス向けのWebhook察応が蚭定をより簡朔にしおくれたす。 䟋ServiceNow、゜ヌスコヌド管理SCMツヌル、監芖ツヌルなど。 掻甚䟋 ネットワヌク障害のアラヌト数が閟倀を超えた際、自動でデヌタセンタヌをフェむルオヌバヌ。 新しいコヌドをリポゞトリにプッシュした際、Webサヌバヌを自動リロヌド。 䞀定期間利甚されおいない仮想マシンを自動でアヌカむブし、リ゜ヌスを回収。 2. 高スケヌラビリティず高可甚性 AAP 2.4ではHAオプションが提䟛されおいたせんでしたが、AAP 2.5から耇数のEvent-Driven Ansibleノヌドをむンストヌルできるようになり、高可甚性を実珟したした。 これにより、システム障害が発生しおも自動化ゞョブが継続され、業務が止たるリスクを軜枛するこずができるようになりたす。 EDAはずおも䟿利な半面、自動化が進むず共に重芁床もたすコンポヌネントです。 䟋えば自動的に障害を怜知しおフェむルオヌバヌをするような凊理をEDAに行わせおいる堎合にEDAが実は障害で動䜜しおおらずWebhookを受け取っおいなかった、などずいうこずがあれば倧問題に発展しおしたいたす。 そういった問題を解決するためにAAP 2.5ではHAサポヌトを行い、堅牢なシステムぞず進化を遂げたした。 抑えおおきたいポむント スケヌラブルなルヌルブック運甚。 氎平スケヌリングにより、負荷が高いナヌスケヌスにも察応可胜。 障害発生時のリスクを䜎枛。 ミッションクリティカルなルヌルブックも安党に運甚可胜。 3. セキュリティず運甚性の匷化 AAP2.5からヌルブックで䜿甚する認蚌情報やVault倉数を安党に管理できるようになり、暗号化されたデヌタを掻甚で切るようになりたす。 たたPlatform Gatewayの導入によりAAP党䜓で統䞀された認蚌メカニズムを導入し管理を簡玠化し、統合されたRBACの適甚がEDAにも行えるようになりたした。 䞻なメリット ゚ンタヌプラむズ環境での安党性向䞊 機密情報を暗号化し、セキュリティリスクを䜎枛。 4. 実際に動かしおみた これから新たに远加されたEvent streamを䜜成しおみたす。 Event streamを䜜成するためには認蚌情報の登録が必芁になりたす。 今回の䟋ではBasic認蚌を远加しおいたす。 認蚌情報の䜜成 次にEvent streamを䜜成しおいきたす。今回はBasic認蚌のEvent stream typeを遞択したす。 Event streamの䜜成 䜿甚できるEvent stream typeの䞀芧はこちらから確認できたす。 Event streamでサポヌトしおいるEvent stream type Event streamが䜜成されるずEndpointが払い出されたす。 Event streamのendpoint このEndpointに察しおRequestを投げるこずでJob templateの実斜が可胜になりたす。 次にEvent streamに玐づけるrulebookの登録を行いたす。 rule bookは以䞋のコヌドを甚意したした、内容はいたっおシンプルでEvent stream「basic」に察しおRequestが来たらevent.payload.messageをパヌスし䞭に蚘茉されおいる内容が"Ansible is super cool"であった堎合は「Demo Job Template」を実斜するず蚀ったものです。 --- - name: Listen for events on a webhook hosts: all sources: - name: 'basic' rules: - name: Say Nyahello condition: event.payload.message == "Ansible is super cool" action: run_job_template: name: Demo Job Template organization: Default こちらのrulebookをGUIから登録しおいきたす。 AAP2.5の新たなポむントはEvent stream(s)に先ほど䜜成したbasicを指定しおいるずころになりたす。 新機胜の玹介でもさせおいただいた通り、耇数のrulebookずEvent streamを1:nの関係で玐づけるこずができるようになりたした。 rulebookの登録 早速先ほど䜜成したEndpointに察しおRequestを発行しおみたす。 curl -k -X POST https://aap4.local:443/eda-event-streams/api/eda/v1/external_event_stream/24bba765-d2d2-47a6-a343-d6fb54c92f5f/post/ -u "admin:admin" -H "Content-Type: application/json" -d '{"message": "Ansible is super cool"}' 実際にEventが実斜されたこずが確認できたした Say Nyahello 5. たずめ 今回のAAP 2.5でのEDAの進化により、゚ンタヌプラむズ環境でのむベント駆動型自動化がさらに匷力か぀安党に運甚できるようになりたした。Webhookを掻甚した効率的なむベントルヌティング、高可甚性のアヌキテクチャ、そしおセキュリティ管理の匷化により、耇雑なナヌスケヌスにもシンプルな構成で察応可胜になったず思いたす これらの新機胜を掻甚し、運甚の効率化ず安定性を高めおみおはいかがでしょうか
はじめに 本蚘事は、OpenShift Advent Calendar 2024 の12月23日の蚘事です。 皆様、こんにちは レッドハットのミニチュア工堎の工堎長、倧塚から情報をお届けしたす。 出展: むラストや レッドハットでは、オフィスにミニチュア工堎を導入し、IT情報技術ずOT運甚技術の技術を融合した䟿利な゜リュヌションを創出しおいきたす。 実際に工堎が動いおいる様子など、詳现は以䞋の蚘事をご参照ください。 rheb.hatenablog.com ご挚拶 レッドハットのミニチュア工堎、工堎長の倧塚ず申したす。 普段は、補造業のお客様を䞭心にプリセヌルス掻動をしおいたす。 ハヌドりェアや Edge が倧奜きなこずがご瞁ずなり、工堎長をやらせおもらっおいたす。 ミニチュア工堎を題材ずした情報やメンテナンス方法なども発信しおいきたすので、どうぞよろしくお願いしたす。 ミニチュア工堎ずは ミニチュア工堎は、ドむツ発祥の fischertechnik 瀟 が提䟛しおいる、実際の補造珟堎で利甚されおいる制埡機噚 (PLCプログラマブル・ロゞック・コントロヌラ) を接続し、リアルな生産ラむンをレゎブロックで忠実に再珟したものです。 芋た目にむンパクトがあり、粟巧に䜜られたミニチュア工堎は、倧人から子䟛たで思わず足を止め、興味接々でじっくり芋おくれたす。 動きのある仕組みやリアルな制埡システムが、補造業の魅力やテクノロゞヌぞの奜奇心を匕き出し、むベントや展瀺䌚でも倧きな泚目を集めおいたす。 むベントでの展瀺をきっかけに、倚くの方々がミニチュア工堎の魅力に匕き蟌たれ、実際に賌入される䌁業様も増えたず感じおいたす。 ミニチュア工堎 PLC ミニチュア工堎のコンセプト ミニチュア工堎は、単なる「簡単・すぐにできる」ずいったお気軜なアむテムではなく、工孊の基瀎や補造技術を深く孊ぶための高床な教育商材です。リアルな生産ラむンを暡した構造やメカニズムが搭茉されおおり、組み立おやメンテナンスを通しお実践的な知識や技術を習埗できたす。 組み立おの説明曞が存圚しないため、郚品が倖れたり緩んだりした堎合、自ら考え、詊行錯誀しながら解決策を芋぀ける必芁がありたす。この過皋で、単に手を動かすだけでなく、論理的思考力や応甚力、創造的なアむデアが自然ず逊われたす。さらに、珟堎さながらの問題解決を繰り返すこずで、実際の補造珟堎で求められる課題解決胜力や耐久性のある゚ンゞニアリングスキルが身に぀きたす。 このように、ミニチュア工堎は単なる孊習ツヌルにずどたらず、次䞖代の゚ンゞニアや技術者の育成、さらにはリヌダヌシップやチヌムワヌクの向䞊にも貢献する、非垞に䟡倀のあるものず感じおいたす。 ミニチュア工堎の利甚䟡倀 ミニチュア工堎は、補造珟堎のトレヌニングツヌルや教育コンテンツずしおの掻甚はもちろん、瀟内の啓蒙掻動や技術展瀺䌚でのデモにも最適です。さらに、IoTや゚ッゞコンピュヌティング、AI技術の導入シミュレヌションずしおも利甚でき、珟堎改善や新技術の怜蚌を効率的に行えたす。 たた、顧客向けプレれンテヌションや技術研修でのデモを通じお、スマヌトファクトリヌの抂念や自動化技術の魅力を盎感的に䌝えるこずができ、瀟内倖の理解促進や技術浞透に倧きく貢献できるず感じおいたす。 特に実物を利甚したデモは非垞に効果的で、資料だけでは䌝わりにくい郚分やモダモダを解消しおくれるず思いたす。 ミニチュア工堎のメンテナンス ミニチュア工堎は、動かせば動かすほど実際の補造珟堎さながらのメンテナンスが必芁になりたす。 特に、摩耗しやすい箇所や可動郚分には、定期的にシリコンスプレヌを吹き付けお、スムヌズな動きず長寿呜化を維持する必芁がありたす。 シリコンスプレヌは、最滑性が高くゎミやホコリが付着しにくいため、頻繁に皌働させるミニチュア工堎に最適です。 䞀方で、グリスを䜿甚するず、時間が経぀に぀れ固圢のゎミやホコリを巻き蟌んでしたい、動䜜䞍良や郚品の劣化を匕き起こす可胜性がありたす。そのため、シリコンスプレヌによる定期的なメンテナンスが掚奚されおいたす。 こうしたメンテナンスを行うこずで、機械工孊の基瀎や保守管理の重芁性を䜓感し、実際の生産珟堎で必芁ずされる運甚スキルや問題解決胜力が自然に身に぀けるこずができたす。 先日、 Edge Tech+ 2024 のむベントに出展した際、オフィスから珟地ぞ移動した埌、ミニチュア工堎の搬送甚アヌムが途䞭たでしか動かないトラブルが発生したした。 その際は、郚品の調達が間に合わなかったため、瞬間接着剀を䜿甚しお埩旧を詊み、なんずか堎をしのぎたした。 瞬間接着剀を䜿甚する際は、爪楊枝の先端に液䜓を少量付け、バリが発生しないよう泚意しないず、アヌムが完党に動かなくなっおしたうため、现心の泚意が必芁です このような経隓を積むこずで、臚機応倉な察応力や、どんな状況でも「䜕ずかする」ずいう匷い気持ちも鍛えるこずができたす。 たずめ 本皿では、レッドハットがミニチュア工堎を導入した背景や、掻甚方法に぀いおご玹介したした。 ミニチュア工堎は、補造業のリアルな課題や゜リュヌションを䜓感できるだけでなく、゚ッゞコンピュヌティングや自動化技術、AI連携の可胜性を芖芚的に理解できる教育・デモンストレヌションツヌルずしおも非垞に効果的です。 「実際に芋おみたい」「動かしおみたい」ず感じた方は、ぜひレッドハットのオフィスぞお越しください 次回は、最新の画像AI技術を組み蟌んだミニチュア工堎ぞずアップデヌト予定です。AIによるリアルタむム怜品や異垞怜知など、より高床なスマヌトファクトリヌ䜓隓を創出いたしたすので、どうぞご期埅ください
1. はじめに 2. IT/OT融合の動向 IT情報技術ずOT運甚技術の「融合」ずは レッドハットの取り組み PLCを゜フトりェアで定矩する ①PLCのハヌド故障時の駆け぀け保守のコスト削枛 ②ハヌドりェア集玄によるハヌドりェアコストの削枛や、配線倉曎のしやすさの向䞊 ③倉皮倉量生産の生産胜力の向䞊!? そしお、劄想は尜きない... Linux Foundation配䞋に「margo」蚭立 3. ゜フトりェアファヌストでミニチュア工堎をスマヌト化しおみよう ミニチュア工堎に぀いお簡単に解説 1. 自動倉庫 2. 搬送ロボット 3. 加熱装眮 4. 研磚装眮 5. 仕分け装眮 デモの解説 アプリのむンストヌル アプリの蚭定䜜業の自動化 ITシステムず蚭備の連携 たずめ 1. はじめに 本蚘事は、OpenShift Advent Calendar 2024 の12月23日の蚘事です。 みなさん、こんにちは。 ゜リュヌションアヌキテクトの小野です。 ゚ッゞコンピュヌティング厚です。 突然ですが  我々は぀いにオフィスに工堎を導入したした どヌん おもちゃのミニチュアですが、実際の工堎で䜿甚されおいるPLCずいう蚭備で動䜜するようになっおいたす。 いや〜、ハヌドりェアっお、栌奜良いですね この工堎の導入の背景には、昚幎、ドむツのずある補造業のお客様の工堎を芋孊させおいただいたこずにありたす。その工堎がずおも刺激的で、その知芋を日本に持ち垰っお、みなさたに日本でも簡単に䜓隓しおもらえる環境を䜜れないかな、ず思ったのがきっかけです。 昚今、補造業においおも、垂堎のニヌズや䞖界情勢の倉化ぞ臚機応倉に察応するこずが求められおいたす。 その䞭で、埓来の”カむれン”による生産性向䞊に加えお、柔軟性や持続可胜性の向䞊には、デゞタル技術の掻甚が䞍可欠です。リヌン生産によるカむれンを継続するだけでは、どうしおも限界がありたす。 そこで、IoTやAIなどのITの技術ず、ロボットなどに代衚されるOTOperational Technologyの技術をシヌムレスに統合した、 IT/OT融合 、ずいう考え方が着目されおいたす。 本蚘事では、 IT/OT融合の定矩 ず、 䞖の䞭の動向を俯瞰 した䞊で、僕たちが導入したミニチュア工堎を通じお、 レッドハットの実珟するIT/OT融合の䞖界の片鱗を簡単に䜓隓 いただきたいなず思いたす。 本蚘事が、みなさんのIT/OT融合のむメヌゞを具䜓化するお圹立ちができたら幞いです。 2. IT/OT融合の動向 IT/OT融合ずいうキヌワヌドに぀いお、むンタヌネット䞊でさたざたな蚘事が存圚したす。 関係者の方は芋聞きする機䌚も倚いんじゃないでしょうか。 ただ、僕自身、この蚀葉を芋お思ったのは、「融合ず連携の違いっおなんだろう」ずいうこずです。ネットでさたざたなスマヌトファクトリヌの蚘事を目にしたす。でも、これっお、融合なのかな、ず。ここ数幎ずっず考えおきたした。 そこで、前述のドむツ出匵の䜓隓も螏たえお自分なりに敎理しおみたいず思いたす。 IT情報技術ずOT運甚技術の「融合」ずは IT/OT「融合」 融合ずいうからには、 それぞれの独立した領域を保ちながら、デヌタやシステムの䞀郚を「共有」しお、 業務の効率化や生産性の向䞊を目的に、究極的にはITずOTの双方のスペシャリティを持った同䞀たたは仮想的なチヌムで掚進するこず くらい蚀っおも良いじゃないでしょうか。 䞀方で、IT/OT「連携」ずいうず、なんずなく、ITのチヌムずOTのチヌムがそれぞれ疎結合な印象を受けたす。融合ず連携では、埮劙にゎヌルが違う気がするんです。 連携のゎヌルは、 ITずOTがそれぞれの「独自性を保ちながら協力する」 こず であるのに察し、 融合は、 ITずOTの境界がなくなり、䞀䜓化したシヌムレスなシステムやプロセスずしお機胜する状態を目指す こず  なむメヌゞです。 もう少し蚀うず、 連携のゎヌルは、 業務の効率化や迅速な意思決定 融合のゎヌルは、 より高床な自埋化や、スマヌトファクトリヌなどの先進的なシステムの実珟 にあるず蚀えたす。 みなさんは、「連携」ですかそれずも、「融合」ですか ちなみに、IT/OT融合なOT補品ずは、もはやITの圱を感じるこずのないくらい圓たり前にITが溶け蟌んでるOT補品、ずいうこずなのかも...汗 レッドハットの取り組み こんなIT/OT融合の取り組みにおいお、レッドハットは䜕ができるのか僕らずしおは、やっぱり、みなさんにもっずアプリケヌションに集䞭しお欲しいず思うわけです。 今幎、「 ゜フトりェアファヌスト 」ずいう曞籍の第二版が出版されたりしたした。ハヌドず゜フトが密結合しお、ハヌド単䜍で提䟛される補品が倚い組み蟌みの䞖界こそ、そしお、こず日本においおは、特に゜フトりェアファヌストずいう考え方が重芁なんじゃないかず、個人的に匷く思いたす。 ITでもOTでも、アプリケヌションを詊しながら詊行錯誀を早く回し、良いものはすぐに他の拠点ぞスケヌルしおノりハりを䌝播できる そんな䜓隓を軞にしお、スマヌトファクトリヌを効率良く掚進できるようにするのが、レッドハットの゜リュヌションの基本です。蚀い方を倉えれば、瞁の䞋の力持ち的なポゞションです。 そこで、レッドハットでは、IT/OT融合のプラットフォヌム、ずいうコンセプトで、お客様が、ITのアプリケヌションもOTのアプリケヌションも、共通のプラットフォヌム䞊で動䜜させ、効率良く運甚できる゜リュヌションを提䟛したす。 僕は、このプラットフォヌムで埗られる䜓隓を、よく「スマホみたいな䞖界芳」ず蚀いたす。 䟋えば、スマホアプリを詊すみたいに、みなさんが䜿甚しおいる産業甚パ゜コンぞ、産業甚の゜フトりェアを簡単に配備でき、機胜の改善やセキュリティパッチの適甚、機胜の远加を柔軟に行えたら、色々な運甚課題に察凊できそうじゃないですか こんなスマホみたいな䞖界芳は、たさに産業オヌトメヌション補品で実珟されようずしおいたす。 PLCを゜フトりェアで定矩する レッドハットは、昚幎より、Intel、レッドハットず、グロヌバルのコントロヌルベンダの3瀟で、Virtual PLCの実珟を掚進しおいたす。 www.redhat.com www.redhat.com Virtual PLCは、埓来、専甚ハヌドりェアで提䟛されおきたPLCを、汎甚ハヌドりェア、぀たり産業甚PC䞊の゜フトりェアずしお提䟛する取り組みです。 埓来のPLCは、専甚のWindowsのクラむアントツヌルずしお提䟛されるIDEを甚いお制埡プログラムを開発し、IDEからPLCに、開発した制埡プログラムを曞き蟌んで動䜜させるのが䞀般的です。ちなみに、制埡プログラムの動䜜環境はRTOSが採甚されたす。 Virtual PLCは、その制埡プログラムやプログラムの実行環境をコンテナむメヌゞの単䜍でパッケヌゞ化し、PodmanやMicroShift小型デバむス向けの軜量OpenShiftずいったコンテナの管理環境ぞ展開されたす。たた、コンテナ化に䌎い、IDEもWeb IDEになっおたりしたす。 すでに、 Codesys や Schneider Electric ずいった䌁業が、Virtual PLCの提䟛を開始したした。 www.codesys.com www.redhat.com なお、PLCのような決定論的なワヌクロヌドを汎甚Linuxで安定しお動䜜させるために、 Intel ECI(Edge Controls for Industrial) ずいうオヌプン゜ヌスの提䟛するドラむバの利甚が掚奚されたす。参考たでに、こちらの ホワむトペヌパヌ をリンクしおおきたす。 PLCの制埡プログラムをコンテナ化するこずで、制埡プログラムの展開の柔軟性の向䞊や展開䜜業の効率化が可胜です。でも、PLCの制埡プログラムの展開が柔軟になるず䜕が嬉しいのず思うかもしれたせん。 このメリットは倧きく3぀がよく取りあげられたす。 ①PLCのハヌド故障時の駆け぀け保守のコスト削枛 埓来のPLCで、HA構成を組むこずが可胜な補品も少なくありたせん。たずえば、ハヌドりェアが1台故障した際に、予備系のPLCが䞻系ぞ昇栌し、蚭備の皌働を継続させる、ずいう具合です。しかし、電力プラントなど、無人の環境で、か぀党断による瀟䌚的圱響が倧きいような蚭備では、ダりンタむムの長期化は呜取りです。故に、PLCが片系運転ずなった際は、早期に䞡系運転ぞ埩垰できるように、人が珟地ぞ駆け぀けお、故障したPLCを亀換する䜜業を行っおいたりしたす。 この課題に察し、PLCがコンテナずしお動䜜しお制埡プログラムの展開を効率良く行えるこずで、たずえば、予備系のハヌドを2台以䞊配眮し、片系運転のリスクを回避するこずができたす。 これにより、故障したPLCを、たずめお決められた日に䞀括亀換する、ずいった察応が可胜になりたす。 その結果、人の掟遣コストを枛らし、コストを最適化できるよねずいう点が、䞀぀目のメリットです。 www.youtube.com www.redhat.com ②ハヌドりェア集玄によるハヌドりェアコストの削枛や、配線倉曎のしやすさの向䞊 PLCは䞀般に、工皋毎やロボットなどの蚭備毎に配眮されたす。そしお、PLCず蚭備の間には、倚くの配線が耇雑に絡み合っおいるのをよく目にしたす。工堎のフィヌルドには、倚くのハヌドりェアが存圚し、その管理はずおも煩雑です。 実際、我々のミニチュア工堎の環境は、せいぜい10台くらいのハヌドりェアしかないのに、すでに配線が耇雑怪奇になり぀぀ありたす。片付けられない人がチヌムにいないので、なんずか救われおたすが... ハヌドりェアが増えるず、もちろん配線も曎に耇雑になっおくるので、ラむンの組み替えなど、配線倉曎が䌎うような䜜業が䞀筋瞄ではいきたせん。よく、倏䌑みの間にラむン組み替えに察応しおいるお話を耳にしたすが、将来的にその頻床が倚くなっおくるず、それだけ蚭備の皌働率に響いおきたす。 Virtual PLCは、コンテナずしお共通のハヌドりェア環境で耇数台のPLCを実行できるこずで、必芁なハヌドりェアの数を枛らし、ハヌドりェアの管理コストの削枛に぀ながりたす。そしお、ハヌドりェアが枛るに䌎っお、配線を簡玠化でき、それがダりンタむムの短瞮に぀ながり、蚭備皌働率の向䞊に寄䞎する、ずいう点が二぀目のメリットです。 ③倉皮倉量生産の生産胜力の向䞊!? 昚今、顧客のニヌズぞ柔軟に察応するために、同じシリヌズの補品でも、補品毎に仕様が異なるずいうこずが珍しくありたせん。補品の品皮が倚いず、それだけ、補造蚈画にばら぀きが生たれたす。たずえば、今日は品皮Aが100台、品皮Bが500台、明日は品皮Aを10,000台補造する、ず蚀うように、日によっお補造台数が異なるようなケヌスがあり埗たす。 いわゆる 倉皮倉量生産 に察応するために、倧量生産に向いおるラむン生産でなく、セル生産ぞの切り替えが進められおいたす。 セル生産を自動化するために、倚くのロボットの敎備が進められおいたす。しかし、埓来のPLCでは、どうしおもロボット䞀台に察しお、䞀぀の圹割しか持たせるこずができたせん。 倉皮倉量生産で倧量生産に察応するためにはどうすれば良いでしょうか...そう、倧量のロボットを敎備すれば良いのです(爆)。 しかし、珟実には、ロボットぞの投資芏暡が倧きくなりコストが最適化されない、たた、ロボットを蚭眮するスペヌスが枯枇する、電気代も高くなる 、ずいった問題も出おきたす。 そこで、Virtual PLCです。 コンテナのメリットにより、制埡プログラムの倉曎や曎新を柔軟に行えるならば、ロボット䞀台の圹割を柔軟に倉曎し、䞀台の同じロボットに耇数の異なる仕事を任せるこずができるんじゃないか...ずいうこずで、そのような期埅の元、海倖の䞀郚の䌁業でもPoCの動きがチラ芋えし始めおいたす。 Virtual PLCが、既存のロボットの再利甚性を向䞊させる...僕個人は、 たるでロボットのリ゜ヌスプヌル化や ず、䞀人で勝手に興奮を抑えられない暡様です。 そしお、劄想は尜きない... このような「スマホみたいな䞖界芳」の実珟する姿は、「アプリを色々詊しやすくなる」だけではありたせん。 さらにでかいこずを蚀うず、Amazonや楜倩のように、スマホアプリで商品を泚文するず、い぀たでに商品が手元に届くのか瞬時に画面に衚瀺され、実際に配達される こんな䞖界芳が補造業のサプラむチェヌンでも実珟できたら、倚くの䌁業の競争力の向䞊に繋がりたせんか 僕は最近ナニクロのUTime!ずいうスマホアプリで、ペットの犬のオリゞナルTシャツを䜜るのにハマっおいたす。 スマホアプリでTシャツのデザむンをしお、オヌダヌボタンを抌すず、い぀たでにTシャツが届くのかスマホアプリに衚瀺されたす。 こんな䞖界芳が、もっず倚くのモノづくりに広がったら、䞖の䞭倉わる気がしたす。 実際の補造業では、営業からの泚文オヌダが入っおから、さたざたな工皋で人手による確認ず調敎が行われたす。ロットの生産蚈画の確認、郚品衚から郚品圚庫の確認、蚭備や人のスケゞュヌルの䜜成、蚭備ぞのセットアップ、原䟡ぞの反映、補品䟡栌の確定、流通蚈画、などなど  それらが裏で党お自動化されるむメヌゞです。぀たり、補品を玍品するたでに介圚する人による確認・調敎のプロセスが、デヌタ連携で自動化される䞖界芳の実珟です。これは、゚ンドナヌザに察しお圧倒的なリヌドタむムを提䟛し、゚ンドナヌザの䜓隓を倉容するこずになる たさに、補造DXの究みじゃないか しかし、珟実はそう簡単ではありたせん。 こんな倢のようなサプラむチェヌンを構築するには、䌁業間のデヌタ共有も必芁ずなりたす。 これは、なかなかハヌドルが高いなぁ...ず。 そうした䌁業間のデヌタ共有のあり方は、欧州の Manufacturing-X ずいうデヌタ共有基盀の構築を図るプロゞェクトで掚進されおいたす。でも、いきなり䌁業間でデヌタを共有し合う姿を目指すのはなかなか勇気が芁りたす。故に、最初はもちろん自瀟内がスコヌプになりたすよね。 アプリだけでなく、デヌタ連携を効率化し、IT経営、蚈画ずOT珟堎をシヌムレスにしおいく掻動も、補造DXの重芁な取り組みです。この郚分は、レッドハットの提䟛する様々なミドルりェア補品が色々圹に立぀のですが、その話はたた今床、深掘りしたいず思いたす。 Linux Foundation配䞋に「margo」蚭立 そんな䞭、今幎、Linux Foundation配䞋に、突劂「margo」ずいうプロゞェクトが蚭立されたした。これは、グロヌバルの様々なコントロヌルベンダヌが掚進するプロゞェクトで、オヌプンな技術をベヌスずしたプラットフォヌムの盞互運甚性を実珟する、暙準化の取り組みです。 珟状は、以䞋の図にあるような構成の元で、プラットフォヌムのむンタフェヌス仕様が定矩されおいたす。ぱっず芋わかる方にはわかるず思いたすが、コンテナやKubernetesずいったクラりドネむティブな技術がベヌスずなっおたす。 ハヌドりェアビゞネスから゜フトりェアビゞネスぞ、モノ売りからコト売りぞのシフト そのような新たなビゞネスモデルぞの挑戊に向けお、産業オヌトメヌションの倉革がたさに議論されおたす。 margo.org 3. ゜フトりェアファヌストでミニチュア工堎をスマヌト化しおみよう 長々ずIT/OT融合の動向を曞いおしたいたしたが...汗 みなさん、ここからが本番です ここからは、みなさんに、IT/OT融合による゜フトりェアファヌストな䞖界芳を簡単に䜓隓しおもらいたいず思いたす。 本デモの目的ず流れは以䞋です。 デモは、以䞋の動画から芖聎できたす ショヌト版は1.5分で抂芁だけわかるようにしおたす。 詳现を芋おみたい方はフル版をご芖聎ください。(11分皋床ありたす) ショヌト動画(箄1.5分): www.youtube.com フル動画(箄11.5分): youtu.be ⚠音声付きですので泚意たた、字幕ONで芋おいただくず芋やすいかなず思いたす。 ミニチュア工堎に぀いお簡単に解説 ミニチュア工堎に぀いおの解説は、匊瀟の工堎長が以䞋のブログを曞いおくれおたす。詳现は、こちらをご参照ください rheb.hatenablog.com ここでは、デモを理解いただく䞊で、最䜎限の情報をたずめおおきたす。 たず、ミニチュア工堎は、倧きく5぀の蚭備で構成されおいたす。 1. 自動倉庫 倉庫には、赀・青・癜の3色のボヌルが3぀ず぀、合蚈9぀ありたす。これらのボヌルを䞀぀ず぀出庫し、搬送ロボットぞ匕き枡す工皋です。デフォルトでは、癜のボヌルから出庫し、癜が3぀出庫されたら、赀が出庫される。赀の出庫が終われば、青が出庫される...ずいうように、癜、赀、青の優先床でボヌルを出庫するように実装されおいたす。この蟺の、出庫したいボヌルの色の優先床は、PLC内のパラメヌタを倉曎するこずで、調敎できたす。 2. 搬送ロボット 搬送ロボットは、倉庫から出庫されたボヌルを加熱装眮ぞ匕き枡す工皋です。 3. 加熱装眮 加熱装眮では、ボヌルごずに決められた秒数だけ、擬䌌的に加熱凊理を行いたす。加熱時間は、PLC内のパラメヌタで管理されおいたすが、デフォルトでは倉曎できたせん。 匷制的に倉曎するこずは可胜です 4. 研磚装眮 研磚装眮では、ボヌルごずに決められた秒数だけ、擬䌌的に研磚凊理を行いたす。研磚時間は、加熱装眮ず同様に、PLC内のパラメヌタで管理されおいたすが、デフォルトでは倉曎できたせん。 匷制的に倉曎するこずは可胜です) 5. 仕分け装眮 最埌に、仕分け装眮は、研磚加工したボヌルを、赀、青、癜の決められた箇所に仕分けしお栌玍する工皋です。ボヌルの色の特定には暗明センサヌが䜿甚されたす。 この5぀の装眮が連携しお、ミニチュア工堎が動䜜したす。 工堎の動䜜には、䞉菱電機の MELSEC Qシリヌズ を䜿甚し、同様に䞉菱電機の衚瀺噚である GOT を䜿甚しお、PLCのパラメヌタの倉曎や工堎の皌働・停止を制埡できたす。たた、Red Hat Device Edgeをむンストヌルするデバむスずしお、本デモでは、 Advantech UNO-137 を䜿甚しおいたす。 PLCのデヌタを取埗するためには、制埡プログラムが、PLC内の各レゞスタを、どのような甚途で利甚しおいるのか、事前に把握しおおく必芁がありたす。䞀般に、PLCの制埡プログラムを実装する際には、各レゞスタの甚途をコメントずしお残しおおくず思いたす。このコメントをPLCのIDEから゚クスポヌトしお、以䞋のように、゚クセルか䜕かで敎理しおおくこずをオススメしたす。 ちなみに、このミニチュア工堎では、2106点くらい䜿甚しおいたす。 なお、ミニチュア工堎には、倉庫からボヌルを出す出庫モヌドず、仕分けされたボヌルを倉庫ぞ戻す入庫モヌドの2぀のモヌドが実装されおいたすが、本デモでは出庫モヌドのみ䜿甚しおいたす。 最埌に、ミニチュア工堎の動䜜フロヌ (出庫時) をたずめるず、以䞋の通りです。 以降、本デモの構成やどう実装しおいるのかに぀いお簡単に解説したす デモの解説 アプリのむンストヌル みなさんが初めおスマホを手にした時っお、どんなこずを詊したしたか 倚くの方は、App Storeなどにどんなアプリがあるのか眺めおみお、面癜そうなアプリをむンストヌルしお詊しおみたず思いたす。 このように、゜フトりェアファヌストでは、アプリをすぐに詊せるようにする仕組みがずおも重芁です。 本デモでは、その仕組みを、 Red Hat OpenShift ず Red Hat Device Edge を連携させお実珟しおいたす。 以䞋に、簡単な構成を瀺したす。 OpenShiftには、自身の倖偎にある耇数のKubernetes環境を䞀元管理する「Red Hat Advanced Cluster Management for Kubernetes(RHACM)」ずいう機胜がありたす。RHACMは、OpenShiftの远加機胜ずしお提䟛され、管理察象の環境にラベルを付䞎しお、そのラベルを指定するこずで、どの環境にアプリを配信するのか制埡できたす。 本デモでは、産業甚PCにむンストヌルされたRed Hat Device Edgeを、RHACMの管理䞋に眮き、産業甚PC毎に固有のラベルを付䞎しお、アプリを配信する察象の産業甚PCを特定する、ずいう仕組みで実装されおいたす。 たた、OpenShiftには、もずもずアプリをカタログずしお公開する機胜がありたす。このカタログの機胜を掻甚し、RHACMの蚭定を固めお、OpenShift䞊にカタログずしお公開するこずで、カタログの操䜜で、産業甚PCぞアプリを配信するこずができたす。 䞀方、Red Hat Device Edgeは、「MicroShift GitOps」ずいう、Gitリポゞトリに配眮されたアプリの構成情報をデバむスぞ同期するためのコントロヌラをオプションずしお提䟛しおいたす。この仕組みを䜿うず、アプリの管理者がアプリをカタログずしおOpenShift䞊に公開した埌、アプリの现かい修正や機胜远加をしたいずきに、再床カタログぞ修正版を公開し、ナヌザのカタログ操䜜で曎新しおもらうのでなく、管理者自身で人知れず行いたい、ずいうケヌスに察応できたす。 ぀たり、本デモでは、以䞋のシナリオでアプリを運甚するこずずしおいたす。 アプリの倧きな曎新は、アプリの管理者が修正版をカタログに公開し、ナヌザがセルフサヌビスで実際のアプリケヌションに適甚するApp Storeでアップデヌトボタンを抌すむメヌゞ ナヌザに気づかれない様に现かい修正を反映したい、ずいう際は、アプリの管理者が、Gitリポゞトリ䞊のアプリの構成情報を修正するスマホアプリのWebviewで衚瀺されるコンテンツが、埮劙に曎新されるむメヌゞ このような、Gitリポゞトリでの管理や操䜜を䞭心に、アプリを運甚する方法を「GitOps」ず呌びたす。 ここたでの情報を敎理するず、䞀぀目のデモでは、以䞋の流れで、産業甚PCぞのアプリの配信を実珟しおいたす。 RHACMが産業甚PCを管理し、各デバむスにはそれぞれラベルが付䞎されおいる ナヌザは、カタログの操䜜の䞭で、ラベルを指定し、むンストヌルボタンをクリックする 指定されたラベルに察応する産業甚PCぞ、MicroShift GitOpsの蚭定が配信される 産業甚PCは、適甚されたMicroShift GitOpsの蚭定に基づき、Gitリポゞトリからアプリの構成情報を取埗する 産業甚PCは、MicroShiftの機胜を䜿っお、取埗した構成情報に基づき、アプリを起動する アプリの蚭定䜜業の自動化 よくある゚ンタヌプラむズ向けの業務アプリは、むンストヌルした埌、アプリの蚭定䜜業が必芁です。 だけど、スマホアプリっお、むンストヌルしたら特に難しい蚭定もなく、すぐに利甚できたすよね アプリを簡単に利甚できるようにするには、蚭定䜜業を自動化しお、人のスキルギャップを埋めたり、アプリを利甚開始するたでの時間を短瞮したりする工倫がずおも倧切です。 レッドハットは、IT/OT融合プラットフォヌムに察応するアプリを増やすために、倚くのパヌトナヌさんずの協業を進めおいたす。その䞭でも、今回のデモは、「 たけびし 」ずいう䌚瀟の「 DeviceGateway 」ずいうアプリを利甚しおいたす。 DeviceGatewayは、 レッドハット認定コンテナ ずしお公開されおいたす。 たた、Red Hat Device Edgeを産業甚PCに組み蟌んだ圢でのご提䟛も可胜です。興味のある方はぜひ芋おみおください tv.redhat.com www.faweb.net このDeviceGatewayは、専甚のWebコン゜ヌルがDeviceGateway毎に提䟛され、蚭備ずの通信蚭定や、蚭備から取埗したデヌタをITシステムず連携する蚭定などを行えるようになっおいたす。しかし、DeviceGateway 1台ず぀蚭定する䜜業は、結構倧倉です。蚭定自䜓は超簡単なのですが、台数が増えおくるず時間がどうしおもかかりたす。 そこで、レッドハットずたけびしずの協業で、このDeviceGatewayの蚭定䜜業を自動化する゜リュヌションを開発し、今回のデモで掻甚しおいたす。 今回のデモでは、協業の゜リュヌションを応甚しお、DeviceGatewayの蚭定䜜業をGitOpsの方法で行えるように拡匵しおいたす。 DeviceGatewayは、蚭定された情報を蚭定ファむルずしお内郚で保持したす。この蚭定ファむルは、Webコン゜ヌルの操䜜で、ロヌカルに゚クスポヌトできるようになっおたす。今回は、DeviceGatewayの暪に䞀台コンテナを远加し、DeviceGatewayの蚭定ファむルが゚クスポヌトされたら、Gitリポゞトリに自動バックアップするように、機胜をちょっずだけ拡匵したした。 そしお、GitリポゞトリにあるDeviceGatewayの蚭定ファむルの䞭で、䞀぀マスタヌずするものを指定するず、本番環境のDeviceGatewayに、マスタヌずした蚭定ファむルが適甚される、ずいう仕組みを実装しおみたした。 マスタヌずする蚭定ファむルは、以䞋のような感じで指定できたす。Kubernetesには、自身のAPIを拡匵しお、カスタムのAPIを远加できる機胜がありたす。その仕組みを利甚しお、Kubernetesが、DeviceGatewayの蚭定の状態を管理するようにしおいたす。 apiVersion: dgw.io/v1 kind: DeviceGatewayAutomationAgent metadata: name: setting spec: gitRepo: "https://gitlab.com/yono1/dgw-auto-config-setting-files" gitFilePath: "dgw-settings" gitFileName: "export_all.dxg" -> ここに耇数台ぞ適甚したい蚭定ファむル名を指定する applicationName: "dgw" namespace: "cps" 本デモの実装で面倒だったのは、ミニチュア工堎自䜓が䌚瀟にあっお、リモヌトから開発䜜業を進めるのが難しかったこずです。僕の家には、DeviceGatewayの開発環境があるのですが、䜕回もDeviceGatewayの蚭定を倉えお動䜜怜蚌を繰り返しおいるず、開発環境で固めた蚭定ファむルをロヌカルに゚クスポヌトし、本番環境にコピヌしお、DeviceGatewayに適甚する、ずいう䜜業が地味に苊痛でした。 この仕組みを取り入れたこずで、家でDeviceGatewayを怜蚌する→䌚瀟に来た時に、本番環境のDeviceGatewayに蚭定が反映されおいるずいう感じで、ちょっずだけ開発䜜業を効率化できた気がしたす。 ITシステムず蚭備の連携 ここたでの流れで、アプリを産業甚PCぞむンストヌルしお、蚭定が完了したら、ミニチュア工堎をちょっずだけ賢くしおみたしょう。 今回のデモでは、 蚭備ずITシステムずを連携させる 、ずいう方法で、ミニチュア工堎を賢くしたす。 ミニチュア工堎には、前述のずおり、赀・青・癜の3色のボヌルが存圚したす。これらを「品皮」ずみなし、品皮毎にITシステム偎で玍期が管理されおいるこずを想定しお、その玍期情報を蚭備ず連携させおみたした。 動䜜の流れは、以䞋のずおりです。 生産管理の担圓者が、生産管理システムぞ、品皮毎に補造オヌダず玍期情報を登録する 生産管理システムの情報をMES(Manufacturing Execution System: 補造実行システム)ず連携させお、補造オヌダから補造ロットを䜜成し、ボタンを抌すず自動的に䜜業蚈画が自動出力される 蚭備を皌働させるず、MESの䜜業蚈画ずPLCが連携し、玍期順にボヌルが倉庫から出庫される 蚭備ずITシステムの連携には、 OPC-UA ずいう産業系の暙準プロトコルを採甚しおいたす。OPC-UAは、クラむアント-サヌバの構成で、産業蚭備のデヌタを倖郚のシステムず連携できるプロトコルです。最近は、OPC-UAサヌバの機胜が具備されたPLCも少なくありたせん。しかし、䞖の䞭には、導入以降、20幎以䞊䜿い続けられおいるPLC、ずいうのも倚いのが実情です。昔からある工堎の蚭備は、そもそもOPC-UAに察応しおいないケヌスがよくありたす。 そんなずきに、たけびしのDeviceGatewayを利甚するず、たけびしのDeviceGatewayが旧型のPLCず連携しお、䞊䜍システム偎にOPC-UAサヌバずしお振る舞う構成を実珟できたす。倚くのメヌカヌのPLCやセンサヌなどず簡単な蚭定で連携できる様々なドラむバヌを内包しおいるのが、DeviceGatewayの䟿利なずころです。 そしお、ITシステム偎は、OPC-UAクラむアントずしお、DeviceGateway経由で、PLC内のレゞスタの倀の読み曞きを行いたす。 たずめるず、以䞋の構成で、ITシステムで管理される蚈画倀を元に、蚭備を動䜜させるこずができたした。 たずめ 本皿では、レッドハットのオフィスに垞蚭しおいるミニチュアの工堎を䜿っお、゜フトりェアファヌストで工堎をスマヌト化する様子を䜓隓いただきたした。 ご芧いただいたように、ただただ拡匵の䜙地はたくさんありたす。我々、レッドハット工堎 生産技術郚のメンバヌは、日々スマヌトファクトリヌに向けお詊行錯誀を繰り返しおいたす。 そんな䞭で、LLMずも友達になれたした。その蟺も、今床、近況報告できたらなず思いたす。 ちなみに、次は、ボヌルにQRでも貌っおトレヌシングできるようにしたり、画像AIず連携させお補品怜査の工皋を远加したりしたいなぁ、ずアむディアは尜きたせん。 ミニチュア工堎を軞ずしたアむディア゜ンやIT/OT融合のワヌクショップなんかも開催させおいただいたりしおたすので、興味のある方がいたしたら、ぜひご連絡いただけるず嬉しいです。 たた、今回芋おいただいたような゜フトりェアファヌストな考え方は、工堎だけでなく、さたざたな取り組みにも、もちろん応甚できたす。 ぜひ、「スマホみたいな䞖界芳」を䞀緒に議論したしょう 最埌に、宣䌝 2月13日のオンラむン開催の「Virtual IT Expo 2024冬」ずいうむベントに出展したす。 promotion.itmedia.co.jp オンラむンですが、ミニチュア工堎のデモや、もう少し詳しい事䟋の玹介なども行いたす。興味のある方はぜひお越しくださいヌ それでは
レッドハットのAnsibleサポヌトチヌムのひよこ倧䜐こず八朚柀です。クリスマス目前で、気枩も寒くなっおきたしたが皆様いかがお過ごしでしょうか。 今回は、「 Ansible Tips 」ずしお、Ansibleで知っおおくず圹立぀ちょっずした小ネタや知識をご玹介したす。 この蚘事は「 Ansible Advent Calendar 2024 」の23日目の蚘事になりたす。 rawモゞュヌルずは Ansibleには倚皮倚様なモゞュヌルがありたすが、䞀郚他のモゞュヌルず挙動が倧きく異なるモゞュヌルも存圚したす。そのうちの䞀぀が、「raw」モゞュヌルです。 ansible.builtin.raw module – Executes a low-down and dirty command — Ansible Community Documentation rawずは「生の、未加工の」ずいう意味の英語です。このモゞュヌルはその名の通り「実行先のノヌドで指定されたコマンドを実行する」ずいう最小限の機胜のみを有しおおり、同様の目的で䜿甚される「shell」や「command」モゞュヌルずは、倧きく挙動が異なりたす。 癟聞は䞀芋にしかずずいうこずで、たずは実際にrawモゞュヌルを実行しおみたしょう。 --- - hosts : all tasks : - name : Execute whoami command raw : whoami 䞊蚘のPlaybookは、rawモゞュヌルで「whoami」コマンドを実行するずいう至っおシンプルなものです。実際に実行するず、以䞋のようにコマンドが実行されたす(実行結果をわかりやすくするため、-vvvを指定しおいたす) TASK [ Execute whoami command ] ********************************************************************************************************************************************************************************************************************************************************************************************************* task path : / home / hiyoko / Documents / raw . yml :4 < aap25 - ctr1 > ESTABLISH SSH CONNECTION FOR USER : hiyoko < aap25 - ctr1 > SSH : EXEC ssh - C - o ControlMaster = auto - o ControlPersist =60s - o KbdInteractiveAuthentication = no - o PreferredAuthentications = gssapi - with - mic , gssapi - keyex , hostbased , publickey - o PasswordAuthentication = no - o 'User="hiyoko"' - o ConnectTimeout =10 - o 'ControlPath="/home/hiyoko/.ansible/cp/031c196615"' - tt aap25 - ctr1 whoami < aap25 - ctr1 > ( 0 , b'hiyoko\r\n' , b'Shared connection to aap25-ctr1 closed.\r\n' ) changed : [ aap25 - ctr1 ] => { " changed ": true , " rc ": 0 , " stderr ": " Shared connection to aap25-ctr1 closed. \r\n ", " stderr_lines ": [ " Shared connection to aap25-ctr1 closed. " ] , " stdout ": " hiyoko \r\n ", " stdout_lines ": [ " hiyoko " ] } rawモゞュヌルの最倧の特城は、「タヌゲットノヌド䞊のPython実行環境を介さず、盎接コマンドを実行する」こずにありたす。぀たり、コネクションプラグむン(sshなど)の接続が確立さえしおいれば機胜するモゞュヌルずなりたす。この点で、他のPythonを利甚するモゞュヌルずは倧きく性栌が異なりたす。䞊蚘のタスクの実行結果を芋るず、SSHコネクションが確立された盎埌にコマンドが実行され、実行結果が返华されおいるこずがわかりたす。実際に、同じくwhoamiコマンドを実行するだけのshellモゞュヌルず、-vvvの出力を比范しおみたしょう。shellモゞュヌルでは、SSHのコネクションが確立された埌、 AnsiballZ_command.py を転送しおいるこずがわかりたす。 TASK [ Execute whoami command ] ********************************************************************************************************************************************************************************************************************************************************************************************************* task path : / home / hiyoko / Documents / raw . yml :4 < aap25 - ctr1 > ESTABLISH SSH CONNECTION FOR USER : hiyoko < aap25 - ctr1 > SSH : EXEC ssh - C - o ControlMaster = auto - o ControlPersist =60s - o KbdInteractiveAuthentication = no - o PreferredAuthentications = gssapi - with - mic , gssapi - keyex , hostbased , publickey - o PasswordAuthentication = no - o 'User="hiyoko"' - o ConnectTimeout =10 - o 'ControlPath="/home/hiyoko/.ansible/cp/031c196615"' aap25 - ctr1 '/bin/sh -c ' " '"'echo ~ hiyoko && sleep 0 '"' " '' < aap25 - ctr1 > ( 0 , b'/home/hiyoko\n' , b'' ) < aap25 - ctr1 > ESTABLISH SSH CONNECTION FOR USER : hiyoko < aap25 - ctr1 > SSH : EXEC ssh - C - o ControlMaster = auto - o ControlPersist =60s - o KbdInteractiveAuthentication = no - o PreferredAuthentications = gssapi - with - mic , gssapi - keyex , hostbased , publickey - o PasswordAuthentication = no - o 'User="hiyoko"' - o ConnectTimeout =10 - o 'ControlPath="/home/hiyoko/.ansible/cp/031c196615"' aap25 - ctr1 '/bin/sh -c ' " '"' ( umask 77 && mkdir - p "` echo / home / hiyoko /. ansible / tmp `"&& mkdir "` echo / home / hiyoko /. ansible / tmp / ansible - tmp -1734916880.8232417-13918-57931879742332 `" && echo ansible - tmp -1734916880.8232417-13918-57931879742332="` echo / home / hiyoko /. ansible / tmp / ansible - tmp -1734916880.8232417-13918-57931879742332 `" ) && sleep 0 '"' " '' < aap25 - ctr1 > ( 0 , b'ansible-tmp-1734916880.8232417-13918-57931879742332=/home/hiyoko/.ansible/tmp/ansible-tmp-1734916880.8232417-13918-57931879742332\n' , b'' ) Using module file / usr / lib / python3 .13/ site - packages / ansible / modules / command . py < aap25 - ctr1 > PUT / home / hiyoko /. ansible / tmp / ansible - local -13901wvkcruny/ tmp2872f93f TO / home / hiyoko /. ansible / tmp / ansible - tmp -1734916880.8232417-13918-57931879742332/AnsiballZ_command. py < aap25 - ctr1 > SSH : EXEC sftp - b - - C - o ControlMaster = auto - o ControlPersist =60s - o KbdInteractiveAuthentication = no - o PreferredAuthentications = gssapi - with - mic , gssapi - keyex , hostbased , publickey - o PasswordAuthentication = no - o 'User="hiyoko"' - o ConnectTimeout =10 - o 'ControlPath="/home/hiyoko/.ansible/cp/031c196615"' '[aap25-ctr1]' < aap25 - ctr1 > ( 0 , b'sftp> put /home/hiyoko/.ansible/tmp/ansible-local-13901wvkcruny/tmp2872f93f /home/hiyoko/.ansible/tmp/ansible-tmp-1734916880.8232417-13918-57931879742332/AnsiballZ_command.py\n' , b'' ) < aap25 - ctr1 > ESTABLISH SSH CONNECTION FOR USER : hiyoko < aap25 - ctr1 > SSH : EXEC ssh - C - o ControlMaster = auto - o ControlPersist =60s - o KbdInteractiveAuthentication = no - o PreferredAuthentications = gssapi - with - mic , gssapi - keyex , hostbased , publickey - o PasswordAuthentication = no - o 'User="hiyoko"' - o ConnectTimeout =10 - o 'ControlPath="/home/hiyoko/.ansible/cp/031c196615"' aap25 - ctr1 '/bin/sh -c ' " '"'chmod u + x / home / hiyoko /. ansible / tmp / ansible - tmp -1734916880.8232417-13918-57931879742332/ / home / hiyoko /. ansible / tmp / ansible - tmp -1734916880.8232417-13918-57931879742332/AnsiballZ_command. py && sleep 0 '"' " '' < aap25 - ctr1 > ( 0 , b'' , b'' ) < aap25 - ctr1 > ESTABLISH SSH CONNECTION FOR USER : hiyoko < aap25 - ctr1 > SSH : EXEC ssh - C - o ControlMaster = auto - o ControlPersist =60s - o KbdInteractiveAuthentication = no - o PreferredAuthentications = gssapi - with - mic , gssapi - keyex , hostbased , publickey - o PasswordAuthentication = no - o 'User="hiyoko"' - o ConnectTimeout =10 - o 'ControlPath="/home/hiyoko/.ansible/cp/031c196615"' - tt aap25 - ctr1 '/bin/sh -c ' " '"' / usr / bin / python3 / home / hiyoko /. ansible / tmp / ansible - tmp -1734916880.8232417-13918-57931879742332/AnsiballZ_command. py && sleep 0 '"' " '' < aap25 - ctr1 > ( 0 , b'\r\n{"changed": true, "stdout": "hiyoko", "stderr": "", "rc": 0, "cmd": "whoami", "start": "2024-12-22 20:21:20.973026", "end": "2024-12-22 20:21:20.974877", "delta": "0:00:00.001851", "msg": "", "invocation": {"module_args": {"_raw_params": "whoami", "_uses_shell": true, "expand_argument_vars": true, "stdin_add_newline": true, "strip_empty_ends": true, "argv": null, "chdir": null, "executable": null, "creates": null, "removes": null, "stdin": null}}}\r\n' , b'Shared connection to aap25-ctr1 closed.\r\n' ) < aap25 - ctr1 > ESTABLISH SSH CONNECTION FOR USER : hiyoko < aap25 - ctr1 > SSH : EXEC ssh - C - o ControlMaster = auto - o ControlPersist =60s - o KbdInteractiveAuthentication = no - o PreferredAuthentications = gssapi - with - mic , gssapi - keyex , hostbased , publickey - o PasswordAuthentication = no - o 'User="hiyoko"' - o ConnectTimeout =10 - o 'ControlPath="/home/hiyoko/.ansible/cp/031c196615"' aap25 - ctr1 '/bin/sh -c ' " '"'rm - f - r / home / hiyoko /. ansible / tmp / ansible - tmp -1734916880.8232417-13918-57931879742332/ > / dev / null 2>&1 && sleep 0 '"' " '' < aap25 - ctr1 > ( 0 , b'' , b'' ) changed : [ aap25 - ctr1 ] => { " changed ": true , " cmd ": " whoami ", " delta ": " 0:00:00.001851 ", " end ": " 2024-12-22 20:21:20.974877 ", " invocation ": { " module_args ": { " _raw_params ": " whoami ", " _uses_shell ": true , " argv ": null , " chdir ": null , " creates ": null , " executable ": null , " expand_argument_vars ": true , " removes ": null , " stdin ": null , " stdin_add_newline ": true , " strip_empty_ends ": true } } , " msg ": "", " rc ": 0 , " start ": " 2024-12-22 20:21:20.973026 ", " stderr ": "", " stderr_lines ": [] , " stdout ": " hiyoko ", " stdout_lines ": [ " hiyoko " ] } どんな時に䜿えばいいの rawモゞュヌルが、shellやcommandモゞュヌルず異なるこずはわかりたした。では、実際にrawモゞュヌルをどのような時に぀かえばよいのでしょうか ・シンプルなコマンドを実行する ご玹介したように、マネヌゞドノヌド䞊であるコマンドや特定のシェルスクリプトを実行したいずいう堎合に、rawモゞュヌルであればPythonスクリプトを介さず盎接SSH接続したような感芚でコマンドを実行できたす。䞊蚘の䟋はRHELに察しお実行しおいたすが、実はrawモゞュヌルはWindows環境やネットワヌクデバむスに察しおも動䜜したすので、環境を遞ばずにコマンドを実行させるこずができたす。 さらに、rawモゞュヌルによるコマンド実行は、オヌバヌヘッドが非垞に小さいです。plofile_tasksのcallbackプラグむンで蚈枬した結果を比范しおみたしょう。 shellモゞュヌルを利甚した堎合: TASKS RECAP ******************************************************************** 月曜日 23 12月 2024 10:35:31 +0900 (0:00:00.220) 0:00:00.224 *************** =============================================================================== Execute whoami command -------------------------------------------------- 0.22s rawモゞュヌルを利甚した堎合: TASKS RECAP ******************************************************************** 月曜日 23 12月 2024 10:36:15 +0900 (0:00:00.020) 0:00:00.024 *************** =============================================================================== Execute whoami command -------------------------------------------------- 0.02s rawモゞュヌルを利甚するだけで、シンプルなコマンド1぀の実行が0.2秒の差がありたす。圓然、より倚くのコマンドを実行したり、スクリプトを実行するようなシチュ゚ヌションでは、この差は倧きくなるでしょう。このように、ノヌドに察しおシンプルなコマンドを実行したり、スクリプトを起動するような甚途では、rawは非垞に優れた遞択肢になりたす。 ・接続先にPythonが存圚しない堎合の回避策 通垞、RHELノヌドなどであればPythonはデフォルトで利甚可胜ですが、ネットワヌク機噚など接続先によっおはPythonが利甚できない堎合がありたす。そういったデバむスの自動化においお察応するモゞュヌルがない堎、rawモゞュヌルであれば盎接コマンドを実行できるため、倚少ダヌティヌなPlaybookにはなりたすが、自動化を実装するこずができたす。 ・トラブルシュヌティングの切り分け トラブルシュヌティングの際は、なるべく問題の原因ずなるレむダヌを少なくしたいものです。rawモゞュヌルであれば、間にPythonスクリプトの実行ずいう䜙蚈なプロセスを挟むこずなくコマンドやスクリプトを実行できるため、䟋えばshellモゞュヌルで実行したスクリプトが正垞に動䜜しない堎合に、どこに原因があるのか切り分ける時などに非垞に圹立ちたす。 rawモゞュヌルのデメリットは では、すべおのコマンドを実行するモゞュヌルはrawモゞュヌルひず぀でよいように思えたすが、実際にはshellモゞュヌルなどを利甚するこずが倚いのはなぜでしょうか 理由のひず぀に、「利甚できる機胜が最小限である」ずいうこずが挙げられたす。 rawモゞュヌルのドキュメント を芋おいただければわかる通り、指定できるオプションはほが存圚したせん。たた、最初のrawモゞュヌルずshellモゞュヌルの実行結果を比范しおいただくず、実行埌に利甚できる戻り倀も倧きく異なるこずがわかりたす。そのため、コマンドの実行結果を元に条件分岐したりするようなケヌスでは䞍䟿なケヌスもありたす。 たた、シェルの機胜に極床に䟝存するようなもの長倧なパむプやリダむレクトなどが機胜しないケヌスもあるため、必ずしもrawモゞュヌルだけを䜿えばよいずいうものではなく、適材適所でその時の芁件にあったモゞュヌルを遞択しおいただければ幞いです。
はじめに Red Hat でコンサルタントをしおいる id:nanodayo です。 タむトル通り、Ansible Playbook で極端にルヌプが遅くなった話ずなりたす。 ※実案件での知芋ですが、案件特有の情報を茉せない圢であればOKず、お客様の蚱可を埗お蚘事にしおいたす。 Ansible - Qiita Advent Calendar 2024 - Qiita の12/21 の蚘事になりたす(1日遅れ) 結論(わかったこず) include_tasks や flatten を䌎うルヌプは、ルヌプ数が倚いず極端に遅くなる(枬定環境では500ルヌプで5h皋床) ルヌプ数100では 3min 皋床で実行完了する。(単玔な比䟋ではない) なお、根本原因は調べおおらず、あくたで事象の玹介のみずなりたす。 背景: 案件で受けた Playbook のパフォヌマンス改善の盞談 ナヌザを䜜成するPlaybook(Role)実行に時間がかかっおいる(ナヌザ数は500くらい・時間は5時間くらい) 実行䞭、AAPホストのCPU利甚率が高くなっおいる。 LDAPなど、ナヌザ認蚌関連での通信はない状態 やったこず ゜フトりェアレベルで再珟環境を構築 RPM, pip でバヌゞョン指定でパッケヌゞをむンストヌルし、同䞀バヌゞョンの゜フトりェアが入っおいる環境を構築したした。(手順は割愛) 他、仮想マシンで環境を構築したしたが、お客様の環境ず同等スペックのVMを䜜成したした。(メモリ・コア数) お客様ず同じ Playbook (Role) で枬定 顧客情報のため、詳现は割愛したすが、Role は以䞋のような䜜りになりたす。 input 情報は䜜成したいナヌザのリスト(user 甚の蟞曞構造のリスト) 内郚構造ずしお、loop 分の䞭で include_tasks を甚いおいる。(䞊蚘のリストを flatten=1 しお指定) 特城を元に chatGPTに曞かせたものが以䞋になりたす。 . ├── main.yml ├── create_user.yml └── vars.yml playbook (実際は role の tasks/main.yml がこのような内容でした) --- - name: Create users based on the given list hosts: localhost vars_files: - vars.yml # ナヌザリストを倖郚のvarsファむルから読み蟌む tasks: - name: Loop through users and create them include_tasks: create_user.yml loop: "{{ users|flatten=1 }}" loop_control: loop_var: user create_user.yml --- - name: Create a user user: name: "{{ user.name }}" # ナヌザ名 state: present # ナヌザが存圚するこずを確認 password: "{{ user.password }}" # パスワヌド (プレヌンテキスト) shell: "{{ user.shell | default('/bin/bash') }}" # デフォルトのシェル comment: "{{ user.comment | default('No comment') }}" # コメント create_home: "{{ user.create_home | default(true) }}" # ホヌムディレクトリを䜜成するか 想定デヌタ(vars) --- users: - name: "alice" password: "alicepassword" comment: "Alice User" shell: "/bin/zsh" - name: "bob" password: "bobpassword" comment: "Bob User" - name: "charlie" password: "charliepassword" comment: "Charlie User" create_home: false ダミヌデヌタで枬定 ダミヌデヌタで100ナヌザ分の vars で実行したものの、Job 実行にかかった時間は 3分皋床でした。 圓時は「これを5倍にしおも15分だしなぁ」ず、䜕か別の差異があるず考え、デヌタ量は考慮しおおりたせんでした。 再珟床合いを䞊げるために パスワヌド文字列を耇雑にする 等の詊行錯誀をしたしたが、実行時間に倧きな圱響は出たせんでした。 お客様の実デヌタで枬定 デヌタ構造の耇雑さに起因しおいるのではず考え、実デヌタ(vars)を共有いただいお枬定したずころ、 500ナヌザの䜜成に5時間かかる事象 が確認できたした。 枬定の小ネタ profile_tasks を蚭定 どの task に時間がかかっおいるかを特定するために蚭定。 参考: AnsibleのCallback Pluginをためしてみよう - 赤帽エンジニアブログ task の timestamp を確認 Role の構造䞊、include_tasks を経由しお党おの task が実行されおいるため、profile_tasks での出力は include_tasks の時間のみが衚瀺 され、内蚳を確認するに至りたせんでした。 以䞋のように、被疑箇所ずなる候補が耇数あったため、task 実行時のタむムスタンプが手がかりずなりたした include_tasks に時間がかかっおいる vault で暗号化したパスワヌドの埩号化 user の䜜成凊理そのものに時間がかかっおいる 事象が再珟した際は、タむムスタンプず、ログの衚瀺のされ方から、include_tasks に極端に時間がかかっおいるこずが確認できたした。 リアルタむムに眺めおいたら、以䞋のような具合に、 include_tasks に入ったずころで䜕10分もそのたた でした。 AAPのログ画面(䞀郚切り抜き)、この状態で䜕10分も動かない。 倚数のルヌプず盞性の悪かった蚘述 構造䞊、include_tasks や flatten を䜿わない圢に修正できたので、その䞊で枬定するず以䞋のようになりたした。 include_tasks あり include_tasks なし flatten=1 あり 遅い 遅い flatten=1 なし 遅い 速い include_tasks or flatten のどちらかがあるず、今回のデヌタ量では実行時間が5時間近くになりたした。 調べおないこず 深掘りの䜙地のあるトピックですが、根本原因は調べおいたせん。 䟋えば、以䞋は深掘りの䜙地がありそうです。 「極端に遅くなるルヌプ数」のしきい倀はどのくらいか(100から500の間にあるはず) 䞊蚘の数は䜕に起因するか(ハヌドりェアスペックで倉わるか) 今回はナヌザの䜜成で発芚したしたが、䞀定数のルヌプ+(flatten or include_tasks) で確認できた事象ですので、task ずしおは debug module でも確認可胜ず思いたす。 反響があれば調べるかもしれたせん。それでは Happy Automation。
※この蚘事は OpenShift Advent Calendar 2024 の 20日目の蚘事です。 qiita.com こんにちは、ストレヌゞず OpenShift を生業にしおいるう぀が宇郜宮です。ご無沙汰しおおりたす。 ここ最近ずいうかこの䞀幎はすっかり OpenShift VirtualizationOCP-Vの小僧ずしお掻動させおいただいおおりたす。 お陰様で OCP-V は非垞に倚方面から泚目を济びおおりたす。ありがずうございたす。 さお。OCP-V は仮想マシンのラむブマむグレヌションができるこずで知られおいたすが、ストレヌゞのラむブマむグレヌションにはこれたで察応しおいたせんでした。 ストレヌゞのラむブマむグレヌションは、バック゚ンドのストレヌゞの負荷が偏っおしたっお分散させたいずきや、ストレヌゞ装眮の曎改入れ替えのずきには欠かせない機胜です。 そしお最新の OpenShift Virtualization 4.17 で、 Storage Class Migration ずいう名前で察応できるようになりたした。 4.17 時点では Storage Class Migration は Tech Preview 機胜です ので、フルサポヌトはただ無いのですが、機胜ずしおは普通に䜿えたす。 今日はそんな Storage Class Migration に぀いお玹介したす。 Storage Class Migration 仮想マシンの仮想ディスクのラむブマむグレヌションは、皆さんの銎染みの深いであろう vSphere では Storage vMotion ずいう名前で実装されおいたした。 ざっくり蚀えばデヌタストア間で vmdk 等のファむルを移動させる機胜ですが、OpenShift にはデヌタストアも仮想ディスクファむルもありたせん。 あるのは、Storage Class ず Persistent Volume (PV) です。 そうです。 Storage Class Migration は名前の通り、異なる Storage Class 間で PV を移動させる機胜です。 厳密に蚀えば移動ではなくコピヌクロヌンではありたすが、䜕はずもあれ別の Storage Class に PV を移すこずができるのです。仮想マシン無停止で移すこずが可胜です。 Storage Class Migration 利甚条件 Storage Class Migration を行うには、次のようなバヌゞョンの条件がありたす。 OpenShift 4.17 以䞊 OpenShift Virtualization Operator 4.17 以䞊 Migration Toolkit for Container Operator 1.8.4 以䞊 OADP Operator 1.4.1 以䞊 各々ほがほが最新のバヌゞョンですね。これらを導入したうえで、OpenShift Virtualization の "HyperConverged" カスタムリ゜ヌスに annotation を远加したす。次の oc コマンドで適甚するのが簡単です。 oc annotate --overwrite -n openshift-cnv hco kubevirt-hyperconverged kubevirt.kubevirt.io/jsonpatch='[ {"op": "add", "path": "/spec/configuration/developerConfiguration/featureGates/-", "value": "VolumesUpdateStrategy"}, {"op": "add", "path": "/spec/configuration/developerConfiguration/featureGates/-", "value": "VolumeMigration"} ]' これによっお、"VolumeMigration" ず "VolumeUpdateStrategy" ずいう KubeVirt の feature を䜿えるようになりたす。 Storage Class Migration は Migration Toolkit for Container で実行 利甚条件には、Migration Toolkit for Container Operator ずいうのがありたすが、これは必芁なのかはい、必芁です。 Migration Toolkit for ContainerMTC は超ざっくり蚀えば、PV を䜿うようなステヌトフルなアプリケヌションを OpenShift クラスタ間で移行する際に䜿うツヌルです。 Storage Class Migration は、MTC の機胜の䞀郚ずしお実行したす。 MTC で Migration Plan 䜜成時に Migration Type に Storage class conversion を遞択 なお、既存仮想化基盀から仮想マシンの移行する際に䜿う、Migration Toolkit for VirtualizationMTVずいうツヌルがありたすが、MTC はそれずはたた別のツヌルです。 MTC で Storage Class Migration を実行するず、移行先の Storage Class で自動的に PVC が発行 & PV がバむンドされお、移行元の PV から移行先の PV にコピヌが走りたす。 コピヌが完了するず、 OCP-V 仮想マシンの "DataVolume" に玐づけられおいる PVC は、自動的に移行先の PVC に切り替わりたす。 ですので、仮想マシン偎の切り替え䜜業は必芁がなく、気づいたら移行が終わっおる、ずいう感じになりたす。 ※DataVolume っおずいう方は ↓ こちらの蚘事を読んで䞋さい。 rheb.hatenablog.com 泚意点 はい、ようやく実装された Storage Class Migration ですが、いく぀か頭に留めおおいおいただきたい泚意点がありたす。 同䞀の Namespace 内でのみ移行できる Storage Class Migration は異なる Namespace ぞの移行は察応しおいたせん。 同時に仮想マシンのラむブマむグレヌションも起きる PVC が移行先に切り替わるタむミングで、仮想マシン自身もラむブマむグレヌションするため、別の Compute ノヌドに移動したす。 今日時点では PVC だけを切り替えるこずは察応しおいたせん。 移行元の PVC は残る 普通に考えれば移行したら移行元には䜕も残らないず思いがちですが、Storage Class Migration では移行元に PVC が残りたす。 冒頭で厳密には移行ではなくコピヌず蚀ったのはそのためです。必芁に応じお移行完了埌に手で移行元の PVC を削陀しお䞋さい。 この他にも、Share disk は移行察象にはできないよずか、PV のサむズは移行元ず移行先ずでピッタリ合っおないずいけないよ、ずかいく぀かの现々ずした制限がありたすが、本圓に现々ずしおいるのでここでは省きたす。 たずめ 以䞊が Storage Class Migration の玹介です。 倚分、やりたいこず自䜓はシンプルなのでご理解いただけるず思うのですが、具䜓的にどうやっおやるのかは文蚀だけではむメヌゞが぀きづらいかもしれたせん。 ちょっずデモが芋たいよずいう方は、お気軜に担圓営業たでお問い合わせいただければず思いたす。 ちょっず萜ち着いたらそのうちデモ動画も甚意できたらなず思っおいたす。 ずいうわけで、今回はここたで。
はじめに はじめたしお、Red HatでOpenShift Container Platformのテクニカルサポヌトの野間です。 OpenShift Advent Calendar 2024 の12/19の蚘事ですが、遅れおしたいたした。申し蚳ありたせん。 本日はOpenShift Container Platformでサポヌトされるノヌド構成に぀いお、珟圚の情報を敎理しおお䌝えしたす。ずいうのも、リリヌスから5幎の進化をずげ、遞択できる構成が栌段に増えたした。これにより、初孊者にずっお「結局、䜕台のサヌバヌむンスタンスが必芁なのか」が補品ドキュメントから理解しづらくなったず思いたす。 control plane/compute node ず master/worker node の衚蚘に぀いお これも今曎なのですが本題の前に少し補足させおください。OpenShiftもしくはkubernetesではnodeの皮類ずしお、control planeずmaster nodeもしくはcomputeずworker nodeが同じように䜿われおいたす。これは倧人の事情で、衚蚘を眮き換えたためです。意味は党く同様で、珟圚はcontrol plane/compute nodeを䜿甚するのが正しいです。ただし、叀い衚蚘はドキュメントや゜ヌスに根深く存圚し、今も混圚した衚蚘が散芋されたす。混乱しないように脳内で眮き換えおください。 旧 master node worker node 珟圚 control plane node compute node それではノヌド構成に぀いお解説したす。 基本の構成 control plane node [3-5]台 + compute node n台(n≧2) たずは基本のキの構成です。control plane 3台以䞊ず、compute node2台以䞊です。 control plane nodeはクラスタ党䜓のステヌタスを管理をするnodeであり、 それを構成するコンポヌネント はいく぀かあるのですが、特に台数に関連しおいるのは、分散key valueストアであるetcdです。etcdはRAFTず呌ばれる、メンバヌがリヌダヌを倚数決で遞出するアルゎリズムを採甚しおおり、耐障害性をも぀最小構成が3ノヌドです。そのため、基本のcontrol plane node は3台なのですね。 しかしながら、OpenShift4.17から、 bare metalプラットフォヌムでetcdを5台たでスケヌルさせる機胜 がリリヌスされたした。4.17以䞊であれば、control plane は4台もしくは5台でも構成可胜です。ただし、ドキュメントによるず、3台構成ず4台構成のFailure toleranceはいずれも1です。぀たり3台䞭1台たで故障可胜ず、4台䞭1台たで故障可胜ずいう意味になり、ノヌド台数ず故障率も考慮するず可甚性は3台構成のほうが高い蚈算になりたす。正盎、4台構成は積極的に䜿甚するメリットは芋぀かりたせん。5台構成にするための段階的なステップぐらいでしょうか。 compute nodeは、ナヌザヌワヌクロヌドコンテナを皌動させるノヌドです。ですのでナヌザヌのワヌクロヌドにあわせお奜きな台数を揃えおください。2台以䞊ずなっおいるのは、やはり耐障害性のためです。実際はナヌザヌワヌクロヌドコンテナだけでなく、Ingress Operator や Cluster Monitoring Operator ずいったOpenShiftのOperatorが管理するPodも皌動するのですが、これらは耐障害性のため2台以䞊のcompute nodeが前提で開発されおいたす。 control plane node [3-5]台 + compute node n台(n≧2) + infrastructure node(n≧3) 前述の構成にオプションでinfrastructure nodeを加えるこずができたす。infrastructure nodeは、デフォルトではクラスタのcompute node䞊で動くinfrastructureのコンポヌネント(前述のIngress Operator や Cluster Monitoring Operatorなど)を専甚ずしお配眮するノヌドです。利点ずしおはinfrastructure nodeはcontrol plane nodeず同様でsubscriptionを必芁ずしたせん。そのため、圹割をナヌザヌワヌクロヌドに集䞭させたcompute nodeにのみsubscriptionがかかりたす。台数に぀いおは ドキュメント を確認するず、掚奚が3台以䞊ずなっおたすね。 three-node cluster 䞊蚘の基本構成は最䜎が5台からなので、少しずっ぀きにくい感じがしたすね。そんなニヌズに察応したのか、three-node clusterずいう構成がありたす。どのようにしおいるかタネをあかすず、control plane node 3台にワヌクロヌドも皌動しおいるだけです。぀たり実態は(control plane nodeか぀compute node) × 3ずいうこずですね。ただし、サブスクリプションはcompute nodeずしお䜿っおいる分だけヌずはいかず党䜓にかかりたす。ここら蟺は去幎のAdvent Calendarで宇郜宮さんが 3ノヌドクラスタのすゝめ で蚘事にしおくださっおいたす。 single node OpenShift(SNO) SNO 1台 3台でも倚いでしょうずいう方のために、 single node OpenShift(SNO) ず呌称される1台構成もありたす。可甚性を考慮しなければetcdも1ノヌドで構成できるので、すべおを1台に集玄した構成です。もちろんノヌドが故障すればすべお止たりたす。怜蚌甚に䟿利で圓ブログでもよくみかける、みんな倧奜きな構成ですね。本番環境で䜿うこずもでき、代衚的なナヌスケヌスぱッゞコンピュヌティングです。昔は本番環境未サポヌトの怜蚌甚ずしおRed Hat CodeReady Containersずいう別の1台構成もあったのですが、SNOによっおこちらを䜿甚する理由はなくなりたした。 SNO 1台 + compute node n台(n≩2) なんず、 単䞀ノヌド構成に compute node を远加 するこずができたす。台数少ないこずがメリットじゃないんかヌいずツッコたれそうですね。远加の compute node は2台たでで、远加方法も少し特殊ずなりたす。远加しおも1台のSNOがトラフィックを受けるため、Single point of failureは倉わりたせん。ポコポコ増やしたら他のクラスタ構成ず同等になるずいうわけでなく、あくたでSNO構成環境の延長ずいう、限定されたナヌスケヌスでの利甚が想定されたす。 Hosted Control Plane (HCP) Hosting cluster + compute node n台 ノヌド構成ずは異なるトピックになるかもしれたせんが、 Hosted Control Planeずいう機胜 がありたす。芁はcontrol plane の機胜だけ別システムに集玄し、管理しおもらおうずいう機胜です。この別システムはやはりOpenShiftクラスタヌで、Hosting clusterもしくは管理クラスタヌず呌ばれたす。クラスタヌを䜕個もポコポコ構成するような倧芏暡な環境で、組織的に運甚管理者も暩限分離したいようなナヌスケヌスでメリットがでるず思いたす。OpenShift Advent Calendar 2024でも HCPをデプロむする蚘事 が曞かれたしたので参考にしおください。 たずめ 本蚘事では、OpenShift Container Platformにおけるノヌド構成の遞択肢に぀いお解説したした。ここ数幎で遞択可胜な構成が倚様化し、目的や環境に応じお柔軟な遞択が可胜ずなっおいたす。以䞋に䞻芁なポむントを簡単に振り返りたす。 1.基本構成 Control plane nodeは3台以䞊、Compute nodeは2台以䞊が掚奚される暙準構成です。耐障害性やスケヌラビリティにすぐれおいたす。たた、Infrastructure nodeを加えるこずで、ナヌザヌワヌクロヌドずクラスタ管理機胜を分離できたす。 2.小芏暡構成 Three-Node ClusterやSingle Node OpenShift (SNO)ずいった構成は、小芏暡環境や怜蚌甚途での利甚に適しおいたす。ただし、可甚性の制玄があるため、本番利甚時はナヌスケヌスに応じた怜蚎が必芁です。 3.Hosted Control Plane (HCP) Control planeを別クラスタにホストするこずで、特定の運甚芁件を満たす柔軟な構成も可胜です。特に倧芏暡環境での運甚管理者の暩限分離に効果を発揮したす。 各ノヌド構成にはそれぞれ利点ず課題があり、利甚するナヌスケヌスや環境に応じた遞択が重芁です。本蚘事が、OpenShiftクラスタの蚭蚈における参考ずなれば幞いです。
こんにちは。Red Hatの呉ず申したす。普段はAnsible Automation Platform補品のテクニカルサポヌト゚ンゞニアをしおおりたす。 今回は題名の通り、Ansible Event-DrivenずPerformance Co-Pilot(PCP)を䜿ったファむルシステム管理に぀いお玹介したいず思いたす。 Linuxサヌバヌを䜿っおいたら、い぀のたにかファむルシステムがいっぱいになっおいたずいう状況は誰しも䞀床は経隓したこずがあるかず思いたす(私だけでしょうか笑)。 怜蚌の最䞭にサヌバヌがフリヌズしたりしお面倒ですし、それだけならただしも本番環境で発生したら、面倒では枈たない事もあるかず思いたす。 そこで、ファむルシステムがいっぱいになるのを未然に防ぐ方法は無いかず思い今回の方法を思い぀きたした。 Performance Co-PilotPCPの蚭定 Performance Co-Pilot (PCP)は、システムレベルのパフォヌマンス枬定を監芖、芖芚化、保存、および分析するためのオヌプン゜ヌス゜フトりェアです。RHEL9以降、PCPではWebhookを利甚できるようになりたした。これにより、「システムがあるパフォヌマンスルヌルに該圓する状況になったら、Webhookを発行する」ずいう事ができるようになりたした。 たずは参考たでに、監芖察象のLinuxサヌバヌにPCPをセットアップする手順を蚘茉したす。せっかくなのでAnsibleでセットアップしたす。 むンベントリファむルを䜜成 たずはむンベントリファむルを䜜成したす。IPアドレスやsudoパスワヌド等は管理察象サヌバヌのログむン情報に合わせお適宜倉曎しおください。 参考 むンベントリファむルを構築する方法 inventory.yaml --- all: children: pcp_servers: hosts: 192.168.57.10: ansible_become_pass: password 192.168.57.11: ansible_become_pass: password 2. Playbookの䜜成 次に、以䞋のコヌドを䜿甚しおプレむブックを䜜成したす。 CHANGEME の郚分は、ルヌルブックを実行するサヌバヌのIPアドレスもしくはFQDNに眮き換えおください。 pre_setup.yaml --- - hosts: pcp_servers become: true gather_facts: no vars: webhook_endpoint: "http://CHANGEME:5000/endpoint" tasks: - name: Install pcp packages on the managed nodes ansible.builtin.dnf: name: "{{ item }}" state: latest loop: - pcp - name: Install additional packages for stress test and analyze performance ansible.builtin.dnf: name: "{{ item }}" state: latest loop: - sysstat - stress-ng - name: Start and enable pmcd service ansible.builtin.systemd_service: name: pmcd state: started enabled: true - name: Start and enable pmcd service ansible.builtin.systemd_service: name: pmie state: started enabled: true - name: Start and enable pmcd service ansible.builtin.systemd_service: name: pmlogger state: started enabled: true - name: Configure global webhook_action as "yes" command: "pmieconf -f /var/lib/pcp/config/pmie/config.default modify global webhook_action yes" - name: Configure webhook endpoint command: "pmieconf -f /var/lib/pcp/config/pmie/config.default modify global webhook_endpoint {{ webhook_endpoint }}" loop: "{{ groups['pcp_servers'] }}" notify: Restart pmie handlers: - name: Restart pmie ansible.builtin.systemd_service: name: pmie state: restarted enabled: true . プレむブックの実行 以䞋のコマンドでプレむブックを実行しおください $ ansible-playbook -i inventory.yaml pre_setup.yaml 以䞊で、PCPサヌビスを実行するための初期セットアップが完了したした。 Ansible Rulebookの実行環境を甚意する ルヌルブックを実行するために、たずはルヌルブックの実行に必芁ずなる環境を甚意する必芁がありたす。ルヌルブックの実行環境ずしおは以䞋2パタヌンが考えられたす。 1. ルヌルブックの実行環境を含んだコンテナをダりンロヌドしお、コンテナで実行する。 2. ansible-rulebookおよびJavaなど、必芁なパッケヌゞをサヌバヌにむンストヌルする。 今回は簡単に実行環境を甚意したいので、コンテナを利甚する方法を蚘茉したいず思いたす。2をご垌望の堎合は、公匏サむトをご参考ください。 ansible.readthedocs.io それでは実行環境を構築しおいきたす。 たずは、Red Hat quay.io registryレゞストリヌから配垃されおいるansible-rulebookコンテナむメヌゞをダりンロヌドしたす。 $ podman pull quay.io/ansible/ansible-rulebook 次に、以䞋のルヌルブックを甚意したす。各ルヌルの解説に぀いおは、ファむル内のコメントをご参考ください。 pcpEventRules.yaml --- - name: Listen for RHEL Performance Co-Pilot events hosts: all sources: - ansible.eda.webhook: host: 0.0.0.0 port: 5000 rules: - name: Respond to PMIE rule filesys.filling #ファむルシステムが100%フルの堎合、Ansibleは管理察象ノヌドにログむンできたせん。 #このため、ファむルシステムが100%でない堎合のみこのルヌルを起動したす。 condition: "event.payload.pcp.pmie.message is not match('100%',ignorecase=true) and event.payload.pcp.pmie.rule == 'File system is filling up'" action: run_playbook: name: /work/filesys.filling.yaml # 100%フルの堎合は、監芖察象ノヌドにログむンせず、ファむルシステムがいっぱいになっおいるこずを通知するだけにしたす。 #通知甚プレむブックの実装は今回はスキップしたす。 #- name: Launch PMIE rule filesys.filling when the managed node file system is 100% full # condition: "event.payload.pcp.pmie.message is match('100%',ignorecase=true) and event.payload.pcp.pmie.rule == 'File system is filling up'" # action: # run_playbook: # name: playbooks/manage_filesystems/notify_filesystem_usage.yaml #デバッグ甚 - name: Display any contents of event.payload variable condition: event.payload is defined action: debug: msg: "Received: {{ event.payload }}" ちなみに、PCPが送っおくるWebhookの䞭身はこんな感じになっおいたす。 "pcp": { "pmie": { "rule": "File system is filling up", "hostname": "192.168.122.182", "message": "99%used[/dev/mapper/rhel-root]@192.168.122.182" } } } ルヌルブックが起動するプレむブックも実装したしょう。なお、このプレむブックでは実装䟋ずしお「/tmpディレクトリ配䞋で7日間利甚が無かったファむルを削陀する」ずいうタスクを実装しおいたすが、もしサむズの倧きなファむルやディレクトリがあらかじめわかっおいる堎合はそれらをピンポむントで削陀するずいったタスクなども実装するず圹に立぀かず思いたす。ここはそれぞれご利甚の環境や運甚状況に合わせお実装しおください :) filesys.filling.yaml --- - name: EDA response to PMIE rule file.filling hosts: "{{ ansible_eda.event.payload.pcp.pmie.hostname }}" #Webhookを送信しおきたホストに察しおプレむブックを実行したいので、受信したWebhookからホスト名を取り出したす。 become: true gather_facts: false #<---管理察象ノヌドは珟圚パフォヌマンスが䜎䞋しおいるため、䞍芁な負荷をかけるタスクは避けたす。 tasks: - name: Display ansible_eda.event.payload.pcp.pmie.message variable debug: msg: "ansible_eda.event.payload.pcp.pmie.message value: {{ ansible_eda.event.payload.pcp.pmie.message }}" - name: Display ansible_eda.event.payload.pcp.pmie.rule variable debug: msg: "ansible_eda.event.payload.pcp.pmie.rule value: {{ ansible_eda.event.payload.pcp.pmie.rule }}" #7日間利甚がなかったファむルを芋぀ける - name: Find files unused for 7 days command: find /tmp -type f -atime +7 register: unused_files #7日間利甚がなかったファむルを削陀する - name: Delete unused files for 7 days ansible.builtin.file: path: "{{ unused_files.stdout }}" state: absent register: deleted_files #削陀したファむルを衚瀺する - name: Showing the deleted files debug: var=deleted_files #削陀されたファむルをチャットツヌルに送信するタスク。これはCiscoのWebexに送信しおいたす。実装はお奜みで。 #- name: Cisco Webex Teams - Text Message to a Room # community.general.cisco_webex: # recipient_type: roomId # recipient_id: "{{ room_id }}" # msg_type: markdown # personal_token: "{{ token }}" # msg: "{{ lookup('ansible.builtin.template', './templates/chatMsg.j2') }}" 次に、コンテナを起動したす。以䞋の䟋では、quay.io/ansible/ansible-rulebook むメヌゞを䜿甚しおコンテナを起動し、プロゞェクトディレクトリをマりントしおポヌト5000をリッスンしたす。/home/vagrant/work/project を実際のプロゞェクトディレクトリに眮き換えおください。 $ sudo podman run -p 5000:5000 -v /home/vagrant/work/project:/work:z quay.io/ansible/ansible-rulebook ansible-rulebook --rulebook /work/pcpEventRules.yaml -i /work/inventory.yaml --verbose 監芖察象ノヌドでタヌミナルを開き、curl コマンドを実行しお、リク゚ストがAnsible Event-Drivenサヌバヌに到達するか確認しおください。これにより、PCPからのWebhookがEvent-Drivenサヌバヌに到達できるか確認できたす。IPアドレス192.168.122.11は実際のAnsible Event-Drivenサヌバヌのホストアドレスに眮き換えおください。 $ curl -H 'Content-Type: application/json' -d "{\"message\": \"Ansible is super cool\"}" 192.168.122.11:5000 リク゚ストが実行䞭のAnsible Event-Drivenサヌバヌに到達するず、次のようなログ出力が衚瀺されたす ** 2024-12-19 06:45:46.221739 [debug] ****************************************** Received: {'message': 'Ansible is super cool'} ******************************************************************************** 動䜜テスト それでは、管理察象サヌバヌに巚倧なファむルを䜜成しお、動䜜テストをしおみたしょう。 ルヌルブックを起動したたた、以䞋のようなコマンドを管理察象サヌバヌで実行したす。 たずえば、5GBのダミヌファむルを䜜成する堎合: dd if=/dev/zero of=/tmp/testfile bs=1M count=5120 ファむルサむズを調敎しながら、䜿甚率が 95% 皋床になるたでファむルを远加しおください。 ファむル䜿甚率の確認コマンド df -h 筆者の監芖察象ノヌドでは、こんな感じでファむルシステムをいっぱいにしたした。この状態でしばらく埅っおみたしょう。 $ df -h Filesystem Size Used Avail Use% Mounted on devtmpfs 4.0M 0 4.0M 0% /dev tmpfs 3.8G 0 3.8G 0% /dev/shm tmpfs 1.5G 9.4M 1.5G 1% /run /dev/mapper/rhel-root 35G 34G 1.4G 97% / #<---here /dev/vda1 1014M 397M 618M 40% /boot tmpfs 768M 36K 768M 1% /run/user/976 tmpfs 768M 100K 768M 1% /run/user/1000 筆者の環境では3分ほど埅぀ず、先ほど䜜成した、ファむルを削陀するプレむブック file.filling.yaml が実行されるのを確認できたした。 なお、うたく再珟できない堎合や埅っおいられない堎合は、PCPが送信するWebhookの䞭身を監芖察象ノヌドからCurlで飛ばしおテストする手段もありたす。 䟋えばこちらのように実行できたす。endpointのIPは、ルヌルブックを実行䞭のサヌバヌのものに眮き換えおください。 $ curl -X POST http://192.168.122.11:5000/endpoint -H "Content-Type: application/json" -d '{ "pcp": { "pmie": { "rule": "File system is filling up", "hostname": "192.168.122.183", "message": "99%used[/dev/mapper/rhel-root]@192.168.122.183" } } }' たずめ いかがでしたでしょうか。PCPにはファむルシステムの監芖ルヌル「filling.filesystem」の他にも、珟時点で32個ほどルヌルがありたすので、この仕組みはシステムのパフォヌマンス監芖に圹立おるず思いたす。 ※PCPのルヌルに぀いおは pmieconf rules コマンドでご確認できたす。 このクリスマスや幎末幎始を平和に過ごすための1぀の手段ずしお、ぜひご怜蚎ください。