Hatでソリューションアーキテクトをしている小島です。2018の14日目です。28ではModularityという概念が導入され、アプリケーションのライフサイクルを設定するための新しい仕組みが追加されました。本記事ではModularityの概要や利用方法について紹介していきます。Collectionsとの違いModuleの利用方法Moduleの配信方法ReferencesModularityとはModularityは、RHELやFedoraといったOSからアプリケーションのライフサイクルをある程度独立させるための仕組みです。Modularityを利用しているイメージは下図のようになります。djangoと名付けられたModuleを提供しています。Moduleは小さなRPMリポジトリであり、それぞれの名前に関連したRPMパッケージ郡から構成されています。nodejs-{6,8,10}やunstableといったバージョンに関する情報によってModuleを分けることができます。29といった異なるリリースのOSで利用できるようなAPI/ABIの互換性を担保するようにModuleが作られます(作られるべきとしています)。「Base」という名前のリポジトリは、OSのリリースに紐付いたRPMパッケージを提供します。「Base」リポジトリの利用は従来と変わる所はありません。した仕組みにより、アプリケーションをある程度OSと独立して利用できるようになります。Fedoraのように半年ごとにリリースされるOS上では、リリース間隔より長いサポート期間を持つ古めのアプリケーションを利用し、RHELのように長期間のサポートを提供するOSの上では、独自に定義されたサポート期間のもとに新しめのアプリケーションを利用できるようになります。8もModularityという概念を取り入れています。8の主なリポジトリは、「BaseOS」と「AppStream」の2つです。「BaseOS」がRHEL7までのベースリポジトリに該当します。CollectionsやExtrasリポジトリで提供していたアプリケーションもいくつか提供しています。これらのリポジトリが提供するModuleやパッケージ名の一覧は、下記を参照してください。Collectionsも同様に、利用者はOS標準のアプリケーションとは異なるバージョンのアプリケーションを利用できます。Collectionsのアプリケーションは、OS標準のアプリケーションとは別に、専用のPATHにインストールするようになっています。そのため、異なるバージョンのアプリケーションを1つのシステムにインストールできます。Collectionsと異なり、基本的には複数のバージョンのアプリケーションをインストールできないようになっています。Collectionsの特徴に起因した特別な変更*1をしなくていいといった利点も産まれます。Modularityを利用していて、1つのシステムに複数のバージョンのアプリケーションを導入したい場合はコンテナ環境の利用を推奨します。Collectionsのサポートは提供されていません。CollectionsだけでなくModularityにも慣れていくことを推奨します。8をローカルマシンにインストールします。Hatのカスタマーポータルへにシステムを登録し、必要なリポジトリの利用を有効化します。--enable=rhel-8-for-x86_64-appstream-beta-rpmsこれでModuleの利用準備が整いました。[module_name]*2で確認できます。[i]nstalledこの例では「AppStream」リポジトリで提供しているPostgreSQLのModule一覧を表示しています。ProfileはPostgreSQLのModuleに関するRPMパッケージ郡に付けられた名前であり、clientとdefaultの2つがあることを意味しています。clientとdefaultがどのRPMパッケージを含んでいるかについては、DNFリポジトリのメタデータ(repodataディレクトリにあるxxx-modules.yaml.gz)で、次のように記載されています。[i]nstalledとの表示がありますが、それぞれ次の意味を持ちます。[d]efault:Moduleをインストールする時に利用されるStreamとProfileのデフォルト値。これらはDNFリポジトリのメタデータで定義しています。[e]nabled:ModuleのStreamにあるRPMパッケージ郡が、dnfでインストールできる(RPMパッケージの依存関係を確認できる)ようになっている状態です。[x]disabled:ModuleのStreamにあるRPMパッケージ郡が、dnfでインストールできない(RPMパッケージの依存関係を確認できない)ようになっている状態です。[i]nstalled:Moduleがインストールされた場合に表示されます。[i]と表示されるようになります。29など)などの需要に基づいて産まれたものです。アップグレードの際に、今まで使えていたStreamが廃止されて新しいStreamを利用しなくてはいけない場合、またはその逆で、RPMパッケージの競合状態を防ぐために特定のStreamにあるRPMパッケージ郡を利用しないようにする場合に使われます。enabledとdisabledはあくまでもDNFリポジトリでの依存関係の確認の可否に関わるものであり、システムの既存のRPMパッケージに影響を及ぼすものではありません。PostgreSQLのModuleをインストールしてみましょう。<module_spec>でModuleをインストールできます。<module_spec>では、module:stream/profileを指定しますが、StreamとProfileは省略できます。その場合は[d]efaultで指定されている値が利用されます。この時Streamがdisabled状態であれば、自動的にenabled状態に変更されます。Moduleの状態を確認してみます。Moduleの10Streamがenabled状態になっていて、clientProfileがインストールされた状態になっていることを確認できます。Moduleの9.6Streamをインストールする場合、9.6Streamへのダウングレードと切り替えを自動的に実行してくれます。<module_spec>を実行します。Moduleを削除するときも、DNFリポジトリのメタデータを参照して削除対象のModuleを決定します。Module削除の場合は、自動的にStreamがdisabled状態に変更されることはありません。8のデフォルトに目当てのModuleが無い場合、既存のRPMパッケージを指定してModule用のリポジトリを作ることができます。その際は、指定したRPMパッケージをModuleとして配信するためのメタデータを、RPMリポジトリ内に作成・追加する必要があります。この手順をzshRPMパッケージを例にして見ていきましょう。最初にzshパッケージを適当なディレクトリに保存します。Hatのカスタマーポータルのリポジトリからダウンロードすることもできます。zsh次にzshModule用のメタデータをYAML形式のファイルで作成します。これはmodulemdファイルと定義されています。簡単なメタデータのサンプルが下記になります。2の2行で、modulemdファイルであることを宣言します。8を指定)、Profileの名前(最低限defaultという名前のProfileが1つ必要)、defaultProfileに紐付けるRPMパッケージの名前zshを記載して保存します。nameEOFこうして作成したzsh-modules.yamlをRPMリポジトリのメタデータに追加します。<path_of_repository>を実行し、zshRPMパッケージを保存したディレクトリ内にメタデータ一式(repodataディレクトリ)を作成します。<repodata_path_of_directory>を実行します。これによってrepodataディレクトリ内に、xxx-zsh-modules.yaml.gzという名前のgzファイルが自動的に作成されます。最後に作成したローカルリポジトリを利用するための設定ファイルを作成します。リポジトリを利用するための設定ファイルの保存場所はYUMと同様に、/etc/yum.repos.d/となります。/etc/yum.repos.d/local.repo[local]name=local-repobaseurl=file:///tmp/moduledir/gpgcheck=0enabled=1EOFこれでローカルリポジトリにあるModuleを利用するための準備が完了しました。あとは先程紹介したのと同様の手順で、Moduleの一覧出力やインストールなどができるようになります。package...<snip>...ちなみに、Streamのデフォルト値を指定したい場合、先程作成したzsh-modules.yamlに下記の行を追加して、DNFリポジトリのメタデータを修正します。modulemd-defaultsを追加してzshModuleのlatestStreamを指定することで、latestStreamがデフォルト値として使われるようになります。メタデータ修正後、modifyrepo_cでModuleに関する既存のメタデータの削除と、新規メタデータの追加を行います。/tmp/moduledir/repodata/そして、DNFリポジトリのキャッシュを削除してzshModuleの情報を見てみると、デフォルト値が指定されていることが分かります。これでModuleの利用者が特にStream/Profileの値を指定しなくても、zshModuleのデフォルトのStream/Profileをインストール・削除できるようになります。package...<snip>...ここで取り上げた例以外にも、modulemdファイルには様々な設定項目があります。これらの詳細を知りたい場合は、次のドキュメントも参考にしてください。documentation*1:専用のPATHを考慮したカスタムスクリプトの作成・保守など。Standard)に違反するから非推奨にすべきという意見もあります。8からYUMの後継としてDNFが導入されました。従来どおりyumコマンドも使えますが、yumはdnfのシンボリックリンクなので、dnfコマンドの利用例を載せています。Hatの福岡オフィスでソリューションアーキテクトをしている...2019-08-16EPEL8がリリースされました。