2016-10-14 33 views
1

は、私は、Cisco IOSに「でreload」コマンドを送信したいのですが、その具体的なコマンドは以下のように確認する必要がありますansible - Cisco IOSおよび「リロード」コマンド

#reload in 30 
Reload scheduled in 30 minutes by admin on vty0 (192.168.253.15) 
Proceed with reload? [confirm] 

それはdoesnのios_commandモジュールのようなSEMMSそのような場合は処理しないでください。 私の設定:

tasks: 
    - name: do reload in case of "catting off" 
    ios_command: 
     commands: reload in 30 
     commands: y 
     provider: "{{ cli }}" 

そして脚本からの応答:

TASK [do reload in case of "catting off"] ************************************** 
    task path: /etc/ansible/test1.yml:14 
    <192.168.0.33> ESTABLISH LOCAL CONNECTION FOR USER: root 
    <192.168.0.33> EXEC /bin/sh -c '(umask 77 && mkdir -p "` echo $HOME/.ansible/tmp/ansible-tmp-1476454008.17-103724241654271 `" && echo ansible-tmp-1476454008.17-103724241654271="` echo $HOME/.ansible/tmp/ansible-tmp-1476454008.17-103724241654271 `") && sleep 0' 
    <192.168.0.33> PUT /tmp/tmpAJiZR2 TO /root/.ansible/tmp/ansible-tmp-1476454008.17-103724241654271/ios_command 
    <192.168.0.33> EXEC /bin/sh -c 'LANG=pl_PL.UTF-8 LC_ALL=pl_PL.UTF-8 LC_MESSAGES=pl_PL.UTF-8 /usr/bin/python /root/.ansible/tmp/ansible-tmp-1476454008.17-103724241654271/ios_command; rm -rf "/root/.ansible/tmp/ansible-tmp-1476454008.17-103724241654271/" > /dev/null 2>&1 && sleep 0' 
    fatal: [192.168.0.33]: FAILED! => {"changed": false, "commands": ["y"], "failed": true, "invocation": {"module_args": {"auth_pass": null, "authorize": false, "commands": ["y"], "host": "192.168.0.33", "interval": 1, "password": "VALUE_SPECIFIED_IN_NO_LOG_PARAMETER", "port": 22, "provider": "{'username': 'admin', 'host': '192.168.0.33', 'password': '********'}", "retries": 10, "ssh_keyfile": null, "timeout": 10, "username": "admin", "waitfor": null}, "module_name": "ios_command"}, "msg": "matched error in response: y\r\n     ^\r\n% Invalid input detected at '^' marker.\r\n\r\nsw7.test.lab#"} 

どのように私はこれを扱うことができますか?


更新:

私はこのようなYAMLファイルにモジュールを期待して使用しようとすると:

name: some tests 
    hosts: sw-test 
    gather_facts: False 
# connection: local 

    tasks: 
    - name: do reload in case of "catting off" 
    expect: 
    command: reload in 30 
    responses: 
     'Reload scheduled in 30 minutes by admin on vty0 (192.168.253.20)\nProceed with reload? \[confirm\]' : y 
    echo: yes 

をしかし、接続に問題がある:

[email protected]:/etc/ansible# ansible-playbook test3 -u admin -k -vvvv 
Using /etc/ansible/ansible.cfg as config file 
SSH password: 
Loaded callback default of type stdout, v2.0 

PLAYBOOK: test3 **************************************************************** 
1 plays in test3 

PLAY [some tests] ************************************************************** 

