-1

Azure クラウド リソースを作成するためのロールを含む Ansible プレイブックがあります。グループ変数は、これらのリソースを作成するためのパラメーターを設定するために使用されます。インベントリ ファイルには複数のグループが含まれており、それらのグループは子孫ノードとして再生されます。

問題は、クラウド アクションを実行するためのターゲットが localhost であるため、すべてのグループ変数が一度に取得されることです。在庫は次のとおりです。

[cloud:children]
cloud_instance_a
cloud_instance_b

[cloud_instance_a:children]
azure_infrastructure

[cloud_instance_b:children]
azure_infrastructure

[azure_infrastructure]
127.0.0.1 ansible_connection=local ansible_python_interpreter=python

プレイブックには、実行される実際のロールを参照する azure_infrastructure プレイが含まれています。

このロールは localhost に対して 2 回実行されますが、そのたびに cloud_instance_a と cloud_instance_b の両方のグループ変数が読み込まれます。2 回実行したいのですが、最初に cloud_instance_a 変数がロードされ、2 回目に cloud_instance_b 変数がロードされます。

とにかくこれを行うことはありますか?本質的に、私は、これらが異なるターゲットであると思わせる localhost の疑似ホストを探しています。これを回避できる唯一の方法は、2 つの異なるインベントリを作成することです。

4

1 に答える 1

1

とにかく、プレイブックがどのように見えるかを推測するのは少し難しいです...

インベントリーのホスト/グループ変数はホストにバインドされているため、ホストには常にインベントリー変数のセットが 1 つしかないことに注意してください (異なるグループで定義された変数は互いに上書きされます)。

コントロール マシンでいくつかのタスクまたはプレイを実行する場合は、connection: localfor play またはlocal_action:for tasks を使用できます。

たとえば、このホスト ファイルの場合:

[group1]
server1
[group2]
server2
[group1:vars]
testvar=aaa
[group2:vars]
testvar=zzz

あなたはこれを行うことができます:

- hosts: group1:group2
  connection: local
  tasks:
    - name: provision
      azure: ...
- hosts: group1:group2
  tasks:
    - name: install things
      apk: ...

またはこれ:

- hosts: group1:group2
  gather_facts: no
  tasks:
    - name: provision
      local_action: azure: ...
    - name: gather facts
      setup:
    - name: install things
      apk:

この例では、 testvar=aaaforserver1testvar=zzzfor server2.
静止azureアクションは制御ホストから実行されます。

setup2 番目の例では、Ansible がプロビジョニングされていない可能性のあるサーバーに接続するのを防ぐために、ファクト収集をオフにして手動で呼び出す必要があります。

于 2016-11-03T07:57:44.717 に答える