Ansibleとtelnet:そうではないが、本当に欲しい


Telnetは明らかに非常に安全ではないプロトコルであり、実際には完全に安全ではないため、使用を控えることを強くお勧めします。 正直に言うと、プルリクエストを拒否する可能性があります-MITMの可能性が生じた場合、それは単に傷ついた世界を求めているだけです。
-マイケルデハーン、Ansibleの作成者

まったく同感です。 ええと、SSH接続のためにリブート/フリーズする2万個のレガシースイッチがあり、機器の一部がそれをまったくサポートしていない場合はどうすればよいですか?
猫をお願いします。
UPD:バージョン2.5では個別のtelnetモジュールをリリースしたため、ガイドは古くなっています
docs.ansible.com/ansible/latest/modules/telnet_module.html


Ansibleの機能


Ssh


現在(リリース2.3.0)、Ansibleは3種類の接続を使用しています。


実際、SSHは2種類で構成され、トランスポートの使用が異なります-sshとparamiko。 後者は、バージョンAnsible 1.3より前にデフォルトで使用されていました。最新のディストリビューションは、スマートパラメーター(つまりOpenSSH)を使用し、多重化(コントロールマスター機能)を使用してSSHを大幅に高速化します。 レガシー機器との互換性のために、paramikoを使用して、モジュール/プレイブックを–c paramikoときに–c paramiko設定することをお勧めします。

重要:キー認証ではなくパスワード認証では、sshの代わりにsshpassが使用されます。

必要に応じてパッケージをインストールします。

 sudo apt-get install sshpass 

RHELベースのシステムの場合、EPELを有効にする必要があります

 yum --enablerepo=epel install sshpass 

SSHには、1つのコマンドを必要な数のホストに送信し、すべてのホストからの出力を表示する優れたrawモジュールがあります。 Telnetの場合、同様の機能を持つプレイブックを使用する必要があります。

Telnet


Telnetを使用するには、 ローカル接続タイプを使用する必要があります。 これは、PlaybookコマンドがAnsibleホスト上で直接実行されることを意味します(Pythonがリモートスイッチにインストールされる可能性は低いです)。

これを行うには、次をインストールします。

 sudo apt-get install telnet 

または

 yum install telnet 

また、 pipアドオンマネージャーから利用できるpexpectも必要です 。 PipはAnsibleとともにインストールされるので、実行するだけです:

 pip install pexpect 

環境の準備が完了しました。

在庫設定


標準ファイル/ etc / ansible / hostsを使用します


 [test_cluster] 192.168.0.[10:25] 

したがって、スイッチはtest_clusterエンティティの一部であり、192.168.0.10から192.168.0.25までのIPアドレスを持っています。 管理者権限で構成された単一のアカウントがあり、Telnetアクセスが許可されていると想定されています。

プレイブックを.yml形式で作成します


 --- - hosts: test_cluster gather_facts: false connection: local tasks: - name: telnet,login and execute command ignore_errors: true expect: command: telnet "{{ inventory_hostname }}" responses: (?i)username: "admin" (?i)password: "12345" (?i)#: "{{COMMAND}}\r\nlogout\r\nexit\r\nquit" echo: yes register: telnet_output - name: Debug output debug: var=telnet_output.stdout_lines 

順番に行きましょう:


 hosts: test_cluster 

接続しているホスト

 gather_facts: false 

通常、ネットワーク機器では機能しません。無効にする必要があります

 connection: local 

PexpectはAnsibleホスト上にのみあります。

 tasks: 

モジュールを使い始める

 ignore_errors: true 

出力で何が起こるかはわかりません。expectモジュールの機能が制限されているため、結果が失敗する可能性があります。 無効にすることをお勧めします。

 command: telnet "{{ inventory_hostname }}" 

Ansibleホストで実行され、すべてのリモートホストに接続します。

 responses: 

(?i)は、大文字と小文字が無視されることを意味します。
:期待することを示した後、応答します。
# -認証が成功したことを確認します。特権モードです。 コマンド変数と端末からの出口(logout / exit / quit)の組み合わせで応答します

expectを使用するには、リモートホストのCLIの完全な知識、Pythonの正規表現を処理するスキルの存在が必要です。 たとえば、行#: "save"を追加しても意味がありません。 マッチングは最初の条件でのみ発生します#: "{{COMMAND}}\r\nlogout\r\nexit\r\nquit"

 register: telnet_output 

出力を収集し、telnet_output変数に入れます。 Debugは便利な方法で出力を返します。

必要なコマンドを使用してプレイブックを開始します。

 ansible-playbook raw_telnet.yml -e '{"COMMAND":"show stp"}' 

実行結果:

  "Command: show stp", "", "", "", "STP Bridge Global Settings", "", "---------------------------", "", "STP Status : Enabled", "", "STP Version : RSTP", "", "Max Age : 20 ", "", "Hello Time : 2 ", "", "Forward Delay : 15 ", "", "Max Hops : 20 ", "", "TX Hold Count : 3 ", "", "Forwarding BPDU : Enabled", 

必要に応じて、ほとんどすべてを変数に置き換えることができ、プレイブックをまったく編集しません。 もちろん、パスワードをクリアテキストで保存することも安全ではありません。このVaultはAnsibleに存在するためです。

参考文献:


オリジナルのドキュメント
Ansible Basics
Ansible +ネットワーク

UPD:バージョン2.5では個別のtelnetモジュールをリリースしたため、ガイドは古くなっています
docs.ansible.com/ansible/latest/modules/telnet_module.html

Source: https://habr.com/ru/post/J328486/


All Articles