Ansible playbook not working trying to run make & configure with complex switches
Solution is to change this:
shell: 'chdir={{ curl_dir }} "{{ item }}"'
to this:
shell: "{{ item }}"
args:
chdir: "{{ curl_dir }}"
The documentation for the shell module now addresses this trickiness in the formatting. The complete working build task currently looks like this:
- name: Build CURL with openssl
shell: "{{ item }}"
args:
chdir: "{{ curl_dir }}"
with_items:
- ./buildconf
- ./configure --with-gssapi --with-libidn --with-libssh2 --prefix=/usr --without-nss
- make
- make install
- ldconfig
Related videos on Youtube
Duncan Lock
Updated on September 18, 2022Comments
-
Duncan Lock over 1 year
This is a follow-on to this question. I'm trying to use Ansible to provision a Vagrant VM. The VM is running CentOS 6.4. I'm using the following (abbreviated) ansible playbook:
- 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 is working fine and the Ansible playbook runs successfully up to the last task 'Build CURL with openssl' - which fails, like so:
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
So, the
./buildconf
step works, but the./configure --with-gssapi --with-libidn --with-libssh2 --prefix=/usr --without-nss
step seems to be failing with[Errno 2] No such file or directory
. I presume this is because it's trying to run that whole string like it was a single command?If I change it to use
shell
instead ofcommand
, I get this instead: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
I've verified that all the tasks up to that point work, and the files are downloaded and extracted to the expected places and the patch works (see here).
After the task fails (or if you comment it out), if you SSH into the VM that's being configured, and run all the same build steps yourself - using the exact values from the playbook, it works.
I'm still pretty new to Ansible and I'm not sure why this isn't working? What am I doing wrong? Is there some way to format or quote that
configure
command differently so it gets interpreted properly, if that's the issue? Should I be usingraw
for this? Or something else?