Vagrant

Ansible playbook 無法使用複雜的開關執行 make 和 configure

  • September 30, 2019

這是這個問題的後續。我正在嘗試使用 Ansible 來配置 Vagrant VM。虛擬機正在執行 CentOS 6.4。我正在使用以下(縮寫)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 工作正常,Ansible playbook 成功執行到最後一個任務 ‘Build CURL with openssl’ - 失敗,如下所示:

   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. 我想這是因為它試圖像執行單個命令一樣執行整個字元串?

如果我將其更改為使用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

我已經驗證了到那時為止的所有任務都可以正常工作,並且文件已下載並提取到預期的位置,並且更新檔可以正常工作(請參見此處)。

任務失敗後(或者如果您將其註釋掉),如果您通過 SSH 連接到正在配置的 VM,並自己執行所有相同的建構步驟 - 使用劇本中的確切值,它就可以工作。

我對 Ansible 還是很陌生,我不確定為什麼這不起作用?我究竟做錯了什麼?有沒有辦法以configure不同的方式格式化或引用該命令,以便正確解釋它,如果這是問題所在?我應該raw為此使用嗎?或者是其他東西?

解決方案是改變這個:

shell: 'chdir={{ curl_dir }} "{{ item }}"'

對此:

shell: "{{ item }}"
args:
 chdir: "{{ curl_dir }}"

shell 模組的文件現在解決了格式化中的這種棘手問題。完整的工作建構任務目前如下所示:

- 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

引用自:https://serverfault.com/questions/573843