Ansible执行Tomcat Native配置命令失败,手动执行正常求助
排查Ansible执行tomcat-native configure失败问题
问题场景
Ansible任务配置如下:
- name: configure tomcat apr native library become_user: root become: true shell: "./configure --with-ssl=/usr/local/ssl --with-java-home=/usr/lib/jvm/java-11-amazon-corretto" chdir: "/opt/tomcat/bin/tomcat-native-1.2.23-src/native" register: configureoutput
执行后报错:
./configure: line 3139: cd: /bin/apr-1-config//usr/lib64/apr-1/build: Not a directory cp: cannot stat '/apr_rules.mk': No such file or directory
对应configure文件3139行APR_BUILD_DIR="cd $APR_BUILD_DIR && pwd",说明APR_BUILD_DIR取值异常。但手动执行完全相同命令可正常生成Makefile,且该任务2月10日执行正常合并主分支,2月15日部署失败时代码提交哈希无变化、无MR/PR合并。
排查方向
1. 环境变量差异
Ansible的shell模块默认不加载用户完整环境变量(如.bashrc/.profile),而手动执行是在交互式shell中,环境变量更完整:
- 在任务中添加步骤打印关键环境变量,对比手动执行结果:
- name: Print key environment variables become_user: root become: true shell: echo $APR_BUILD_DIR && echo $PATH && which apr-1-config chdir: "/opt/tomcat/bin/tomcat-native-1.2.23-src/native" - 重点确认
apr-1-config是否在Ansible的PATH中,以及APR_BUILD_DIR是否被错误赋值。
2. 目标机器系统环境变更
代码未变,但2月10日到15日期间目标机器可能存在系统层面的变更:
- 检查APR依赖包状态:确认
apr-devel包是否存在,/usr/lib64/apr-1/build目录是否完好,apr-1-config命令能否正常执行。 - 检查系统自动更新:是否有yum/dnf自动更新导致依赖库版本变化,或
/opt/tomcat目录权限被修改(确认root用户能否正常访问该路径下所有文件)。
3. Ansible执行上下文差异
- 确认Ansible执行时的用户、工作目录与手动执行完全一致:比如手动执行是否也是root用户,是否在相同的chdir路径下。
- 尝试用登录shell执行命令,模拟手动执行的环境:
shell: bash -lc "./configure --with-ssl=/usr/local/ssl --with-java-home=/usr/lib/jvm/java-11-amazon-corretto"
4. 缓存或残留文件干扰
之前的执行可能残留错误的临时文件,导致本次执行异常:
- 清理残留文件后重新执行configure:
- name: Clean previous build artifacts become_user: root become: true shell: make clean && rm -f config.cache config.log chdir: "/opt/tomcat/bin/tomcat-native-1.2.23-src/native"
内容的提问来源于stack exchange,提问作者Evgeniy Pozdnyakov
相关产品推荐
相关产品推荐

