Ansible无法启动GoCD go-agent服务问题求助
问题描述
手动执行service go-agent start可正常启动Go Agent服务,但使用Ansible的systemd或service模块均无法启动服务,尝试过的两个Ansible任务如下:
任务1(systemd模块)
- name: start go-agent service systemd: name: go-agent enabled: yes state: started daemon_reload: yes masked: no
任务2(service模块)
- name: start go-agent service service: name: go-agent enabled: yes state: started
服务器配置信息
systemd服务文件(/etc/systemd/system/go-agent.service)
[Unit] Description=go-agent After=syslog.target [Service] Type=forking ExecStart=/bin/env /var/go/go-agent.sh User=go KillMode=control-group Environment=SYSTEMD_KILLMODE_WARNING=true [Install] WantedBy=multi-user.target
启动脚本(/var/go/go-agent.sh)
#!/bin/bash source /etc/default/go-agent cd /var/lib/go-agent # Get installed java version VER=$(rpm -q --queryformat "%{VERSION}" java-1.8.0-openjdk.x86_64) # Find the location of the installed java binary JAVA=$(find /usr/lib/jvm -mount -name jre-1.8.0-openjdk-$VER*)/bin/java exec ${JAVA} -Dcruise.console.publish.interval=10 -Xms128m -Xmx256m -Dgocd.agent.log.dir=/var/log/go-agent -Djava.security.egd=file:/dev/./urandom -Dagent.plugins.md5=950122d2619875fe04e845271cdf44dc -Dagent.binary.md5=sd97fys7dfs7dhf7wmwc8n== -Dagent.launcher.md5=bcm94rgnmortnjghgreg== -Dagent.tfs.md5=jfn3ud8fcv5t49if34fr== -jar /var/lib/go-agent/agent.jar -serverUrl https://server:port -sslVerificationMode NONE &
手动启动后的进程信息
[root@server]# service go-agent start Started Go Agent. [root@server]# ps aux | grep go-agent go 28528 14.9 3.9 2546064 81264 ? Sl 00:44 0:03 java -Dgocd.agent.log.dir=/var/log/go-agent -Dgocd.redirect.stdout.to.file=/var/log/go-agent/go-agent-bootstrapper.out.log -jar /usr/share/go-agent/agent-bootstrapper.jar -serverUrl https://server:port/go go 28792 31.8 7.0 2302236 144372 ? Sl 00:44 0:06 /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.342.b07-1.amzn2.0.1.x86_64/jre/bin/java -Dcruise.console.publish.interval=10 -Xms128m -Xmx256m -Dgocd.agent.log.dir=/var/log/go-agent -Djava.security.egd=file:/dev/./urandom -Dagent.plugins.md5=950122d2619875fe04e845271cdf44dc -Dagent.binary.md5=sd97fys7dfs7dhf7wmwc8n== -Dagent.launcher.md5=bcm94rgnmortnjghgreg== -Dagent.tfs.md5=jfn3ud8fcv5t49if34fr== -jar /var/lib/go-agent/agent.jar -serverUrl https://server:port -sslVerificationMode NONE & root 29307 0.0 0.0 121272 936 pts/0 S+ 00:44 0:00 grep --color=auto go-agent [QA3 root@exim0 go-agent]#
问题原因分析
Systemd服务类型不匹配
服务文件中设置Type=forking,要求启动脚本必须fork出子进程后父进程退出,但脚本最后使用exec ... &:exec会替换当前进程,加上&后后台运行,导致systemd无法正确识别服务启动状态——systemd会认为父进程退出即服务启动完成,但实际java进程是后台运行的子进程,systemd无法跟踪,因此判定启动失败。而手动执行service命令时,检测逻辑更宽松,因此能正常启动。缺失PIDFile配置
Type=forking模式下,systemd需要通过PIDFile字段跟踪服务主进程的PID,但当前service文件未配置该字段,进一步导致systemd无法确认服务是否成功启动。脚本后台运行的冲突
脚本最后加了&让java进程后台运行,而systemd管理服务时,更适合让进程在前台运行(由systemd负责后台管理),后台运行的进程会脱离systemd的控制。
修复方案
1. 修改Systemd服务文件
将服务类型改为simple(适配脚本中exec替换进程的行为,systemd可直接跟踪主进程),并添加WorkingDirectory替代脚本中的cd命令,同时去掉冗余的/bin/env(脚本自带shebang可直接执行):
[Unit] Description=go-agent After=syslog.target [Service] Type=simple ExecStart=/var/go/go-agent.sh User=go KillMode=control-group Environment=SYSTEMD_KILLMODE_WARNING=true WorkingDirectory=/var/lib/go-agent [Install] WantedBy=multi-user.target
2. 修改启动脚本
去掉最后一行的&,让java进程在前台运行,由systemd负责管理后台:
#!/bin/bash source /etc/default/go-agent # Get installed java version VER=$(rpm -q --queryformat "%{VERSION}" java-1.8.0-openjdk.x86_64) # Find the location of the installed java binary JAVA=$(find /usr/lib/jvm -mount -name jre-1.8.0-openjdk-$VER*)/bin/java exec ${JAVA} -Dcruise.console.publish.interval=10 -Xms128m -Xmx256m -Dgocd.agent.log.dir=/var/log/go-agent -Djava.security.egd=file:/dev/./urandom -Dagent.plugins.md5=950122d2619875fe04e845271cdf44dc -Dagent.binary.md5=sd97fys7dfs7dhf7wmwc8n== -Dagent.launcher.md5=bcm94rgnmortnjghgreg== -Dagent.tfs.md5=jfn3ud8fcv5t49if34fr== -jar /var/lib/go-agent/agent.jar -serverUrl https://server:port -sslVerificationMode NONE
3. 更新Ansible任务
确保先更新服务文件、重载systemd daemon,再启动服务:
- name: Update go-agent systemd service file copy: content: | [Unit] Description=go-agent After=syslog.target [Service] Type=simple ExecStart=/var/go/go-agent.sh User=go KillMode=control-group Environment=SYSTEMD_KILLMODE_WARNING=true WorkingDirectory=/var/lib/go-agent [Install] WantedBy=multi-user.target dest: /etc/systemd/system/go-agent.service mode: '0644' - name: Reload systemd daemon systemd: daemon_reload: yes - name: Start and enable go-agent service systemd: name: go-agent enabled: yes state: started
4. 验证脚本执行权限
确保启动脚本有执行权限:
- name: Ensure go-agent script is executable file: path: /var/go/go-agent.sh mode: '0755'
内容的提问来源于stack exchange,提问作者netrangermike

