Ansible Network FAQ

ネットワークの Playbook のパフォーマンスを改善するにはどうすればよいですか?

複数のホストで実行している場合は、strategy: free を検討

strategy プラグインは、複数のホストで複数のタスクに順序を付ける方法を Ansible に指示します。ストラテジー は Playbook レベルに設定されます。

デフォルトのストラテジーは linear です。ストラテジーを linear に設定すると、Ansible は現在のタスクがすべてのホストで実行されるまで待ってから、ホストで次のタスクを開始します。Ansible にはフォークを解放できますが、すべてのホストが現在のタスクを完了するまで使用されません。次のタスクを実行する前に、Playbook の各タスクをすべてのホストで成功させる必要がある場合は、linear ストラテジーを使用します。

free ストラテジーを使用すると、Ansible は利用可能なフォークを使用して、できるだけ迅速に各ホストでタスクを実行します。以前のタスクがホストで実行している場合でも、Ansible は他のホストで後でタスクを実行します。free ストラテジーは、利用可能なフォークをより効率的に使用します。各タスクで Playbook が停止し、単一の低速なホストが待機している場合に、全体のパフォーマンスを向上させるには、strategy: free を使用することを検討してください。

絶対に必要な場合にのみ show running を実行

show running コマンドは、クエリーをネットワーク OS が処理する方法であるため、ネットワークデバイスで実行する最もリソース集約的なコマンドです。Ansible Playbook でこのコマンドを使用すると、特に大きなデバイスでパフォーマンスが大幅に低下します。これを繰り返すと、パフォーマンスへの影響が増大します。実行中の設定を確認する Playbook がある場合には、変更を実行してから、実行中の設定を再度確認すると、Playbook が非常に遅くなるはずです。

絶対に必要な場合にのみ ProxyCommand を使用

ネットワークモジュールは、ProxyCommand パラメーターを使用した プロキシーまたはジャンプホスト の<network_delegate_to_vs_ProxyCommand> 使用をサポートします。ただし、ジャンプホストを使用する場合、Ansible は、永続的な接続タイプ (network_cli または netconf) を使用している場合であっても、すべてのタスクに新しい SSH 接続を開く必要があります。バージョン 2.5 で導入された永続的な接続タイプによるパフォーマンスの利点を最大化するために、可能な場合はジャンプホストを使用しないでください。

ニーズに合わせて --forks の設定

Ansible がタスクを実行するたびに、独自のプロセスをフォークします。--forks パラメーターは、同時タスクの数を定義します。デフォルト設定 (--forks=5) を保持し、Playbook を 10 台のホストで実行している場合、そのうちの 5 台は、フォークが利用可能になるまで待機する必要があります。当然ながら、許可するフォークが多くなると、Ansible が使用するメモリーおよび処理能力が増えます。ほとんどのネットワークタスクは制御ホスト上で実行されるため、ラップトップはすぐに CPU またはメモリーをバインドできます。

出力が ******** に置き換えられることがある理由

Ansible は、パスワードを含む no_log とマークされたすべての文字列を、Ansible 出力の ******** に置き換えます。これは、機密データを保護するために設計上行われます。ほとんどのユーザーは、自身のパスワードが伏字になることを希望します。ただし、Ansible はパスワードと一致するすべての文字列を ****** に置き換えます。パスワードに共通する単語を使用する場合は、これが問題になる可能性があります。たとえば、パスワードとして Admin を選択すると、Ansible は、出力の Admin という単語の全インスタンスを ******** に置き換えます。これにより、出力が読みにくくなります。この問題を回避するには、Ansible 出力の別の場所では使用しない安全なパスワードを選択します。

省略されたコマンドで、*_config モジュールが常に changed=true を返す理由

ネットワークデバイスで直接コマンドを実行する場合は、短縮コマンドを使用できます。たとえば、int g1/0/11interface GigabitEthernet1/0/11 の動作は同じです。同様に shut および shutdown の動作も同じです。Ansible Network *_command モジュールは、ネットワーク OS でコマンドを実行するため、省略形で機能します。

ただし、設定をコミットすると、ネットワーク OS は省略形を長い形式のコマンドに変換します。GigabitEthernet1/0/11shut または shutdown を使用しているかどうかに関わらず、設定の結果は同じ (shutdown) になります。

Ansible Network *_config モジュールは、lines で指定するコマンドのテキストを、設定のテキストと比較します。タスクの lines セクションで shut を使用し、設定が shutdown を読み込む場合は、設定がすでに正しくても、モジュールは changed=true を返します。タスクを実行すると、毎回設定が更新されます。

この問題を回避するには、*_config モジュールで長い形式のコマンドを使用します。

---
- hosts: all
  gather_facts: no
  tasks:
    - ios_config:
        lines:
          - shutdown
        parents: interface GigabitEthernet1/0/11