Vagrant
Ansible playbook 無法執行更新檔
我正在嘗試使用 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”。命令不通過外殼,因此重定向和管道之類的外殼內容將不起作用。殼牌應該可以工作。