Ansible Tower を Cloud Assembly に統合すると、展開されたリソースの構成管理をサポートできます。統合の設定後、クラウド テンプレート エディタを使用して、新しい展開または既存の展開に Ansible Tower 仮想コンポーネントを追加できます。

前提条件

  • 管理者以外のユーザーに、Ansible Tower へのアクセスに適切な権限を付与します。ほとんどの構成で機能する 2 つのオプションがあります。構成に最適なオプションを選択してください。
    • 組織レベルでインベントリ管理者ロールおよびジョブ テンプレート管理者ロールをユーザーに付与します。
    • 特定のインベントリに対する管理者権限と、プロビジョニングに使用するすべてのジョブ テンプレートに対する実行ロールをユーザーに付与します。
  • 展開で使用する認証情報とテンプレートを Ansible Tower で適切に設定する必要があります。テンプレートには、ジョブ テンプレートまたはワークフロー テンプレートを使用できます。ジョブ テンプレートでは、展開で使用するインベントリと Playbook を定義します。ジョブ テンプレートと Playbook は 1:1 でマッピングされます。Playbook では、YAML に似た構文を使用して、テンプレートに関連付けられたタスクを定義します。最も一般的な展開では、認証にマシンの認証情報を使用します。

    ワークフロー テンプレートを使用すると、ユーザーはジョブ テンプレート、プロジェクト同期、インベントリ同期の任意の構成によるシーケンスを作成することで、これらを相互にリンクして 1 つのユニットとして実行できます。Ansible Tower Workflow Visualizer は、ユーザーがワークフロー テンプレートを設計するのに役立ちます。最も一般的な展開では、認証にマシンの認証情報を使用できます。

    1. Ansible Tower にログインして、[テンプレート] セクションに移動します。
    2. [新規ジョブ テンプレートの追加] を選択します。
      • すでに作成されている認証情報を選択します。これらは、Ansible Tower で管理されるマシンの認証情報です。それぞれのジョブ テンプレートでは、認証情報オブジェクトを 1 つ使用できます。
      • [制限] の選択項目では [起動時にプロンプトを表示] を選択します。これにより、Cloud Assembly からプロビジョニングまたはプロビジョニング解除されるノードに対して、ジョブ テンプレートが実行されます。このオプションが選択されていない場合は、ジョブ テンプレートを含むブループリントを展開するときに、「制限が設定されていない」という旨のエラーが表示されます。
    3. 新規ワークフロー テンプレートの追加を選択します。
      • すでに作成されている認証情報を選択し、インベントリを定義します。Workflow Visualizer を使用して、ワークフロー テンプレートを設計します。

      ワークフロー テンプレートまたはジョブ テンプレートの [制限] ボックスでは、通常、[起動時にプロンプトを表示] を選択します。この選択により、ジョブ テンプレートまたはワークフロー テンプレートは、Cloud Assembly からプロビジョニングまたはプロビジョニング解除されるノードに対して実行されます。

  • Cloud Assembly から起動されたジョブ テンプレートまたはワークフロー テンプレートの実行は、[Ansible Tower ジョブ] タブで確認できます。

手順

  1. [インフラストラクチャ] > [接続] > [統合] の順に選択して、[統合の追加] をクリックします。
  2. [Ansible Tower] をクリックします。
    Ansible の設定画面が表示されます。
  3. Ansible Tower インスタンスの [ホスト名](IP アドレスも可)とその他の必須情報を入力します。
  4. 該当する Ansible Tower インスタンスのユーザー インターフェイス ベース認証の [ユーザー名][パスワード] を入力します。
  5. [検証] をクリックして、統合を検証します。
  6. 統合の [名前][説明] を適切に入力します。
  7. [追加] をクリックします。

結果

Ansible Tower はクラウド テンプレートで使用できます。

次のタスク

目的のクラウド テンプレートに Ansible Tower コンポーネントを追加します。統合アカウントで指定されたユーザーに対して、実行権限を含む適切なジョブ テンプレートを指定する必要があります。

  1. [クラウド テンプレート キャンバス] 画面のブループリント オプション メニューで、[構成管理] の見出しの下にある [Ansible] を選択し、Ansible Tower コンポーネントをキャンバスにドラッグします。
  2. 右側のパネルで、ジョブ テンプレートなどの該当する Ansible Tower プロパティを構成します。

Ansible Tower タイルをクラウド テンプレートに追加すると、vRealize Automation は接続された仮想マシンのホスト エントリを Ansible Tower に作成します。デフォルトでは、vRealize Automation は仮想マシンのリソース名を使用してホスト エントリを作成しますが、ブループリント YAML の hostName プロパティを使用して任意の名前を指定できます。マシンと通信するために、vRealize Automation はホスト エントリのホスト変数 ansible_host: IP Address を作成します。デフォルトの動作をオーバーライドして、FQDN を使用して通信を構成できます。それには、キーワード ansible_hosthostVariables 下で指定し、その値として FQDN を指定します。次の YAML コード スニペットは、ホスト名と FQDN の通信を構成する方法の例を示しています。

