Playbook ansible không hoạt động khi cố gắng chạy make & configure với các công tắc phức tạp


10

Đây là phần tiếp theo của câu hỏi này . Tôi đang cố gắng sử dụng Ansible để cung cấp VM Vagrant. VM đang chạy CentOS 6.4. Tôi đang sử dụng một playbook ansible (viết tắt) sau đây:

- 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 đang hoạt động tốt và Playbook Ansible chạy thành công đến nhiệm vụ cuối cùng 'Xây dựng CURL với openssl' - thất bại, như vậy:

    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

Vì vậy, ./buildconfbước làm việc, nhưng ./configure --with-gssapi --with-libidn --with-libssh2 --prefix=/usr --without-nssbước dường như không thành công [Errno 2] No such file or directory. Tôi đoán điều này là do nó đang cố chạy toàn bộ chuỗi như nó là một lệnh duy nhất?

Nếu tôi thay đổi nó để sử dụng shellthay vì command, tôi sẽ thay thế:

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

Tôi đã xác minh rằng tất cả các tác vụ cho đến thời điểm đó đều hoạt động và các tệp được tải xuống và trích xuất đến các vị trí dự kiến ​​và bản vá hoạt động ( xem tại đây ).

Sau khi tác vụ thất bại (hoặc nếu bạn nhận xét), nếu bạn SSH vào VM đang được cấu hình và tự mình chạy tất cả các bước xây dựng - sử dụng các giá trị chính xác từ playbook, nó sẽ hoạt động.

Tôi vẫn còn khá mới với Ansible và tôi không chắc tại sao điều này không hoạt động? Tôi đang làm gì sai? Có một số cách để định dạng hoặc trích dẫn configurelệnh đó khác nhau để nó được giải thích đúng, nếu đó là vấn đề? Tôi có nên sử dụng rawcho việc này? Hay cái gì khác?

Câu trả lời:


14

Giải pháp là thay đổi điều này:

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

đến đây:

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

Các tài liệu cho mô-đun shell bây giờ giải quyết sự khó khăn này trong định dạng. Nhiệm vụ xây dựng hoàn thành hiện tại trông như thế này:

- 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.