Questo è un seguito a questa domanda. Sto cercando di utilizzare Ansible per eseguire il provisioning di una macchina virtuale Vagrant. La VM esegue CentOS 6.4. Sto usando il seguente playbook (abbreviato) ansible:
- 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 funziona bene e il playbook Ansible funziona correttamente fino all'ultima attività "Build CURL with openssl" - che fallisce, in questo modo:
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
Quindi, il ./buildconfpassaggio funziona, ma il ./configure --with-gssapi --with-libidn --with-libssh2 --prefix=/usr --without-nsspassaggio sembra non riuscire [Errno 2] No such file or directory. Presumo che questo sia perché sta cercando di eseguire l'intera stringa come se fosse un singolo comando?
Se lo cambio per usare shellinvece di command, ottengo questo invece:
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
Ho verificato che tutte le attività fino a quel momento funzionano e che i file vengono scaricati ed estratti nei punti previsti e la patch funziona ( vedere qui ).
Se l'attività non riesce (o se la commentate), se SSH nella VM che si sta configurando ed eseguite tutti gli stessi passaggi di compilazione da soli - utilizzando i valori esatti del playbook, funziona.
Sono ancora abbastanza nuovo su Ansible e non sono sicuro del perché questo non funziona? Che cosa sto facendo di sbagliato? C'è un modo per formattare o citare quel configurecomando in modo diverso in modo che venga interpretato correttamente, se questo è il problema? Dovrei usare rawper questo? O qualcos'altro?