4

実際のシナリオでは、プレイブックの実行後に返される AWS の sqs のリソース ID を取得したいと考えています。したがって、ファイルでこの変数を使用してアプリケーションを構成します。

ある Playbook から別の Playbook への変数の永続化

ドキュメントをチェックアウトすると、set_fact や register などのモジュールは、その特定のホストに対してのみスコープを持ちます。あるホストから別のホストに変数を使用する目的は多数あります。

私が考えることができる代替案:

  1. コマンドモジュールを使用し、変数をファイルにエコーします。後で、vars セクションまたは include を使用して変数ファイルを使用します。

  2. 環境変数を設定してからアクセスしますが、これは難しいでしょう。

それで、解決策は何ですか?

4

4 に答える 4

6

事実を収集している場合は、通常の jinja2 + 変数ルックアップを介してホスト変数にアクセスできます。

例えば

- hosts: serverA.example.org
  gather_facts: True
  ...
  tasks:

    - set_fact:
        taco_tuesday: False 

次に、これが実行されている場合は、別のホストで:

- hosts: serverB.example.org
  ...
  tasks:

    - debug: var="{{ hostvars['serverA.example.org']['ansible_memtotal_mb'] }}"

    - debug: var="{{ hostvars['serverA.example.org']['taco_tuesday'] }}"

複数の Ansible コントロール マシン (呼び出し元と呼び出し先ansible)がある場合、Ansible が事実/変数をキャッシュ(現在は Redis と json) にansible-playbook保存できるという事実を利用する必要があることに注意してください。異なるホスト変数を持つ可能性が低くなります。これにより、コントロール マシンを共有フォルダー内のファイルを使用するように設定したり (これにはリスクがあります。2 つのコントロール マシンが同じホストで同時に実行されている場合はどうなるでしょうか?)、または Redis からファクトを設定/取得することができます。サーバ。

私の Amazon データの使用では、タグ/メタデータ ルックアップを使用して毎回リソースをフェッチすることを好みます。ホスト変数と実行順序について考えるよりもこれを好むので、これをもう少し簡単に行うことができる Ansible プラグインを作成しました (ただし、マイレージは異なる場合があります)

于 2015-09-03T14:00:28.640 に答える
1

コマンドラインで変数を渡すことができます: http://docs.ansible.com/ansible/playbooks_variables.html#passing-variables-on-the-command-line

ansible-playbook release.yml --extra-vars "version=1.23.45 other_variable=foo"

ローカル接続を使用して playbook = get variable を実行し、それを別の Playbook に適用できます。

- hosts: 127.0.0.1
  connection: local
  - shell: ansible-playbook -i ...
    register: sqs_id
  - shell: ansible-playbook -i ... -e "sqs_id={{sqs_id.stdout}}"

また、このシナリオでは委任が役立つ場合があります: http://docs.ansible.com/ansible/playbooks_delegation.html#delegation

また、出力をローカル ファイルに保存して使用することもできます ( http://docs.ansible.com/ansible/playbooks_delegation.html#delegation ): - name: sqs id を取得 local_action: command cat ~/sqs_id

PS:

変数を共有する多くのロールが含まれる複雑なプレイブックを作成できない理由がわかりません。

于 2015-09-10T10:41:51.947 に答える
0

すべてのサーバーがアクセスできるように、host_varsまたはこの方法で「共通」変数を書き込むことができます。group_vars

もう 1 つの方法は、カスタムを作成しansible module/lookup pluginて定型コードをすべて非表示にし、必要な変数に簡単かつ柔軟にアクセスできるようにすることです。

于 2015-09-03T13:31:02.480 に答える