TASK [do reload in case of "catting off"] ************************************** 
task path: /etc/ansible/test3:9 
<192.168.0.33> ESTABLISH SSH CONNECTION FOR USER: admin 
<192.168.0.33> SSH: EXEC sshpass -d12 ssh -C -vvv -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no -o User=admin -o ConnectTimeout=10 -o ControlPath=/root/.ansible/cp/ansible-ssh-%h-%p-%r 192.168.0.33 '/bin/sh -c '"'"'(umask 77 && mkdir -p "` echo $HOME/.ansible/tmp/ansible-tmp-1476882070.37-92402455055985 `" && echo ansible-tmp-1476882070.37-92402455055985="` echo $HOME/.ansible/tmp/ansible-tmp-1476882070.37-92402455055985 `") && sleep 0'"'"'' 
<192.168.0.33> PUT /tmp/tmp30wGsF TO "` echo $HOME/.ansible/tmp/ansible-tmp-1476882070.37-92402455055985 `") && sleep 0'"/expect 
<192.168.0.33> SSH: EXEC sshpass -d12 sftp -o BatchMode=no -b - -C -vvv -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no -o User=admin -o ConnectTimeout=10 -o ControlPath=/root/.ansible/cp/ansible-ssh-%h-%p-%r '[192.168.0.33]' 
fatal: [192.168.0.33]: UNREACHABLE! => {"changed": false, "msg": "SSH Error: data could not be sent to the remote host. Make sure this host can be reached over ssh", "unreachable": true} 
    to retry, use: --limit @/etc/ansible/test3.retry 

PLAY RECAP ********************************************************************* 
192.168.0.33    : ok=0 changed=0 unreachable=1 failed=0 


[email protected]:/etc/ansible# ansible-playbook test3 -u admin -k -vvvv -c ssh 
Using /etc/ansible/ansible.cfg as config file 
SSH password: 
Loaded callback default of type stdout, v2.0 

PLAYBOOK: test3 **************************************************************** 
1 plays in test3 

PLAY [some tests] ************************************************************** 

TASK [do reload in case of "catting off"] ************************************** 
task path: /etc/ansible/test3:9 
<192.168.0.33> ESTABLISH SSH CONNECTION FOR USER: admin 
<192.168.0.33> SSH: EXEC sshpass -d12 ssh -C -vvv -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no -o User=admin -o ConnectTimeout=10 -o ControlPath=/root/.ansible/cp/ansible-ssh-%h-%p-%r 192.168.0.33 '/bin/sh -c '"'"'(umask 77 && mkdir -p "` echo $HOME/.ansible/tmp/ansible-tmp-1476882145.78-139203779538157 `" && echo ansible-tmp-1476882145.78-139203779538157="` echo $HOME/.ansible/tmp/ansible-tmp-1476882145.78-139203779538157 `") && sleep 0'"'"'' 
<192.168.0.33> PUT /tmp/tmpY5qqyW TO "` echo $HOME/.ansible/tmp/ansible-tmp-1476882145.78-139203779538157 `") && sleep 0'"/expect 
<192.168.0.33> SSH: EXEC sshpass -d12 sftp -o BatchMode=no -b - -C -vvv -o 

ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no -o User=admin -o ConnectTimeout=10 -o ControlPath=/root/.ansible/cp/ansible-ssh-%h-%p-%r '[192.168.0.33]' 
    fatal: [192.168.0.33]: UNREACHABLE! => {"changed": false, "msg": "SSH Error: data could not be sent to the remote host. Make sure this host can be reached over ssh", "unreachable": true} 
     to retry, use: --limit @/etc/ansible/test3.retry 

    PLAY RECAP ********************************************************************* 
    192.168.0.33    : ok=0 changed=0 unreachable=1 failed=0 

[email protected]:/etc/ansible# ansible-playbook test3 -u admin -k -vvvv -c local 
Using /etc/ansible/ansible.cfg as config file 
SSH password: 
Loaded callback default of type stdout, v2.0 

PLAYBOOK: test3 **************************************************************** 
1 plays in test3 

PLAY [some tests] ************************************************************** 

