我和Ansible发生了一个奇怪的错误。首先,第一个角色正常工作,但是当Ansible尝试执行seconde时,由于ssh错误而失败了。
环境:
执行的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
当前行为:
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”, “无法到达”:是的 }
我不明白,因为之前的角色已在此节点上成功执行。而且,我们有很多使用相同库存文件的剧本,它们工作正常。我尝试了另一个节点但结果相同。
答案 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