Ansible:開いているポートのtelnetチェックに利用できる他のオプションは?


15

私はAnsibleが初めてです。これが私の仕事です...

400以上のホストがあり、5つの異なるポートがエンドからWebサーバーに開いているかどうかを確認する必要があります。

個別に、ログインして実行できました。

telnet mywebserver.com 443
telnet mywebserver.com 80
telnet mywebserver.com 8443

..等々..

どのモジュールまたはプラグインをAnsibleで使用できるので、これを自動化し、結果(開いているポートまたは閉じているポート)をAnsibleサーバーに報告させることができますか?

回答:


28

特定のTCPポートが開いていることを確認するAnsible wait_forモジュールを使用できます。

この場合、すべてのポートがすでに開いている必要があるため、最小のnoを使用できます。ネットワークの問題をカバーするのに十分な再試行回数:

- name: Check all port numbers are accessible from current host
  wait_for:
    host: mywebserver.com
    port: "{{ item }}"
    state: started         # Port should be open
    delay: 0               # No wait before first check (sec)
    timeout: 3             # Stop checking after timeout (sec)
  ignore_errors: yes
  with_items:
    - 443
    - 80
    - 80443

デフォルトでは、Ansibleはsleep毎秒1回チェックします(属性を使用してAnsible 2.3で構成可能)ので、これはポートごとに3回チェックします。

400以上のホストのインベントリに対してプレイブックでこれを実行します-Ansibleは、すべてのホストがmywebserver.comそれらのポートに到達できることを並行してチェックします。

我々は使用ignore_errors: yesエラーが赤でマークされているが、実行を停止しないように、ここで。

開いたポートはok出力のアイテムとして報告され、閉じたポートは報告されfailedます(この出力を表示するには-vvフラグをオンにansible-playbookする必要があります)。

出力の微調整

成功および失敗の場合により具体的な出力が必要な場合、コードはより複雑で、2番目のタスクを追加する必要があります。

  • wait_forタスクはregister変数でなければなりません
  • 2番目のタスクはdebug、成功/失敗条件に基づいて(たとえば、Jinja2 条件式を使用して)出力を生成します
  • 次に、これらのタスクを両方ともインクルードファイルに(with_itemsループなしで)配置し、include... with_itemsを使用してポートごとに1回インクルードファイルを呼び出すメインプレイブックタスクを作成する必要があります。

重要なのは、設定する必要があることですhost: mywebserver.com
モニカチェリオのボイコットSE

@XiongChiamiov- host: x必須ではありません。Ansible 2.3.1で再テストしたところhostwait_forタスクの属性はインベントリから処理されている現在のサーバーにデフォルト設定されています。
-RichVel

まさに、これがOPがそれをオーバーライドする必要がある理由です。彼らはすべてのサーバーから別のWebサーバーへの接続テストしています(質問を読み直してください)。
モニカチェリオのボイコットSE

2
良い点は、hosts属性で回答を更新したことです。
-RichVel

ありがとうございました!これは私にとっては有効であり、作業するのに十分です。
AWhitaker

2

私の知る限り、この目的のための組み込みモジュールはありませんが、shell+ を使用できますnc

---
- hosts: all
  tasks:
    - shell: nc -z -w 1 -G 1 my.hostname.com {{ item }} || echo "Port {{ item }} is closed"
      with_items: [80,443,8443]

2
ありがとう、これも機能しますが、プレイをさらにカスタマイズできるので、最初の提案を選ぶことにしました。
AWhitaker

-G 1マニュアルページで見つからないものは何ですか?
lonix

0

同じためにwait_forモジュールを使用できます

ドキュメントから引用された例:

- name: Wait 300 seconds for port 8000 of any IP to close active connections, don't start checking for 10 seconds
  wait_for:
    host: 0.0.0.0
    port: 8000
    delay: 10
    state: drained

投稿を適切にフォーマットしてください。StackExchangeネットワーク上のすべてのサイトで同じマークダウンが許可されています。フォーマットのドキュメントはこちら
Tensibai

3
ところで、私はあまりにも失敗し、既にRichVel答えにされていない、この答えが追加されますか見て
Tensibai

0

このようなタスクには、ツールdda-serverspec(https://github.com/DomainDrivenArchitecture/dda-serverspec-crate)を使用します。あなたの期待を定義することができます

{:netcat [{:host "mywebserver.com" :port "443"} {:host "telnet mywebserver.com" :port "80"} {:host "telnet mywebserver.com" :port "8443"}]}

そして、ローカルホストまたはsshによるリモートに対してこれらの期待をテストします。リモートテストの場合、ターゲットを定義する必要があります。

{:existing [{:node-name "test-vm1"
:node-ip "35.157.19.218"}
{:node-name "test-vm2" :node-ip "18.194.113.138"}] :provisioning-user {:login "ubuntu"}}

次の方法でテストを実行できます java -jar dda-serverspec.jar --targets targets.edn serverspec.edn

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.