Vagrant

Ansible playbook 無法執行更新檔

  • August 3, 2016

我正在嘗試使用 Ansible 來配置 Vagrant VM。虛擬機正在執行 CentOS 6.4。我正在使用以下(縮寫)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 工作正常,Ansible playbook 成功執行到最後一個任務 ‘Patch CURL with 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 連接到正在配置的 VM,並自己執行相同的操作 - 使用 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 的新手,我不確定為什麼這不起作用 - 看起來應該是這樣?我究竟做錯了什麼?

@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

看起來您在“命令”呼叫中使用了 shell 重定向小於號(但它被 ServerFault 解析器吃掉了)。嘗試在那裡使用“shell”而不是“command”。命令不通過外殼,因此重定向和管道之類的外殼內容將不起作用。殼牌應該可以工作。

引用自:https://serverfault.com/questions/573505