1つのホストでのみAnsibleを使用してタスクを実行したいと思います。そのために私はパラメータを使いますrun_once
。
しかし、本当に驚くべきことは、タスクを実行するホストを選択するポリシーを指定できることです。たとえば、使用可能なメモリが最も高いホストです。
libvirtクラスタに新しいVMを作成するPlaybookにこの機能がある場合は、使用する予定です。
答え1
私が知る限り、そのような包括的なメカニズムはありません。アクションは、ゲーム内の一致する項目(パラメータなど)hosts
と最終的にコマンドラインで使用される制約(-l
Ansible PlayBookなどのオプション)に基づいてインベントリの最初のホストで開始され、そのホストで実行されます。次に(run_once
使用している場合)使用を中止します。
これまで目標を達成する方法があると思います。
背景情報
- Ansibleは一部を維持します。マジック変数この中で:
ansible_play_hosts
- 現在ゲームを実行しているアクティブホストのリストはシリアル番号(別名「バッチ」)に制限されます。hostvars
- インベントリ内のすべてのホストとホストに割り当てられた変数を含むハッシュマップ
- 各ホストで利用可能なメモリはで確認できます
ansible_memfree_mb
。この変数は、コンソールからファクトを収集する場合にのみ存在します(つまり、gather_facts: no
ゲームでこの機能をオフにしていない場合)。 - このソリューションは2つのフィルタを使用しているため、さらに詳しく見たい場合があります。
map
関連ホスト情報のみを抽出できます。hostvars
json_query
(実装jmespath
)を使用すると、変数のリストをフィルタリングして最大メモリを見つけ、最終的には関連ノードのホスト名のみを取得できます。
提案されたソリューション
以下のプレイブックは、上記の要素を組み合わせて目標を達成する方法を示しています。ジョブはrun_once
、delegate_to
およびの組み合わせを使用してdelegate_facts
最初に選択されたかのように、特定のホストで実行されます。
---
- name: Delegate single running task to dynamically chosen host
hosts: all
gather_facts: true
vars:
max_mem_query: max_by(@, &ansible_memfree_mb).inventory_hostname
selected_host: >-
{{
ansible_play_hosts |
map('extract', hostvars) |
list |
json_query(max_mem_query)
}}
tasks:
- name: Run a command on host with most memory
debug:
msg: "I would run on host {{ inventory_hostname }}"
run_once: true
delegate_to: "{{ selected_host }}"
delegate_facts: true
ノート:私のプレイブックを検証するために2つのローカルDockerインスタンスを持つマニフェストに対してのみテストしたので、出力は実際には関連性がありません(すべてのインスタンスは利用可能なメモリが同じで、選択した最初のインスタンスは独自に委任されます)。しかし、私はそれがうまくいくと確信しており、すべてではなくてもいくつかの最終的な問題に対応するために編集する準備ができています。