播放期间发生Ansible SSH错误

时间:2017-04-05 15:00:49

标签: ssh ansible ansible-2.x

我和Ansible发生了一个奇怪的错误。首先,第一个角色正常工作,但是当Ansible尝试执行seconde时,由于ssh错误而失败了。

环境

  • OS:CentOS 7
  • Ansible版本:2.2.1.0
  • Python版本:2.7.5
  • OpenSSH版本:OpenSSH_6.6.1p1,OpenSSL 1.0.1e-fips 2013年2月11日

执行的Ansible命令

ansible-playbook -vvvv -i inventory/dev playbook_update_system.yml --limit "db[0]"

剧本

- name: "HUB Playbook | Updating system packages on {{ ansible_hostname }}"
  hosts: release_first_half
  roles:
    - upgrade_system_package
    - reboot_server

角色:upgrade_system_package

- name: "upgrading CentOS system packages on {{ ansible_hostname }}"
  shell: sudo puppet apply -e 'exec{"upgrade-package":command => "/usr/bin/yum clean all; /usr/bin/yum -y update;"}'
  when: ansible_distribution == 'CentOS' and 'cassandra' not in group_names

角色:reboot_server

- name: "reboot CentOS [{{ ansible_hostname }}] server"
  shell: sudo puppet apply -e 'exec{"reboot-os":command => "/usr/sbin/reboot"}'
  when: ansible_distribution == 'CentOS' and 'cassandra' not in group_names

当前行为

  1. 连接到“db1”节点并执行角色“upgrade system packages”=>行
  2. 尝试连接到“db1”并执行角色“rebo​​ot_server”=>由于ssh而失败。
  3. Ansible返回的错误消息

      

    致命:[db1]:无法访问! => {       “改变了”:错误,       “msg”:“无法通过ssh连接到主机:OpenSSH_6.6.1,OpenSSL 1.0.1e-fips 2013年2月11日\ r \ ndebug1:读取配置数据/USR/newtprod/.ssh/config\r\ndebug1:正在阅读配置数据/ etc / ssh / ssh_config \ r \ ndebug1:/ etc / ssh / ssh_config第56行:应用* \ r \ ndebug1:auto-mux的选项:尝试现有的主\ r \ ndebug2:fd 3设置O_NONBLOCK \ r \ ndebug2:mux_client_hello_exchange:主版本4 \ r \ ndebug3:mux_client_forwards:请求转发:0本地,0远程\ r \ ndebug3:mux_client_request_session:输入\ r \ ndebug3:mux_client_request_alive:输入\ r \ ndebug3:mux_client_request_alive:done pid = 64994 \ r \ ndebug3:mux_client_request_session:发送会话请求\ r \ ndebug1:mux_client_request_session:主会话ID:2 \ r \ ndebug3:mux_client_read_packet:读取头失败:管道损坏\ r \ n \ ndebug2:控制主机意外终止\ r \ n与db1的共享连接封闭的。\ r \ n”,       “无法到达”:是的   }

    我不明白,因为之前的角色已在此节点上成功执行。而且,我们有很多使用相同库存文件的剧本,它们工作正常。我尝试了另一个节点但结果相同。

1 个答案:

答案 0 :(得分:1)

这是一个简单且众所周知的问题:关闭进程会导致SSH守护程序退出,这会破坏当前的SSH会话(导致“损坏的管道”错误)。服务器正常重启,但Ansible流程中断。

您需要为shell命令添加延迟并使用async选项运行它,以便Ansible的SSH会话可以在被杀之前完成。

shell: sleep 5; sudo puppet apply -e 'exec{"reboot-os":command => "/usr/sbin/reboot"}'
async: 0
poll: 0