Este es un seguimiento de esta pregunta. Estoy tratando de usar Ansible para aprovisionar una VM Vagrant. La VM está ejecutando CentOS 6.4. Estoy usando el siguiente libro de jugadas ansible (abreviado):
- hosts: default
vars:
home: '/home/vagrant'
curl_version: '7_19_7'
curl_url: 'https://github.com/bagder/curl/archive/curl-{{ curl_version }}.tar.gz'
curl_dir: '{{ home }}/curl-curl-{{ curl_version }}'
# user: vagrant
remote_user: vagrant
sudo: yes
tasks:
- name: Ensure required packages and installed and up to date - pt1
yum: pkg={{ item }} state=present
with_items:
- make
- gcc
- etc...
# Lots more yum tasks in here
- name: Ensure CURL source downloaded
get_url: url={{ curl_url }} dest=/home/vagrant/curl-{{ curl_version }}.tar
- name: Extract CURL source
command: tar -zxf {{ home }}/curl-{{ curl_version }}.tar creates={{ curl_dir }}
- name: Copy ssh patch over
copy: src=./files/ssh.c.patch dest={{ home }}/ssh.c.patch
- name: Patch CURL with openssl
shell: patch -t {{ curl_dir }}/lib/ssh.c {{ home }}/ssh.c.patch chdir={{ curl_dir }}/lib
when: path_file_result.changed
- name: Build CURL with openssl
command: 'chdir={{ curl_dir }} "{{ item }}"'
with_items:
- ./buildconf
- ./configure --with-gssapi --with-libidn --with-libssh2 --prefix=/usr --without-nss
- make
- make install
- ldconfig
Vagrant funciona bien y el libro de jugadas de Ansible se ejecuta con éxito hasta la última tarea 'Construir CURL con openssl', que falla, así:
TASK: [Build CURL with openssl] ***********************************************
changed: [default] => (item=./buildconf) => {"changed": true, "cmd": ["./buildconf"], "delta": "0:00:10.709817", "end": "2014-02-07 02:26:44.802652", "item": "./buildconf", "rc": 0, "start": "2014-02-07 02:26:34.092835", "stderr": "configure.ac:78: installing `./compile'
configure.ac:73: installing `./config.guess'
configure.ac:73: installing `./config.sub'
configure.ac:65: installing `./missing'
Makefile.am: installing `./depcomp'
configure.ac:137: installing `./config.guess'
configure.ac:137: installing `./config.sub'
docs/examples/Makefile.am: installing `./depcomp'", "stdout": "buildconf: autoconf version 2.63 (ok)
buildconf: autom4te version 2.63 (ok)
buildconf: autoheader version 2.63 (ok)
buildconf: automake version 1.11.1 (ok)
buildconf: aclocal version 1.11.1 (ok)
buildconf: libtool version 2.2.6 (ok)
buildconf: libtoolize found
buildconf: GNU m4 version 1.4.13 (ok)
buildconf: running libtoolize
buildconf: running aclocal
buildconf: running aclocal hack to convert all mv to mv -f
buildconf: running autoheader
buildconf: cp lib/curl_config.h.in src/curl_config.h.in
buildconf: running autoconf
buildconf: running in ares
buildconf: running automake
buildconf: OK"}
failed: [default] => (item=./configure --with-gssapi --with-libidn --with-libssh2 --prefix=/usr --without-nss) => {"cmd": ["./configure --with-gssapi --with-libidn --with-libssh2 --prefix=/usr --without-nss"], "failed": true, "item": "./configure --with-gssapi --with-libidn --with-libssh2 --prefix=/usr --without-nss", "rc": 2}
msg: [Errno 2] No such file or directory
failed: [default] => (item=make) => {"changed": true, "cmd": ["make"], "delta": "0:00:00.001828", "end": "2014-02-07 02:26:45.003968", "item": "make", "rc": 2, "start": "2014-02-07 02:26:45.002140"}
stderr: make: *** No targets specified and no makefile found. Stop.
failed: [default] => (item=make install) => {"cmd": ["make install"], "failed": true, "item": "make install", "rc": 2}
msg: [Errno 2] No such file or directory
changed: [default] => (item=ldconfig) => {"changed": true, "cmd": ["ldconfig"], "delta": "0:00:00.009685", "end": "2014-02-07 02:26:46.096829", "item": "ldconfig", "rc": 0, "start": "2014-02-07 02:26:46.087144", "stderr": "", "stdout": ""}
FATAL: all hosts have already failed -- aborting
Entonces, el ./buildconf
paso funciona, pero el ./configure --with-gssapi --with-libidn --with-libssh2 --prefix=/usr --without-nss
paso parece estar fallando [Errno 2] No such file or directory
. Supongo que esto se debe a que está tratando de ejecutar toda esa cadena como si fuera un solo comando.
Si lo cambio para usar en shell
lugar de command
, obtengo esto en su lugar:
failed: [default] => (item=./configure --with-gssapi --with-libidn --with-libssh2 --prefix=/usr --without-nss) => {"changed": true, "cmd": " \"./configure --with-gssapi --with-libidn --with-libssh2 --prefix=/usr --without-nss\" ", "delta": "0:00:00.001171", "end": "2014-02-07 02:31:34.862373", "item": "./configure --with-gssapi --with-libidn --with-libssh2 --prefix=/usr --without-nss", "rc": 127, "start": "2014-02-07 02:31:34.861202"}
stderr: /bin/sh: ./configure --with-gssapi --with-libidn --with-libssh2 --prefix=/usr --without-nss: No such file or directory
Verifiqué que todas las tareas hasta ese momento funcionan, y los archivos se descargan y extraen a los lugares esperados y el parche funciona ( ver aquí ).
Después de que la tarea falla (o si la comenta), si ingresa SSH en la máquina virtual que se está configurando y ejecuta los mismos pasos de compilación usted mismo, utilizando los valores exactos del libro de jugadas, funciona.
Todavía soy bastante nuevo en Ansible y no estoy seguro de por qué esto no funciona. ¿Qué estoy haciendo mal? ¿Hay alguna forma de formatear o citar ese configure
comando de manera diferente para que se interprete correctamente, si ese es el problema? ¿Debo estar usando raw
para esto? ¿O algo mas?