背景情報

背景情報

1つのホストでのみAnsibleを使用してタスクを実行したいと思います。そのために私はパラメータを使いますrun_once

しかし、本当に驚くべきことは、タスクを実行するホストを選択するポリシーを指定できることです。たとえば、使用可能なメモリが最も高いホストです。

libvirtクラスタに新しいVMを作成するPlaybookにこの機能がある場合は、使用する予定です。

ベストアンサー1

私が知る限り、そのような包括的なメカニズムはありません。アクションは、ゲーム内の一致する項目(パラメータなど)hostsと最終的にコマンドラインで使用される制約(-lAnsible PlayBookなどのオプション)に基づいてインベントリの最初のホストで開始され、そのホストで実行されます。次に(run_once使用している場合)使用を中止します。

これまで目標を達成する方法があると思います。

背景情報

  • Ansibleは一部を維持します。マジック変数この中で:
    • ansible_play_hosts- 現在ゲームを実行しているアクティブホストのリストはシリアル番号(別名「バッチ」)に制限されます。
    • hostvars- インベントリ内のすべてのホストとホストに割り当てられた変数を含むハッシュマップ
  • 各ホストで利用可能なメモリはで確認できますansible_memfree_mb。この変数は、コンソールからファクトを収集する場合にのみ存在します(つまり、gather_facts: noゲームでこの機能をオフにしていない場合)。
  • このソリューションは2つのフィルタを使用しているため、さらに詳しく見たい場合があります。
    • map関連ホスト情報のみを抽出できます。hostvars
    • json_query(実装jmespath)を使用すると、変数のリストをフィルタリングして最大メモリを見つけ、最終的には関連ノードのホスト名のみを取得できます。

提案されたソリューション

以下のプレイブックは、上記の要素を組み合わせて目標を達成する方法を示しています。ジョブはrun_oncedelegate_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インスタンスを持つマニフェストに対してのみテストしたので、出力は実際には関連性がありません(すべてのインスタンスは利用可能なメモリが同じで、選択した最初のインスタンスは独自に委任されます)。しかし、私はそれがうまくいくと確信しており、すべてではなくてもいくつかの最終的な問題に対応するために編集する準備ができています。

おすすめ記事