sscheib.satellite_publish_promote_content_views

ansible-lint Publish latest release to Ansible Galaxy

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 の代わりにこの役割を検討できます:

  1. コンテンツビューのバージョンやコンポジットコンテンツビューのバージョンを公開しながら、コンテンツビューの新しいバージョンやコンポジットコンテンツビューの新しいバージョンをプロモートしたい場合
  2. 新しいコンテンツビューやコンポジットコンテンツビューのバージョンを公開せずに、のみプロモートしたい場合(冪等性があります)
  3. プロモートしたいが、定義されたライフサイクル環境にのみプロモートしたい場合
  4. 定期的なパッチデー中に特定のコンテンツビューやコンポジットコンテンツビューを公開またはプロモートから除外したい場合
  5. コンテンツビューやコンポジットコンテンツビューの順序を気にせずに進めたい場合
  6. コンテンツビューのバージョンがプロモートされるライフサイクル環境を「動的」に制限したい場合(ただしYAMLを再定義せずに)。たとえば、毎週パッチを行う場合は、月曜日はdevのみ、火曜日はqa、木曜日はprodにプロモートしたい場合。
  7. 最新のコンテンツビューのバージョンが含まれるリポジトリの最終同期日より古い場合に基づき、コンテンツビューを公開し、オプションでプロモートしたい場合
  8. コンポジットコンテンツビューのみを公開し、オプションでプロモートしたい場合、含まれるコンポーネント(コンテンツビューのバージョン)が最新の公開以降に更新されているとき
  9. 公開前にすべてのリポジトリが以下であることを確認したい場合:
    • 同期されている
    • 最後の同期が成功した
    • 現在同期中でないこと
  10. コンテンツビューやコンポジットコンテンツビューを公開、オプションでプロモートする前にリポジトリを同期したい場合
  11. 特定のリポジトリをチェックおよび/または同期から除外したい場合
  12. (この役割を介してトリガーされていない場合)現在同期中のリポジトリが完了するまで待ってから、コンテンツビュー/コンポジットコンテンツビューを公開し、オプションでプロモートしたい場合

Red Hat認定コレクション/上流Foreman Ansibleコレクションに対する貢献はなぜしなかったのか?

この役割が貢献に値するものなのか疑問です。理論上は、既存の役割content_view_publishの代替として使用できるはずですが、非常に複雑であり、データ(ユーザー提供またはAPI)を検証する際に異なるアプローチを持っています。この役割はすべてを検証し、パッチデーに何も壊れないようにしています。これは、役割自体の実行速度よりも私が心配していることです。また、かなり複雑なYAMLマルチラインフィルタの「狂気」(私の意見では非常に良くコメントされています)を含んでおり、他の人には好まれない可能性があります。

この役割は、私自身のために主に書きました。私はそれが必要です。この役割がより広いオーディエンスにとって何かになる可能性はありますが、それがRed HatまたはForemanコミュニティが長期的に維持したいものかどうか(私がこの特定の役割のメンテイナーにサインアップしても)、話は別です。

オープンソースにおいては、次の3年、5年、10年などに現在の役割を維持できる保証はできませんので、私が何らかの理由で消える場合、redhat.satellitetheforeman.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_viewstheforeman.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
ライセンス
gpl-2.0
ダウンロード
252
所有者
Software Developer, Sysadmin, Linux and Open Source enthusiast