TASK [do reload in case of "catting off"] ************************************** 
task path: /etc/ansible/test3:9 
<192.168.0.33> ESTABLISH LOCAL CONNECTION FOR USER: root 
<192.168.0.33> EXEC /bin/sh -c '(umask 77 && mkdir -p "` echo $HOME/.ansible/tmp/ansible-tmp-1476882426.62-172601217553809 `" && echo ansible-tmp-1476882426.62-172601217553809="` echo $HOME/.ansible/tmp/ansible-tmp-1476882426.62-172601217553809 `") && sleep 0' 
<192.168.0.33> PUT /tmp/tmpdq1pYy TO /root/.ansible/tmp/ansible-tmp-1476882426.62-172601217553809/expect 
<192.168.0.33> EXEC /bin/sh -c 'chmod u+x /root/.ansible/tmp/ansible-tmp-1476882426.62-172601217553809/ /root/.ansible/tmp/ansible-tmp-1476882426.62-172601217553809/expect && sleep 0' 
<192.168.0.33> EXEC /bin/sh -c 'LANG=pl_PL.UTF-8 LC_ALL=pl_PL.UTF-8 LC_MESSAGES=pl_PL.UTF-8 /usr/bin/python /root/.ansible/tmp/ansible-tmp-1476882426.62-172601217553809/expect; rm -rf "/root/.ansible/tmp/ansible-tmp-1476882426.62-172601217553809/" > /dev/null 2>&1 && sleep 0' 
fatal: [192.168.0.33]: FAILED! => {"changed": false, "failed": true, "invocation": {"module_args": {"chdir": null, "command": "reload in 30", "creates": null, "echo": true, "removes": null, "responses": {"Reload scheduled in 30 minutes by admin on vty0 (192.168.253.20)\\nProceed with reload? \\[confirm\\]": "y"}, "timeout": 30}, "module_name": "expect"}, "msg": "The command was not found or was not executable: reload."} 

NO MORE HOSTS LEFT ************************************************************* 
    to retry, use: --limit @/etc/ansible/test3.retry 

PLAY RECAP ********************************************************************* 
192.168.0.33    : ok=0 changed=0 unreachable=0 failed=1 

は、

更新

私はansible 2.3をインストールし、次のように試してみた

tasks: 
    - name: do reload in case of "catting off" 
     ios_command: 
     commands: 
     - reload in 30 
     - y 
     wait_for: 
     - result[0] contains "Proceed with reload" 
     provider: "{{ cli }}" 

しかし、それでもまだ、私はエラーを取得します。これは、iosモジュールが常にプロンプ​​トを応答として待つためだと思います。また、reloadコマンドの追加確認は、 "y"を押した後に "Enter"がないので、別の問題になる可能性があります。

$ sudo ansible-playbook test1.yml -vvvv 
    Using /etc/ansible/ansible.cfg as config file 
    Loading callback plugin default of type stdout, v2.0 from /usr/local/lib/python2.7/dist-packages/ansible/plugins/callback/__init__.pyc 

    PLAYBOOK: test1.yml ************************************************************ 
    1 plays in test1.yml 

    PLAY [testowe dzialania] ******************************************************* 

    TASK [do reload in case of "catting off"] ************************************** 
    task path: /home/user1/test1.yml:13 
    Using module file /usr/local/lib/python2.7/dist-packages/ansible/modules/core/network/ios/ios_command.py 
    <192.168.0.33> ESTABLISH LOCAL CONNECTION FOR USER: root 
    <192.168.0.33> EXEC /bin/sh -c '(umask 77 && mkdir -p "` echo $HOME/.ansible/tmp/ansible-tmp-1477557527.56-157304653717324 `" && echo ansible-tmp-1477557527.56-157304653717324="` echo $HOME/.ansible/tmp/ansible-tmp-1477557527.56-157304653717324 `") && sleep 0' 
    <192.168.0.33> PUT /tmp/tmphf8EWO TO /home/mszczesniak/.ansible/tmp/ansible-tmp-1477557527.56-157304653717324/ios_command.py 
    <192.168.0.33> EXEC /bin/sh -c 'chmod u+x /home/mszczesniak/.ansible/tmp/ansible-tmp-1477557527.56-157304653717324/ /home/mszczesniak/.ansible/tmp/ansible-tmp-1477557527.56-157304653717324/ios_command.py && sleep 0' 
    <192.168.0.33> EXEC /bin/sh -c '/usr/bin/python /home/mszczesniak/.ansible/tmp/ansible-tmp-1477557527.56-157304653717324/ios_command.py; rm -rf "/home/user1/.ansible/tmp/ansible-tmp-1477557527.56-157304653717324/" > /dev/null 2>&1 && sleep 0' 
    fatal: [192.168.0.33]: FAILED! => { 
     "changed": false, 
     "failed": true, 
     "invocation": { 
      "module_args": { 
       "auth_pass": null, 
       "authorize": false, 
       "commands": [ 
        "reload in 30", 
        "y" 
       ], 
       "host": "192.168.0.33", 
       "interval": 1, 
       "match": "all", 
       "password": "VALUE_SPECIFIED_IN_NO_LOG_PARAMETER", 
       "port": null, 
       "provider": { 
        "host": "192.168.0.33", 
        "password": "VALUE_SPECIFIED_IN_NO_LOG_PARAMETER", 
        "username": "admin" 
       }, 
       "retries": 10, 
       "ssh_keyfile": null, 
       "timeout": 10, 
       "transport": null, 
       "use_ssl": true, 
       "username": "admin", 
       "validate_certs": true, 
       "wait_for": [ 
        "result[0] contains \"Proceed with reload\"" 
       ] 
      }, 
      "module_name": "ios_command" 
     }, 
     "msg": "timeout trying to send command: reload in 30\r" 
    } 
      to retry, use: --limit @/home/user1/test1.retry 

    PLAY RECAP ********************************************************************* 
    192.168.0.33    : ok=0 changed=0 unreachable=0 failed=1 

