49

Ansible を使用して EC2 インスタンスをセットアップし、アプリをデプロイしています。タグ関連のサーバーとグループ情報を収集するホスト スクリプトがあります。これらのアクションを 1 つの Playbook として実行したいので、

  1. 必要に応じて新しいインスタンスが作成されます
  2. ホスト スクリプトがインベントリをロードします (サーバーのファクトを含む)
  3. デプロイ プレイブックが機能する

ただし、インベントリは事前にロードされるため、プレイ中にサーバーが作成/更新された場合、サーバー/グループのデータはありません。1) プロビジョニングとデプロイの Playbook を分離する 2) add_host トリックを使用して、サーバーの更新時に動的インベントリをエミュレートできますが、これらのアプローチには欠点があります。

Ansible にインベントリーを強制的にリロードさせることはできますか? 私のテストファイルは次のとおりです: hostsスクリプト:

#!/bin/sh
echo `date` >> log.log
echo "{\"standalone\":[\"localhost\"]}"

サンプルplaybook.yml:

---
- hosts: all
  tasks:
    - name: show inventory_hostname
      command: echo {{ inventory_hostname }}

実行するansible-playbook -i hosts playbook.yml -vと、次の 2 つの実行が表示されます。

$> cat log.log
Thu Mar 12 09:43:16 SAMT 2015
Thu Mar 12 09:43:16 SAMT 2015

しかし、それを2倍にするコマンドが見つかりませんでした。

4

7 に答える 7

21

meta: refresh_inventoryでは不十分であることが わかりました。
最初に明示的な呼び出しを追加する必要がありましたec2.py --refresh-cache

- 名前: インベントリの更新
  ホスト: ローカルホスト
  接続: ローカル
  収集_事実: 偽
  タスク:
    - 名前: EC2 キャッシュを更新する
      コマンド: /etc/ansible/ec2.py --refresh-cache
    - 名前: メモリ内 EC2 キャッシュを更新します
      メタ: refresh_inventory
于 2016-09-07T22:59:38.393 に答える
6

Ansible は現在、これをサポートしていません。ansibleまたはコマンドのソースコードをansible-playbook見ると、インベントリが最初にロードされ、次に指定されたタスクまたは Playbook を実行する ansible コマンドにインベントリ オブジェクトが渡されることがわかります。タスク/プレイブック ハンドラー内で実行されるようにインベントリ処理を移動することは、多くの理由からおそらくかなりの作業になるでしょう。

このようなことを行うときの最善の策は、単純に Playbook を 2 つに分割し、それらの呼び出しを 1 回だけ呼び出す必要があるシェル スクリプトにラップすることです。

于 2015-03-12T11:33:42.523 に答える