Playbook Ansible não está funcionando tentando executar o make & configure com switches complexos

8

Esta é uma continuação da esta pergunta . Estou tentando usar o Ansible para provisionar uma VM do Vagrant. A VM está executando o CentOS 6.4. Estou usando o seguinte (abreviado) 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

O Vagrant está funcionando bem e a cartilha do Ansible é executada com sucesso até a última tarefa 'Build CURL with openssl' - que falha assim:

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

Assim, a etapa ./buildconf funciona, mas a etapa ./configure --with-gssapi --with-libidn --with-libssh2 --prefix=/usr --without-nss parece estar falhando com [Errno 2] No such file or directory . Eu presumo que isso é porque ele está tentando executar toda a cadeia como se fosse um único comando?

Se eu alterá-lo para usar shell em vez de command , recebo isso:

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

Verifiquei que todas as tarefas até esse ponto funcionam e os arquivos são baixados e extraídos para os locais esperados e o patch funciona ( veja aqui ).

Depois que a tarefa falhar (ou se você comentar), se você for SSH na VM que está sendo configurada e executar você mesmo as mesmas etapas de criação - usando os valores exatos do manual, isso funciona.

Ainda sou muito novo no Ansible e não sei por que isso não está funcionando? O que estou fazendo de errado? Existe alguma maneira de formatar ou citar esse comando configure de maneira diferente para que ele seja interpretado corretamente, se esse é o problema? Devo estar usando raw para isso? Ou algo mais?

    
por Duncan Lock 07.02.2014 / 03:42

1 resposta

13

A solução é mudar isso:

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

para isso:

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

A documentação do módulo de shell agora aborda essa dificuldade na formatação. A tarefa completa de construção atualmente é assim:

- 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
    
por 07.02.2014 / 22:02