2017-01-05 15 views
1

この質問はこの記事からいくつかの歴史を持っている:Auto exit Telnet command back to prompt without human intervention ^] quit close exit code 1Ansible - telnetが失敗した - コマンド/シェルモジュールを - RCリターンコード1失敗しました:真

ところで、私はどこtelnetコマンドを使用してポートをテストしようとしていますポートはOPENまたはNOTにできます。私はどうすればAnsibleで同じことができますか?

は私が commandモジュールと shellモジュールなどを試してみました 'rc': 1

次けど(ポートが開いているか開いていないかどうか/それは無効です)、Ansibleは常に結果または出力辞書変数で'failed': true言うと戻りコードを試してみましたまあ、それは動作しませんでした。

これを実行するには、このtelnetコマンドを正常に実行する必要があります(プレイブックのタスクで定義されている)次のアクションが機能するようにします。

マイ脚本スニペット:(私は上記のshellのいずれかのコマンドを使用している場合)、次のコマンドを使用してansible-playbookを実行

- name: Ensure collector agent's proxy_address and proxy_port is open 
    #command: "echo -e \"^]\\nclose\"| telnet {{ proxy_address }} {{ proxy_port }}" 
    #shell: "echo -e \"^]\\nclose\" | telnet `hostname` {{ proxy_port }}" 
    shell: "telnet `hostname` {{ proxy_port }}" 
    register: telnet_result 
    ignore_errors: yes 
    tags: 
    - giga 

- debug: msg="telnet output result was = {{ telnet_result }}" 
    tags: 
    - giga 

、私にfollwoingエラーになります。

PS:ファイルmyplaybook.ymlは、ロールmytaskを呼び出すだけです。

ansible-playbook -i inventory -l localhost myplaybook.yml --extra-vars "proxy_port=2878" -t giga -vvv 

出力:

TASK [mytask : Ensure collector agent's proxy_address and proxy_port is open] *** 
task path: /home/vagrant/aks/ansible/roles/mytask/tasks/install_telegraf.yml:3 
<localhost> ESTABLISH LOCAL CONNECTION FOR USER: vagrant 
<localhost> EXEC /bin/sh -c '(umask 77 && mkdir -p "` echo $HOME/.ansible/tmp/ansible-tmp-1483580659.49-61726964686488 `" && echo ansible-tmp-1483580659.49-61726964686488="` echo $HOME/.ansible/tmp/ansible-tmp-1483580659.49-61726964686488 `") && sleep 0' 
<localhost> PUT /tmp/tmpoVYTlY TO /home/vagrant/.ansible/tmp/ansible-tmp-1483580659.49-61726964686488/command 
<localhost> EXEC /bin/sh -c 'chmod u+x /home/vagrant/.ansible/tmp/ansible-tmp-1483580659.49-61726964686488/ /home/vagrant/.ansible/tmp/ansible-tmp-1483580659.49-61726964686488/command && sleep 0' 
<localhost> EXEC /bin/sh -c 'sudo -H -S -n -u root /bin/sh -c '"'"'echo BECOME-SUCCESS-asjgqzogcakikhnvwamwruivfbutphtz; LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 /usr/bin/python /home/vagrant/.ansible/tmp/ansible-tmp-1483580659.49-61726964686488/command; rm -rf "/home/vagrant/.ansible/tmp/ansible-tmp-1483580659.49-61726964686488/" > /dev/null 2>&1'"'"' && sleep 0' 
fatal: [localhost]: FAILED! => {"changed": true, "cmd": "telnet `hostname` 2878", "delta": "0:00:00.006042", "end": "2017-01-05 01:44:19.590362", "failed": true, "invocation": {"module_args": {"_raw_params": "telnet `hostname` 2878", "_uses_shell": true, "chdir": null, "creates": null, "executable": null, "removes": null, "warn": true}, "module_name": "command"}, "rc": 1, "start": "2017-01-05 01:44:19.584320", "stderr": "Connection closed by foreign host.", "stdout": "Trying 127.0.0.1...\r\nConnected to myvagrant.\r\nEscape character is '^]'.", "stdout_lines": ["Trying 127.0.0.1...", "Connected to myvagrant.", "Escape character is '^]'."], "warnings": []} 
...ignoring 

TASK [mytask : debug] ************************************* 
task path: /home/vagrant/aks/ansible/roles/mytask/tasks/install_telegraf.yml:12 
ok: [localhost] => { 
    "msg": "telnet output result was = {u'changed': True, u'end': u'2017-01-05 01:44:19.590362', u'stdout': u\"Trying 127.0.0.1...\\r\\nConnected to myvagrant.\\r\\nEscape character is '^]'.\", u'cmd': u'telnet `hostname` 2878', 'failed': True, u'delta': u'0:00:00.006042', u'stderr': u'Connection closed by foreign host.', u'rc': 1, 'stdout_lines': [u'Trying 127.0.0.1...', u'Connected to myvagrant.', u\"Escape character is '^]'.\"], u'start': u'2017-01-05 01:44:19.584320', u'warnings': []}" 
} 

PLAY RECAP ********************************************************************* 
localhost     : ok=3 changed=0 unreachable=0 failed=0 

答えて

2

failed_when: <your_condition>、例えば:

failed_when: false 

以外にも、あなたはwait_forモジュールを模倣しようとしているように見えます。

+0

これは、「失敗しました:偽」(すべての場合、特に、開いていない誤った/ポートの場合)に役立ちません。しかし、私はあなたの答えが好きだったのでそれを受け入れるだろう:)私がそれを変更したとき: 'failed_when: '接続が拒否された' telnet_result.stderr" '私のケースでは、 )、正しくない/開いていないポート(期待される)に対して失敗しました。右? –

+0

はい。あなたが質問にあなたの目標を指定していないので、それは私が "あなたの条件"で意味するものです。 「偽」がその一例です。登録された出力を継続して使用して、他のタスクを制御することもできます。 – techraf

+0

はい、私は 'ignore_errors:yes'を使用するとレジスタから+ .stdout/stderrなどのdict変数を使用しているのを見ました。 'failed_when:'がうまくいった!ありがとう。 –

関連する問題