Назад | Перейти на главную страницу

Ansible playbook не работает при попытке запустить патч

Я пытаюсь использовать Ansible для подготовки виртуальной машины Vagrant. Виртуальная машина работает под управлением 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
    command: '"{{ item }}" chdir={{ curl_dir }}/lib'
    with_items:
      - patch {{ curl_dir }}/lib/ssh.c {{ home }}/ssh.c.patch

Vagrangt работает нормально, и плейбук Ansible успешно работает до последней задачи «Исправить CURL с помощью openssl», которая не выполняется, например:

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

Я убедился, что все задачи до этого момента работают, а файлы загружаются и извлекаются в ожидаемые места.

После сбоя задачи, если вы подключитесь по SSH к настраиваемой виртуальной машине и запустите то же самое самостоятельно - используя точные значения из переменных playbook, это сработает:

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

Я новичок в Ansible и не уверен, почему это не работает - похоже, так и должно быть? Что я делаю не так?

Похоже, вы используете знак "меньше чем" для перенаправления оболочки в своем "командном" вызове (но он был съеден парсером ServerFault). Попробуйте использовать там "shell" вместо "command". Команда не проходит через оболочку, поэтому такие вещи оболочки, как перенаправления и каналы, не будут работать. Shell должен работать.

Ответ от @Tybstar указал мне в правильном направлении - используя shell вместо того command. Фактическое исправление заключалось в изменении задачи патча с этого:

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

к этому:

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