誰かが問題を解決するにはどうすればよいですか?唯一の方法は、純粋なpythonスクリプトを使用するか、または自分自身が安全なモジュールを書くことですか?

- name: send reload command inc confirmation 
    ios_command: 
     commands: 
     - reload in 30 
     - y 
     wait_for: 
     - result[0] contains "Proceed with reload" 
     provider: "{{ cli }}" 

テストしたがios_commandモジュールの最後の例に類似していない:

+0

私はAnsibleの 'expect'モジュールを使用して答えを始めたが、あなたはすでに' ios_command'モジュールを使用しているとして、それはおそらく助けにはなりません。 – RichVel

+0

Cisco IOSデバイスでexpectモジュールを使用することはできますか。 –

答えて

1

あなたは使用することができます。

- name: reload device 
    ios_command: 
    commands: 
     - "reload in 1\ny" 
    provider: "{{ cli }}" 

これは、1分間にデバイスをリロードし、リロードプロンプトが受け入れられます。これは、iosのデフォルトのプロンプトが戻ってくるので(リロードが1分で開始されるため)、うまく動作します。

よろしく、 サイモン

+0

素晴らしい!それは実際に動作します!手伝ってくれてありがとう。 –

+0

これは私が探していたものです。そして最も良いことは...このaproachはとてもシンプルだということです;) –

0

Ansible 2.2にのみ

あなたはこのようなものを使用することができます。

Ansible 2.2には注意してください。まだリリースされておらず、新しいバージョンのAnsibleは大幅な後退を起こす可能性があります。

有効な2.0+にはexpect moduleが含まれていますが、これはリモートデバイスでPythonを必要とするため、IOSなどのデバイスでは機能しません。

+0

#ansible --version ansible 2.1.1.0 –

+0

TASK [ "オフcatting" の場合にはリロードしない] ************************** ************ 致命的:[192.168.0.33]:FAILED! => { "変更":偽、 "失敗":真、 "MSG": "モジュールのためのサポートされていないパラメータ:wait_for"} –

+0

apt-getを私は最新wersion –

0

commandsパラメータios_commandモジュールは、YAML形式のコマンドのリストを予期しています。しかし、コード例ではcommandsが複数回設定されています。

- name: do reload in case of "catting off" 
    ios_command: 
    commands: 
     - reload in 30 
     - y 
    provider: "{{ cli }}" 
+0

今、私はこのような応答を取得します: –

+0

「code'TASK [ 『オフcatting』の場合にはリロードしない] *************************** *********** 致命的:[192.168.0.33]:FAILED! => { "変更":偽、 "コマンド":[ "30にリロード"、 "Y"]、 "失敗":真、 "MSG": "タイムアウトがコマンドを送信しようと"} 'コード' –

+0

は思いますこれは、「リロードイン」を送信した後、通常のプロンプトを待っているからです。 –

0

最も簡単な方法は、デバイスに生のSSHコマンドを送信するために「生の」モジュールを使用するだろうと表示されます。このようなios_commandタスクを試してみてください。

これは、使用することを期待してios_commandモジュールで遊んでする必要がなくなります。

生のモジュールは、どのような応答またはデバイスを促しを気にすることなくコマンドを実行します。

関連する問題