Назад | Перейти на главную страницу

Как правильно экспортировать экологические ценности с помощью ansible playbook?

Я написал доступную книгу, которая должна установить инструмент под названием kafkacat.

Большинство задач в playbook работают, кроме одной (самой важной).

Я компилирую инструмент из исходного кода и успешно установил его вручную, используя шаги, которые я создаю в 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

Для работы процесса make необходимо знать экспорт, который я указал в задаче, но по какой-то причине кажется, что значения не экспортируются должным образом, и это приводит к сбою playbook:

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 _... имеют префикс пробела, который приведет к сбою проверки статической библиотеки.

Ваши env vars не были доступны во время configure фазы, поэтому они не использовались во время make. Взгляните на исходный код configure.base для kafkacat.

Из configure:

# Load base module
source mklove/modules/configure.base

Из configure.base:

# Tries to figure out if we can use a static library or not.
# Arguments:
#  library name   (e.g. -lrdkafka)
#  compiler flags (optional "", e.g: "-lyajl")
# Returns/outputs:
#  New list of compiler flags
function mkl_lib_check_static {
    local libname=$1
    local libs=$2
    local arfile_var=STATIC_LIB_${libname#-l}

    # If STATIC_LIB_<libname_without_-l> specifies an existing .a file we
    # use that instead.
    if [[ -f ${!arfile_var} ]]; then
    libs=$(echo $libs | sed -e "s|$libname|${!arfile_var}|g")
    else
        libs=$(echo $libs | sed -e "s|$libname|${LDFLAGS_STATIC} $libname ${LDFLAGS_DYNAMIC}|g")
    fi

    echo $libs
}

В другой ситуации вы могли убедиться, что ansible правильно настраивал env, выполнив быструю отладку.

  - name: Show environment
    shell: "env"
    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