我管理一个 Jenkins 服务器(运行 2.89.4),上面连接了大约 40 个节点,每个节点都运行 Centos7、OSX 或 Windows(7、8、10)。最近,我们遭遇了几次停电,许多从属服务器与主服务器失去了连接。这需要大量手动远程和 ssh 操作才能将它们全部重新连接。因为,我已确保每个从属进程都在运行服务器,但我希望有一个额外的安全网,能够自动重启这些从属进程所运行的每个虚拟机和/或机器。问题是,由于有几种不同类型的操作系统,因此没有一种简单的方法可以做到这一点(就我所知)。
我尝试过使用 Groovy 脚本,但它主要只能用于重新启动从属服务,而不是机器本身。这是我的参考: https://wiki.jenkins.io/display/JENKINS/Monitor+and+Restart+Offline+Slaves
我也研究过 Ansible 方法,但许多机器无法访问,并且 Ansible 需要针对 Windows 和 Unix 的不同类型的脚本。
到目前为止我见过的最好的方法是: https://stackoverflow.com/questions/29165080/restart-jenkins-slave-from-master
但它没有解释如何在每个从属服务器上运行它,它只是看起来像在一个从属服务器上执行。以前有其他人做过类似的事情吗?我想创建一个可以执行的单个作业或单个脚本,它会重新启动shutdown -r -f
连接到 Jenkins 的每个节点(使用类似命令),无论平台如何。
答案1
我通过创建多配置作业并按名称选择所有从属设备解决了这个问题。然后,我根据“执行节点”添加了两个条件步骤。对于第一个,我只选择了 Windows 从属设备,对于第二个,我只选择了 Mac/Centos 从属设备。对于每个条件步骤,我添加了一个步骤:对于 Windows 条件,执行 Windows 批处理命令;对于 unix 部分,执行 Shell。以下分别是我的批处理和 Shell 框的内容:
批:
echo "Restarting Windows Machine...."
hostname
shutdown -r -f
壳:
echo "Restarting Unix Machine...."
hostname
sudo shutdown -r now
我暂时在工作中注释掉了关机步骤,这样就不会在测试前意外重启所有程序。在尝试运行此操作之前,请务必取消注释这些步骤。