복잡한 스위치로 make & configure를 실행하려고 시도 할 수없는 플레이 북


10

이 후속하는 질문입니다. Ansible을 사용하여 Vagrant VM을 프로비저닝하려고합니다. VM이 CentOS 6.4를 실행 중입니다. 다음과 같은 간단한 약식 플레이 북을 사용하고 있습니다.

- 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을 사용하여 CURL 빌드'까지 성공적으로 실행됩니다.

    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

해당 시점까지의 모든 작업이 작동하고 파일이 예상 위치로 다운로드 및 추출되고 패치가 작동하는지 확인했습니다 ( 여기 참조 ).

작업이 실패한 후 (또는 주석 처리 한 경우) 구성중인 VM에 SSH로 연결하고 플레이 북의 정확한 값을 사용하여 동일한 빌드 단계를 모두 직접 실행하면 작동합니다.

여전히 Ansible을 처음 사용하는데 왜 이것이 작동하지 않는지 잘 모르겠습니다. 내가 무엇을 잘못하고 있지? 문제가있는 경우 해당 configure명령을 다르게 형식화하거나 인용 할 수있는 방법이 있습니까? raw이것을 위해 사용해야합니까 ? 또는 다른 것?

답변:


14

해결책은 이것을 변경하는 것입니다.

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

이에:

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

쉘 모듈에 대한 문서는 이제 형식이 trickiness을 해결합니다. 전체 작업 빌드 작업은 현재 다음과 같습니다.

- 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.