我写了一个 ansible playbook,它应该安装一个名为 kafkacat 的工具。
剧本中的大多数任务都有效,除了一项(最重要的一项)。
我正在从源代码编译该工具,并且我已经使用我在 ansible 中构建的步骤成功地手动安装了它。
剧本的相关部分是:
- name: Install kafkacat (configure)
command: chdir={{ kafkacat_installdir }} {{ kafkacat_installdir }}/configure --enable-json --enable-static
sudo: yes
- name: Install kafkacat (make)
command: chdir={{ kafkacat_installdir }} make
environment:
CPPFLAGS: ' -Itmp-bootstrap/usr/local/include'
STATIC_LIB_yajl: ' tmp-bootstrap/usr/local/lib/libyajl_s.a'
STATIC_LIB_rdkafka: ' tmp-bootstrap/usr/local/lib/librdkafka.a'
LIBS: ' -lpthread -lrt '
sudo: yes
- name: Install kafkacat (make install)
command: chdir={{ kafkacat_installdir }} make install
sudo: yes
“制作”过程需要知道我在任务中指定的导出,但由于某种原因,这些值似乎没有正确导出并且导致剧本失败:
failed: [kafka-1] => {"changed": true, "cmd": ["make"], "delta": "0:00:00.422669", "end": "2016-04-25 15:10:16.085697", "rc": 2, "start": "2016-04-25 15:10:15.663028", "warnings": []}
stderr: /usr/bin/ld: cannot find -lyajl
/usr/bin/ld: cannot find -lyajl
collect2: error: ld returned 1 exit status
make: *** [kafkacat] Error 1
stdout: gcc -MD -MP -Itmp-bootstrap/usr/local/include -g -O2 -Wall -Wfloat-equal -Wpointer-arith -g -O2 -Wall -Wfloat-equal -Wpointer-arith -c kafkacat.c -o kafkacat.o
gcc -MD -MP -Itmp-bootstrap/usr/local/include -g -O2 -Wall -Wfloat-equal -Wpointer-arith -g -O2 -Wall -Wfloat-equal -Wpointer-arith -c format.c -o format.o
gcc -MD -MP -Itmp-bootstrap/usr/local/include -g -O2 -Wall -Wfloat-equal -Wpointer-arith -g -O2 -Wall -Wfloat-equal -Wpointer-arith -c json.c -o json.o
找不到 -lyajl 的原因是导出不起作用。
我也试过做这样的事情:
- name: Install kafkacat (configure)
command: chdir={{ kafkacat_installdir }} CPFLAGS='CPPFLAGS= -Itmp-bootstrap/usr/local/include' STATIC_LIB_yajl='tmp-bootstrap/usr/local/lib/libyajl_s.a' STATIC_LIB_rdkafka='tmp-bootstrap/usr/local/lib/librdkafka.a' LIBS=' -lpthread -lrt' {{ kafkacat_installdir }}/configure --enable-json --enable-static
非常感谢您的帮助,并在此先感谢您,
看起来您的 STATIC_LIB_... 值以空格为前缀,这将使静态库检查失败。
您的环境变量在该
configure
阶段不可用,因此在make
. 查看 kafkacat 的 configure.base 源代码。来自
configure
:来自
configure.base
:在另一种情况下,您可以通过快速调试来验证 ansible 是否正确设置了环境