这是这个问题的后续。 我正在尝试使用Ansible来configurationVagrant虚拟机。 VM正在运行CentOS 6.4。 我正在使用以下(缩写)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工作正常,Ansible剧本成功运行到最后一个任务“使用openssl构buildCURL” – 失败,如下所示:
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
因此./buildconf步骤起作用,但./configure --with-gssapi --with-libidn --with-libssh2 --prefix=/usr --without-nss步骤似乎失败了[Errno 2] No such file or directory 。 我想这是因为它试图运行整个string,就像它是一个单一的命令?
如果我改变它使用shell而不是command ,我得到这个:
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
我已经validation了到目前为止的所有任务都能正常工作,并且文件被下载并提取到预期的地方,补丁工作( 参见这里 )。
任务失败后(或者如果你注释掉了),如果你SSH进入正在configuration的虚拟机,并自己运行所有相同的构build步骤 – 使用剧本中的确切值,它的工作原理。
对于Ansible,我还是个新手,我不确定为什么这样不行? 我究竟做错了什么? 是否有某种方式来格式化或引用该configure命令不同,以便它被正确解释,如果这是问题? 我应该使用raw的吗? 或者是其他东西?
解决办法是改变这个:
shell: 'chdir={{ curl_dir }} "{{ item }}"'
对此:
shell: "{{ item }}" args: chdir: "{{ curl_dir }}"
shell模块的文档现在解决了这种格式化的技巧。 完整的工作构build任务目前如下所示:
- 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