Playbook Ansible não está funcionando tentando executar o patch

1

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
    command: '"{{ item }}" chdir={{ curl_dir }}/lib'
    with_items:
      - patch {{ curl_dir }}/lib/ssh.c {{ home }}/ssh.c.patch

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

TASK: [Patch CURL with openssl] *********************************************** 
failed: [default] => (item=patch < /home/vagrant/ssh.c.patch) => {"cmd": ["patch < /home/vagrant/ssh.c.patch"], "failed": true, "item": "patch < /home/vagrant/ssh.c.patch", "rc": 2}
msg: [Errno 2] No such file or directory

FATAL: all hosts have already failed -- aborting

Eu verifiquei que todas as tarefas até esse ponto funcionam e os arquivos são baixados e extraídos para os locais esperados.

Depois que a tarefa falhar, se você tiver SSH na VM que está sendo configurada e executar a mesma coisa você mesmo - usando os valores exatos das variáveis do manual, isso funcionará:

cd /home/vagrant/curl-curl-7_19_7
sudo patch /home/vagrant/curl-curl-7_19_7/lib/ssh.c /home/vagrant/ssh.c.patch

Sou novo no Ansible e não sei por que isso não está funcionando - parece que deveria ser? O que estou fazendo errado?

    
por Duncan Lock 05.02.2014 / 23:49

2 respostas

2

A resposta da @Tybstar me apontou na direção certa - usando shell em vez de command . A correção real foi alterar a tarefa de correção a partir disso:

- name: Patch CURL with openssl
  command: '"{{ item }}" chdir={{ curl_dir }}/lib'
  with_items:
    - patch {{ curl_dir }}/lib/ssh.c {{ home }}/ssh.c.patch

para isso:

- name: Patch CURL with openssl
  shell: patch {{ curl_dir }}/lib/ssh.c {{ home }}/ssh.c.patch chdir={{ curl_dir }}/lib
    
por 06.02.2014 / 01:47
5

Parece que você está usando um redirecionamento de shell menor que o sinal em sua chamada "command" (mas foi comido pelo analisador ServerFault). Tente usar "shell" em vez de "command" lá. O comando não passa pelo shell, então as coisas do shell, como redirecionamentos e pipes, não funcionam. Shell deve funcionar.

    
por 06.02.2014 / 00:12