我正在尝试使用 Ansible 来配置 Vagrant VM。该 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 剧本成功运行,直到最后一个任务“使用 openssl 修补 CURL”失败,如下所示:
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,并自行运行相同的操作 - 使用剧本变量中的精确值,它就会起作用:
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 的新手,我不确定为什么它不起作用 - 它看起来应该可以?我做错了什么?
答案1
看起来您在“命令”调用中使用了 shell 重定向小于号(但它被 ServerFault 解析器吞掉了)。尝试在那里使用“shell”而不是“命令”。命令不会经过 shell,因此重定向和管道等 shell 东西将不起作用。Shell 应该可以工作。
答案2
@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