Cloud_Ansible_Tower_1:
	type: Cloud Ansible Tower
	properties:
		host: name of host
		account: name of account
		hostName: resource name
		hostVariables:
			ansible_host:Host FQDN
			

この例では、FQDN を指定して、ansible_host のデフォルト値をオーバーライドします。これは、Ansible Tower を FQDN を使用してホスト マシンに接続するユーザーに役立つ場合があります。

YAML 内の hostVariables のデフォルト値は ansible_host:IP_address で、IP アドレスがサーバとの通信に使用されます。

Ansible Tower の YAML count プロパティが 1 を超える場合、ホスト名はそれぞれの仮想マシンのプロパティにマッピングできます。次の例は、アドレス プロパティをホスト名にマッピングする場合の Ubuntu-VM という名前の仮想マシン リソースのマッピングを示しています。

 hostname: '${resource.Ubuntu-VM.address[count.index]}' 

Ansible Tower コンポーネントをクラウド テンプレートに追加する際に、呼び出すジョブ テンプレートをクラウド テンプレート YAML で指定できます。ワークフロー テンプレート、またはジョブ テンプレートとワークフロー テンプレートの組み合わせを指定することもできます。テンプレート タイプを指定しない場合、デフォルトでは、vRealize Automation はジョブ テンプレートを呼び出すと見なします。

次の YAML スニペットは、Ansible Tower クラウド テンプレートでジョブ テンプレートとワークフロー テンプレートの組み合わせを呼び出す方法の例を示しています。

Cloud_Ansible_1:
type: Cloud.Ansible.Tower
  properties:
    host: ‘${resource.CentOS_Machine.*}’
    account:
    maxConnectionRetries: 2
    maxJobRetries: 2
    templates:
      provision:
        - name: My workflow
          type: workflow
        - name: My job template      

Ansible 関連の障害を処理するために、maxConnectionsRetries および maxJobRetries を追加しました。クラウド テンプレートはカスタム値を受け入れ、値が指定されていない場合はデフォルト値を使用します。maxConnectionRetries のデフォルト値は 10、maxJobRetries のデフォルト値は 3 です。

注: vRealize Automation の以前のバージョンでジョブ テンプレートの実行がサポートされていたのは、クラウド テンプレートで jobTemplate スキーマを使用する場合だけでした。今回、jobTemplate は非推奨となり、今後のリリースで削除される可能性があります。現時点では、jobTemplate プロパティを使用しても引き続き想定どおりに動作します。ワークフロー テンプレートを実行して追加機能を使用するには、テンプレート スキーマを使用することをお勧めします。

Ansible Tower 統合のための Cloud Assembly クラウド テンプレートには true または false の値を持つ useDefaultLimit プロパティが含まれ、これにより、Ansible テンプレートが実行される場所が決まります。Ansible テンプレートには、ジョブ テンプレートまたはワークフロー テンプレートを使用できます。この値を true に設定すると、指定されたテンプレートは Ansible テンプレート画面の [制限] ボックスで指定されたマシンに対して実行されます。値が false に設定されている場合、テンプレートはプロビジョニングされたマシンに対して実行されますが、ユーザーは Ansible Tower テンプレート画面の [起動時にプロンプトを表示] チェックボックスをオンにする必要があります。デフォルトでは、このプロパティの値は false です。次の YAML の例は、クラウド テンプレートで useDefaultLimit プロパティがどのように記述されるかを示しています。

templates:
  provision:
    - name: ping aws_credentials
      type: job
      useDefaultLimit: false
      extraVars: '{"rubiconSurveyJob" : "checkSurvey"}'

また、前の例に示すように、extraVars プロパティを使用して追加の変数または調査変数を指定できます。この機能は、入力を要求するテンプレートを実行するときに役立ちます。ユーザーが調査変数を管理している場合は、エラーを回避するために、クラウド テンプレートの extraVars セクションで変数を渡す必要があります。

クラウド管理者権限を持つユーザーは、Ansible オープン ソースおよび Ansible Tower のリソースを含む展開のプロジェクトを変更できます。この機能は、展開レベルで Day 2 アクションとして使用できます。

Ansible 展開のプロジェクトを変更するには、Cloud Assembly の [展開] 画面に表示されているように展開の [アクション] メニューで [プロジェクトの変更] オプションを選択し、ターゲット プロジェクトを選択して、表示されたダイアログで [送信] をクリックします。

