sscheib.satellite_publish_promote_content_views
satellite_content_view_version_publish_promote
注意:
この役割は非常に複雑です。できるだけテストしましたが、バグが残っていないとは保証できません。リポジトリの同期やコンテンツビューの公開およびプロモートのアクションは、Satellite内のオブジェクトを変更しますので、本番環境で使用する前にテストすることをお勧めします。この役割は「現状のまま」提供され、発生する可能性のある深刻な結果について責任を負いませんので、その点を考慮し、クローンやラボシステムでテストしてください。ありがとうございます 😊
この役割は、コンテンツビューとコンポジットコンテンツビューのバージョンを公開およびオプションでプロモートします。Red Hat認定コレクション redhat.satellite
を使用しています。
以下のSatelliteバージョンでテストされています:
- 6.15
- 6.14
- 6.13
認定コレクション redhat.satellite
を使用するには、Red Hatのサブスクライバーである必要があります。サブスクリプションを持っていない場合は、Red Hatが無償で提供するRed Hatの開発者サブスクリプションを利用できます。
また、上流コレクション theforeman.foreman
を使うこともできますが、モジュール名を redhat.satellite
から theforeman.foreman
に変更する必要がありますが、私はこれをテストしていません。
この役割は、他の役割 redhat.satellite.content_view_publish
と同じ方法でコンテンツビューの変数定義を受け入れるように書かれています。
また、redhat.satellite
コレクションの共通役割変数もサポートしています。redhat.satellite
のGitHubリポジトリには、使用できる共通役割変数のセクションは含まれていませんが、これらはコードで直接確認できます。
共通役割変数は以下です:
SATELLITE_SERVER_URL
,SATELLITE_SERVER
,SATELLITE_URL
SATELLITE_USERNAME
,SATELLITE_USER
SATELLITE_PASSWORD
SATELLITE_VALIDATE_CERTS
redhat.satellite
コレクションと同じコンテンツビュー定義を再利用することで、コンテンツビューやコンポジットコンテンツビューのための同じYAML定義を維持することができますが、より「モダン」な定義に移行することを強くお勧めします。この定義はForemanとSatelliteの両方の役割、そしてこの役割でも受け入れられます。
このプロセスをサポートするために、convert
タグ(--tags convert
)を使用してこの役割を実行すると、変換されたYAMLを任意のファイルに保存します。その場合、変数 sat_convert_yaml_file
で指定する必要があります。
変換は、デフォルトでこの役割に付属するカスタムフィルタ(list_of_dicts_to_indented_yaml
)で行われます。このフィルタは、リストを2スペースで「正しく」インデントしますが、ansible.builtin.to_nice_yaml
では行われません(これは既知の制限で、解決するのは難しいと思われます)。フィルタ list_of_dicts_to_indented_yaml
は、辞書のリストの先頭に特定のキーと値を付与する機能も追加します(デフォルトでは name
)。
このフィルタはこの役割の外で使用するために目的があるわけではなく(だから最悪な名前を選択したのです 😊)、辞書のリストのみを受け入れ、他のデータ型ではエラーが発生します。さまざまなデータ型のYAML解析を実装するのは大変な作業です。この役割に固有の用途においては、付属のフィルタがうまく機能します。
この「レガシー」なYAML定義から移行することを強くお勧めする理由は、この役割が機能するために特定の方法で定義が必要だからです。心配しないでください、オンザフライで変換されますが、すべてのコンテンツビュー/コンポジットコンテンツビューの定義を反復して、それぞれを変換するため、パフォーマンスに影響を与えます。
この役割が引数として受け入れない唯一のことは current_lifecycle_environment
です。役割は別のアプローチを持ち、すべてのコンテンツビューのバージョン/コンポジットコンテンツビューのバージョンの現在のライフサイクル環境を動的に判断するため、この引数は必要ありません。
current_lifecycle_environment
がコンテンツビュー/コンポジットコンテンツビュー定義に定義されていても、この役割に影響はありません。この属性は決して取得されません。
この役割は satellite_content_views
の定義にいくつかの属性を追加します(他の役割は気にしないでしょう):
patch_day_exclude
: これにより、コンテンツビュー/コンポジットコンテンツビューを処理から永久に除外できます。これは「特別な場合」にのみ操作するコンテンツビュー/コンポジットコンテンツビューです。たとえば、Satelliteの更新を行うときです 😊。この属性はオプションです。lifecycle_environments
: コンテンツビュー/コンポジットコンテンツビューをプロモートするためのライフサイクル環境のリストです。必要に応じてこのリストを切り詰めることができます(以下の変数セクションを参照)。この属性は公開時にはオプションですが、プロモート時には必須です。
redhat.satellite.content_view_publish
との違い
この役割の使用方法は、redhat.satellite.content_view_publish
の方法とはまったく異なります。
役割 redhat.satellite.content_view_publish
は、できる限り簡単です:satellite_content_views
に定義されたすべてのコンテンツビューを反復して公開します。非同期 (async
) でも、一つずつでも。余計なことはありません。誤解しないでください、これはまったく問題ない役割です。この方法はおそらく、役割の98%のユーザーが評価している正確なものです。
私は2%の一人です。私は、役割がどのコンテンツビュー/コンポジットコンテンツビューを公開するか、どこにプロモートするかを動的に決定し、satellite_content_views
を再定義せずに、コンテンツビュー/コンポジットコンテンツビューを除外できることを望んでいます。また、新しいコンテンツビュー/コンポジットコンテンツビューのバージョンを公開する必要がない場合に公開しないことを望んでいます。変更された場合のみプロモートされ、何かが本当に変更された場合のみ、changed
ステータスを報告します。当然、プロモートするライフサイクル環境の制限も必要ですが、satellite_content_views
の定義を再定義することなくそうしたいのです。
これはあまりにも良すぎると思いますか? まあ、そうでもありません。私は、上記のすべてを(おまけに)この役割に実装しましたが、それには欠点があります:複雑さと実行速度。
私は実行速度をできるだけ低く抑えるよう最善を尽くしましたが、redhat.satellite.content_view_publish
よりもかなり遅いです。しかし、同時に多様です。
上記の要件を実装するには、技術的には、各コンテンツビュー/コンポジットコンテンツビューをSatellite APIから1つずつ取得し、必要なデータを抽出する必要があります。これは、すべてのコンテンツビュー/コンポジットコンテンツビューを反復し、現在反復中のコンテンツビュー/コンポジットコンテンツビューのために redhat.satellite.resource_info
を実行すれば、確実に行えます。
または、すべてのコンテンツビュー/コンポジットコンテンツビューを一度に取得し、satellite_content_views
に定義されていないものをフィルタリングすれば、経験上、大きなデータの塊をSatellite APIから取得する方が、少しずつ取得するよりも通常は早いです。結局のところ、あなたはおそらく、Satelliteに存在するすべてのコンテンツビュー/コンポジットコンテンツビューを公開したいと考え、数個を除外するだけです。それであれば、なぜすべてを一度に取得しないのでしょうか 😊。
私はまた、役割に供給されるデータとSatellite APIから取得されるデータが期待通りであることを保証するために、たくさんのチェックを設けています。これは非常にAnsibleらしいわけではありませんが、すべてができるだけ期待通りであることを絶対に確認したいので、予期しない結果を防ぐことができます。
上記のすべてが、この役割を非常に多様でありながら、非常に複雑にしています。私はコードの中の複雑な部分にコメントを付けて、ユーザーが何が起こっているのかを理解できるようにしました。
しかし、正直に言うとこの役割はAnsible初心者には向いていません。この役割のほとんどのコードは専用のAnsibleモジュールで処理されるべきであり、この役割で私がやっていることは純粋な狂気だと言えるかもしれません。あなたは正しいかもしれません。しかし、この種のコードが思ったほど珍しくないと思います。結局、Ansibleは異なるシステムを接続するのに優れていて、それには時には複雑さが必要だからです。残念ながら。
この役割の使用を考慮すべき時
以下のような場合、公式の redhat.satellite.content_view_publish
の代わりにこの役割を検討できます:
- コンテンツビューのバージョンやコンポジットコンテンツビューのバージョンを公開しながら、コンテンツビューの新しいバージョンやコンポジットコンテンツビューの新しいバージョンをプロモートしたい場合
- 新しいコンテンツビューやコンポジットコンテンツビューのバージョンを公開せずに、のみプロモートしたい場合(冪等性があります)
- プロモートしたいが、定義されたライフサイクル環境にのみプロモートしたい場合
- 定期的なパッチデー中に特定のコンテンツビューやコンポジットコンテンツビューを公開またはプロモートから除外したい場合
- コンテンツビューやコンポジットコンテンツビューの順序を気にせずに進めたい場合
- コンテンツビューのバージョンがプロモートされるライフサイクル環境を「動的」に制限したい場合(ただしYAMLを再定義せずに)。たとえば、毎週パッチを行う場合は、月曜日は
dev
のみ、火曜日はqa
、木曜日はprod
にプロモートしたい場合。 - 最新のコンテンツビューのバージョンが含まれるリポジトリの最終同期日より古い場合に基づき、コンテンツビューを公開し、オプションでプロモートしたい場合
- コンポジットコンテンツビューのみを公開し、オプションでプロモートしたい場合、含まれるコンポーネント(コンテンツビューのバージョン)が最新の公開以降に更新されているとき
- 公開前にすべてのリポジトリが以下であることを確認したい場合:
- 同期されている
- 最後の同期が成功した
- 現在同期中でないこと
- コンテンツビューやコンポジットコンテンツビューを公開、オプションでプロモートする前にリポジトリを同期したい場合
- 特定のリポジトリをチェックおよび/または同期から除外したい場合
- (この役割を介してトリガーされていない場合)現在同期中のリポジトリが完了するまで待ってから、コンテンツビュー/コンポジットコンテンツビューを公開し、オプションでプロモートしたい場合
Red Hat認定コレクション/上流Foreman Ansibleコレクションに対する貢献はなぜしなかったのか?
この役割が貢献に値するものなのか疑問です。理論上は、既存の役割content_view_publish
の代替として使用できるはずですが、非常に複雑であり、データ(ユーザー提供またはAPI)を検証する際に異なるアプローチを持っています。この役割はすべてを検証し、パッチデーに何も壊れないようにしています。これは、役割自体の実行速度よりも私が心配していることです。また、かなり複雑なYAMLマルチラインフィルタの「狂気」(私の意見では非常に良くコメントされています)を含んでおり、他の人には好まれない可能性があります。
この役割は、私自身のために主に書きました。私はそれが必要です。この役割がより広いオーディエンスにとって何かになる可能性はありますが、それがRed HatまたはForemanコミュニティが長期的に維持したいものかどうか(私がこの特定の役割のメンテイナーにサインアップしても)、話は別です。
オープンソースにおいては、次の3年、5年、10年などに現在の役割を維持できる保証はできませんので、私が何らかの理由で消える場合、redhat.satellite
やtheforeman.foreman
コレクションに含まれる場合は新しいメンテイナーが見つけられる必要があります。私はこの役割をしばらくの間維持することを本当に計画していますが、それを保証することはできません。他の人が維持するにはあまりにも複雑であると見なされた場合、どちらのコレクションにも含まれないでしょう。
正直に言うと、これはあまりにも複雑であるため、忍耐力を持つことはできません 😞。
この役割が考える「レガシー」の定義
[^legacy]: 役割 redhat.satellite.content_view_publish
および役割 theforeman.foreman.content_view_publish
は、次の形式でコンテンツビュー/コンポジットコンテンツビューの定義を受け入れます:
フォーマット1(レガシーaと呼ぶ)
satellite_content_views:
- 'content_view_name1'
- 'content_view_name2'
- 'content_view_name3'
- など。
フォーマット2(レガシーbと呼ぶ)
satellite_content_views:
- content_view: 'content_view_name1'
- content_view: 'content_view_name2'
- content_view: 'content_view_name3'
- など。
私の謙虚な意見では、双方のフォーマットは劣っています。
通常、リスト要素を名前で特定する必要がある場合は、name
属性が使用されます。これは、定義されたオブジェクトの型を示すものではありません。特に、同じコレクションの他の役割(redhat.satellite.content_views
や theforeman.foreman.content_views
)がname
属性を要求しています。
誤解しないでください、name
属性が定義されていないことが絶対に珍しいとは言っていませんが、名前でオブジェクトを識別する際にname
を使用することは、多少一般的な慣行ではないかと思います。
「文字列のリスト形式」(legacy_a
)はさらに制約されており、公開したいコンテンツビュー/コンポジットコンテンツビューのリストしか提供できません。それ以上はできず、他の属性はもちろん存在しません。この役割を始めるための簡単な方法に見えるかもしれませんが、実際には、各コンテンツビュー/コンポジットコンテンツビューの前にname:
を追加するのは、はるかに複雑ではありませんか?そうは思いません 😊。
正しい形式の使用
基本的に、次のようにコンテンツビュー/コンポジットコンテンツビューを指定します:
satellite_content_views:
- name: 'content_view_name1'
- name: 'content_view_name2'
- name: 'content_view_name3'
- など。
これには2つの利点があります:
- コンテンツビュー/コンポジットコンテンツビューの定義を役割(
redhat.satellite.content_views
)と完全に同じものにできます。 - この役割による変換を避けることで、パフォーマンスが大幅に向上します。
役割変数
変数 | デフォルト | 必須 | 説明 |
---|---|---|---|
satellite_username |
unset | true | Satellite APIに対して認証するためのユーザー名 |
satellite_password |
unset | true | Satellite APIに対して認証するためのユーザーのパスワード |
satellite_server_url |
unset | true | Satellite APIのURL(httpまたはhttpsを含む) |
satellite_organization |
unset | true | 操作を行うSatellite組織の名前 |
satellite_content_views |
unset | true | 公開及びオプションでプロモートするコンテンツビューとコンポジットコンテンツビュー |
satellite_validate_certs |
true |
false | Satellite APIへの接続時に証明書を検証するかどうか |
sat_api_timestamp_format |
%Y-%m-%d %H:%M:%S %Z |
false | Satellite APIでのタイムスタンプの表現形式 |
sat_async_max_time |
3600 |
false | 非同期タスクが時間切れになるまでの秒数 |
sat_async_poll_time |
0 |
false | 各非同期タスクのポーリング時間。公開/プロモートアクション中は0 に設定 |
sat_async_retries |
1200 |
false | 非同期タスクがfailed と判断されるまでのチェック頻度 |
sat_async_check_delay |
3 |
false | 非同期タスクが終了したかどうかをチェックする間の遅延 |
sat_quiet_assert |
true |
false | アサート文を静かにするかどうか |
sat_check_content_views_known |
true |
false | satellite_content_views で定義されたすべてのCV/CCVがSatelliteに知られているかどうか |
sat_check_synchronizing_repositories |
false |
false | 現在同期中のリポジトリを確認するかどうか |
sat_check_successful_repository_synchronization |
false |
false | リポジトリの最後の同期が成功したかどうかを確認するかどうか |
sat_check_unsynchronized_repositories |
false |
false | 同期されていないリポジトリがあるかどうかを確認 |
sat_composite_content_view_version_description |
Patch day YYYY-mm-dd |
false | コンポジットコンテンツビューのバージョンと同じ |
sat_composite_content_views_allowed_lifecycle_environments |
unset | false | プロモート可能なライフサイクル環境を制限します。 |
sat_content_view_version_description |
Patch day YYYY-mm-dd |
false | コンテンツビューのバージョンの説明。CVそのものの説明ではありません |
sat_content_view_kinds |
both |
false | 処理するコンテンツビューの種類 [^content_view_kinds] |
sat_content_views_allowed_lifecycle_environments |
unset | false | プロモート可能なライフサイクル環境を制限します。 |
sat_excluded_composite_content_views |
unset | false | すべてのアクティビティから除外されるコンポジットコンテンツビューを指定 |
sat_excluded_content_views |
unset | false | すべてのアクティビティから除外されるコンテンツビューを指定 |
sat_excluded_repositories |
unset | false | すべてのアクティビティ/チェックから除外されるリポジトリを指定 |
sat_ignore_missing_needs_publish_attribute |
false |
false | needs_publish 属性の欠如を無視するかどうか [^needs_publish] |
sat_publish_based_on_repository |
unset | false | リポジトリの同期日付に基づいてコンテンツビューを公開するか |
sat_publish_based_on_component |
unset | false | 含まれるコンポーネントに基づいてコンポジットコンテンツビューを公開するか |
sat_show_summary |
true |
false | この役割の最後に、すべての変更されたオブジェクトのリストを表示するかどうか |
sat_skip_legacy_conversion |
false |
false | 'レガシー' CV/CCV定義のオンザフライ変換をスキップするかどうか |
sat_skip_legacy_assert |
false |
false | 遺産形式を変換できるかどうかを確認するアサートを無効にする |
sat_skip_assert |
false |
false | すべての変数(assert.yml )をチェックするアサート文をスキップするかどうか |
sat_wait_for_repository_synchronization |
false |
false | リポジトリが同期を終了するまで待つかどうか |
sat_synchronize_repositories |
false |
false | 公開する前にリポジトリを同期するか |
sat_convert_yaml_file |
unset | false | 変換されたYAML定義が書き込まれるファイル(要求された場合) |
sat_convert_yaml_indent |
2 |
false | 変換されたYAMLが持つべきインデント(スペース数) |
sat_convert_yaml_sort_keys |
false |
false | YAMLをエクスポートする際に、キーを辞書順にソートするかどうか |
sat_convert_yaml_explicit_start |
true |
false | 変換ファイルに明示的なYAML開始タグ(--- )を追加するかどうか |
sat_convert_yaml_explicit_end |
true |
false | 変換ファイルに明示的なYAML終了タグ(... )を追加するかどうか |
sat_convert_yaml_use_custom_yaml_filter |
true |
false | この役割にパッケージされたカスタムYAMLフィルタを使用するかどうか |
sat_convert_yaml_top_key |
name |
false | CV/CCVを表す辞書のトップに特定のキーと値を配置するかどうか |
[^content_view_kinds]: この変数は、content_views
の値を持つ場合はコンテンツビューのみを処理し、composite_content_views
の値を持つ場合はコンポジットコンテンツビューのみを処理し、both
の値を持つ場合はどちらも処理します。このようにして、必要に応じて活動をコンテンツビューまたはコンポジットコンテンツビューのいずれかに制限できます。
[^needs_publish]: 長期間アクションが実行されていない場合(正確な期間は不明)、コンポジットコンテンツビューの needs_publish
属性は空(null
)になります。デフォルトでは、この役割は needs_publish
属性が定義されていないというエラーを表示します。sat_ignore_missing_needs_publish_attribute
変数を有効にすると、needs_publish
属性がないか、null
に設定されているコンポジットコンテンツビューは、公開が必要なコンポジットコンテンツビューに追加されます。これは、これらのコンポジットコンテンツビューの「コンポーネントベースの公開」を実質的に無効化します。他のすべてのコンポジットコンテンツビューは通常通り評価されます。
注意事項
sat_publish_based_on_repository
はコンテンツビューにのみ意味があります。したがって、コンポジットコンテンツビューにはスキップされます。sat_publish_based_on_component
はコンポジットコンテンツビューにのみ関連しており、コンポジットコンテンツビューは1つ以上のコンポーネント(=コンテンツビューのバージョン)から構成されます。
依存関係
この役割は、Red Hat認定コレクション redhat.satellite
を使用し、collections/requirements.yml
で指定されています。
例プレイブック
以下の例にはリポジトリとコンポーネントも含まれています。これは必要ありませんし、この役割で使用されません。これらを含むのは、この役割で使用する内容ビュー/コンポジットコンテンツビューの定義が redhat.satellite.content_views
で使用するのと同じであることを示すものです。
複雑な例
---
- hosts: 'localhost'
gather_facts: false
roles:
- name: 'satellite_content_view_publish_promote'
vars:
sat_async_max_time: 3900
sat_async_poll_time: 0
sat_async_retries: 2000
sat_async_check_delay: 2
sat_content_view_version_description: 'Patch day'
sat_composite_content_view_version_description: 'Patch day'
satellite_server_url: 'https://satellite.example.com'
satellite_organization: 'org-example'
sat_only_promote_content_views: false
sat_only_promote_composite_content_views: false
sat_publish_based_on_repository: true
sat_check_unsynchronized_repositories: true
sat_wait_for_repository_synchronization: true
sat_check_successful_repository_synchronization: true
sat_check_synchronizing_repositories: true
sat_content_view_kinds: 'both'
sat_synchronize_repositories: false
sat_check_content_views_known: true
sat_publish_based_on_component: true
satellite_content_views:
- name: 'cv-rhcdn-base-rhel-8'
lifecycle_environments:
- 'lce-default-dev'
- 'lce-default-prod'
repositories:
- name: 'Red Hat Enterprise Linux 8 for x86_64 - BaseOS RPMs 8'
product: 'Red Hat Enterprise Linux for x86_64'
- name: 'Red Hat Enterprise Linux 8 for x86_64 - AppStream RPMs 8'
product: 'Red Hat Enterprise Linux for x86_64'
- name: 'Red Hat Enterprise Linux 8 for x86_64 - BaseOS Kickstart 8.9'
product: 'Red Hat Enterprise Linux for x86_64'
- name: 'Red Hat Enterprise Linux 8 for x86_64 - AppStream Kickstart 8.9'
product: 'Red Hat Enterprise Linux for x86_64'
- name: 'cv-rhcdn-base-rhel-9'
lifecycle_environments:
- 'lce-default-dev'
repositories:
- name: 'Red Hat Enterprise Linux 9 for x86_64 - BaseOS RPMs 9'
product: 'Red Hat Enterprise Linux for x86_64'
- name: 'Red Hat Enterprise Linux 9 for x86_64 - AppStream RPMs 9'
product: 'Red Hat Enterprise Linux for x86_64'
- name: 'Red Hat Enterprise Linux 9 for x86_64 - BaseOS Kickstart 9.3'
product: 'Red Hat Enterprise Linux for x86_64'
- name: 'Red Hat Enterprise Linux 9 for x86_64 - AppStream Kickstart 9.3'
product: 'Red Hat Enterprise Linux for x86_64'
- name: 'cv-rhcdn-satellite_6_client-rhel-8'
patch_day_exclude: true
repositories:
- name: 'Red Hat Satellite Client 6 for RHEL 8 x86_64 RPMs'
product: 'Red Hat Enterprise Linux for x86_64'
- name: 'cv-rhcdn-satellite_6_client-rhel-9'
patch_day_exclude: true
repositories:
- name: 'Red Hat Satellite Client 6 for RHEL 9 x86_64 RPMs'
product: 'Red Hat Enterprise Linux for x86_64'
- name: 'ccv-default-rhel-8'
lifecycle_environments:
- 'lce-default-dev'
- 'lce-default-prod'
components:
- content_view: 'cv-rhcdn-base-rhel-8'
latest: true
- content_view: 'cv-rhcdn-satellite_6_client-rhel-8'
latest: true
- name: 'ccv-default-rhel-9'
lifecycle_environments:
- 'lce-default-dev'
components:
- content_view: 'cv-rhcdn-base-rhel-9'
latest: true
- content_view: 'cv-rhcdn-satellite_6_client-rhel-9'
latest: true
ライセンス
GPL-2.0-or-later
Publishes and optionally promotes Content View versions and Composite Content View versions.
ansible-galaxy install sscheib.satellite_publish_promote_content_views