Ansibleを使用してEC2インスタンスをセットアップし、アプリをデプロイしています。サーバーに関連するタグとグループ情報を収集するホストスクリプトがあります。これらのアクションを単一のプレイブックとして実行したいので、
ただし、インベントリは事前にロードされているため、プレイ中にサーバーが作成/更新された場合、サーバー/グループデータはありません。 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
しかし、私はそれを倍にするコマンドを見つけていません。
Ansible 2.0以降では、 task を実行することで、プレイ中にインベントリを更新できます。
- meta: refresh_inventory
meta: refresh_inventory
が不十分であることがわかりました。
最初にec2.py --refresh-cache
への明示的な呼び出しを追加する必要がありました。
-名前:インベントリの更新 ホスト:localhost 接続:ローカル gather_facts:False タスク: -名前:更新EC2 cache コマンド:/etc/ansible/ec2.py --refresh-cache -名前:メモリ内EC2キャッシュを更新 meta:refresh_inventory
現在、Ansibleはこれをサポートしていません。 ansible
またはansible-playbook
コマンドのソースコードを見ると、インベントリが最初にロードされ、インベントリオブジェクトが指定されたタスクまたはプレイブックを実行するansibleコマンドに渡されることがわかります。 。タスク/プレイブックハンドラー内で発生するようにインベントリ処理を移動することは、おそらくいくつかの理由でかなり大きな仕事です。
このようなことをするときの最善の策は、プレイブックを2つに分割し、呼び出しを1回だけ実行する必要があるシェルスクリプトでラップすることです。
Ec2.iniファイルを編集してオプションを設定することもできます。
cache_max_age = 0
そもそも何もキャッシュされないようにすることで、リロードの必要性を防ぎます。