web-dev-qa-db-ja.com

Ansibleの動的インベントリをリロードする

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

  1. 必要に応じて新しいインスタンスが作成されます
  2. ホストスクリプトはインベントリ(サーバーのファクトを含む)を読み込みます
  3. 展開プレイブックの動作

ただし、インベントリは事前にロードされているため、プレイ中にサーバーが作成/更新された場合、サーバー/グループデータはありません。 1)プロビジョニングと展開のプレイブックを分離する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およびtwoの実行を参照してください。

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

しかし、私はそれを倍にするコマンドを見つけていません。

45

Ansible 2.0以降では、 task を実行することで、プレイ中にインベントリを更新できます。

- meta: refresh_inventory
44
James Orenthal

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

-名前:インベントリの更新
ホスト:localhost 
接続:ローカル
 gather_facts:False 
タスク:
-名前:更新EC2 cache 
コマンド:/etc/ansible/ec2.py --refresh-cache 
-名前:メモリ内EC2キャッシュを更新
 meta:refresh_inventory 
18
dsz

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

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

7
Bruce P

Ec2.iniファイルを編集してオプションを設定することもできます。

cache_max_age = 0

そもそも何もキャッシュされないようにすることで、リロードの必要性を防ぎます。

1
fuzzygroup