Ansible Tower 統合はグループ プロパティをサポートしていませんが、次の記事で説明するように、仮想マシン タグと VMware インベントリ プラグインを使用して同等の機能を実装することもできます。https://docs.ansible.com/ansible/latest/collections/community/vmware/vmware_vm_inventory_inventory.html

ユーザーがこの機能を有効にするには、次の 2 つの変更を行う必要があります。
  • クラウド テンプレートで ansible_host(FQDN など)と hostName を使用します。
  • AWX で、起動時に更新するフラグをオンにします。つまり、Playbook を実行する前に、新しいホストの vCenter Server と同期するようにします。この同期により、vRealize Automation によって追加され、VMware インベントリ プラグインによってインポートされた FQDN ホスト エントリがマージされ、ホストがグループに割り当てられます。インベントリ グループは、上記の同期ソース変数を使用して仮想マシン タグの値から作成されます。

実装例については、次のクラウド テンプレートを参照してください。

# Created by Quickstart wizard.
name: RHEL 8
version: 0.0.1
formatVersion: 1
inputs:
  image:
    type: string
    description: Select an OS Version
    default: RHEL 8 Base
    enum:
      - RHEL 8 Base
      - RHEL 7 Base
  AWX:
    type: string
    description: Choose AWX Environment
    enum:
      - LabAWX
      - FA/CC-AWX
  envrionmnetTag:
    type: string
    description: Choose VM Environment
    enum:
      - cel
      - mag
      - wdr
  purposeTag:
    type: string
    description: Choose Server Purpose
    default: ''
    enum:
      - ''
      - mariadb
      - oracle
  authGroupTag:
    type: string
    description: Choose Authentication Group
    default: ''
    enum:
      - ''
      - dbo_linux
      - oracle
      - postgres
  hostname:
    type: string
    description: Desired hostname
    default: changeme
  cpuCount:
    type: integer
    description: Number of virtual processors
    default: 1
  totalMemoryMB:
    type: integer
    description: Machine virtual memory size in Megabytes
    default: 1024
  disk1Size:
    type: integer
    description: A SIZE of 0 will disable the disk and it will not be provisioned.
    default: 0
  disk2Size:
    type: integer
    description: A SIZE of 0 will disable the disk and it will not be provisioned.
    default: 0
  neededip:
    type: string
    description: Enter an available IP Address
    title: Needed-IP-Address
  vlan:
    type: string
    description: Enter in needed vlan
    title: Enter VLAN ID example "vl500"
resources:
  Cloud_Ansible_Tower_1:
    type: Cloud.Ansible.Tower
    metadata:
      layoutPosition:
        - 0
        - 0
    properties:
      host: ${resource.Cloud_vSphere_Machine_1.*}
      account: ${input.AWX}
      hostName: ${input.hostname}
      hostVariables:
        ansible_host: ${input.hostname}.dcl.wdpr.disney.com
      templates:
        provision:
          - name: Linux-Role
  Cloud_vSphere_Machine_1:
    type: Cloud.vSphere.Machine
    metadata:
      layoutPosition:
        - 0
        - 1
    properties:
      image: ${input.image}
      Infoblox.IPAM.Network.dnsSuffix: dcl.wdpr.disney.com
      Infoblox.IPAM.Network.dnsView: Internal
      customizationSpec: Rhel7Base
      name: ${input.hostname}
      cpuCount: ${input.cpuCount}
      totalMemoryMB: ${input.totalMemoryMB}
      attachedDisks: ${map_to_object(resource.Cloud_Volume_1[*].id + resource.Cloud_Volume_2[*].id, "source")}
      networks:
        - network: ${resource.Cloud_vSphere_Network_1.id}
          assignment: static
          address: ${input.neededip}
      tags:
        - key: Server-Team
          value: ${input.envrionmnetTag}
        - key: Server-Team
          value: ${input.purposeTag}
        - key: Server-Team
          value: ${input.authGroupTag}
  Cloud_Volume_1:
    type: Cloud.Volume
    metadata:
      layoutPosition:
        - 0
        - 2
    properties:
      count: '${input.disk1Size == 0 ? 0 : 1 }'
      capacityGb: ${input.disk1Size}
  Cloud_Volume_2:
    type: Cloud.Volume
    metadata:
      layoutPosition:
        - 0
        - 3
    properties:
      count: '${input.disk2Size == 0 ? 0 : 1}'
      capacityGb: ${input.disk2Size}
  Cloud_vSphere_Network_1:
    type: Cloud.vSphere.Network
    metadata:
      layoutPosition:
        - 1
        - 0
    properties:
      networkType: existing
      constraints:
        - tag: ${input.vlan}