我想运行一个命令:
- name: install pip
shell: "python <(curl https://bootstrap.pypa.io/get-pip.py)"
但是实现了错误
failed: [default] => {"changed": true, "cmd": "python <(curl https://bootstrap.pypa.io/get-pip.py)", "delta": "0:00:00.002073", "end": "2014-12-03 15:52:01.780837", "rc": 2, "start": "2014-12-03 15:52:01.778764", "warnings": []}
stderr: /bin/sh: 1: Syntax error: "(" unexpected
我尝试将其更改为:
python <$(curl https://bootstrap.pypa.io/get-pip.py)
但它不起作用。有什么想法吗?
NB:关于在shell模块中使用<
运算符的问题,我知道最好使用apt
进行安装
答案 0 :(得分:9)
如果您实际上不需要command
,请使用shell
模块。
此外,您最好使用get_url
模块下载文件,而不是依赖于curl
安装在远程服务器上。
当您尝试使用curl
而不是get_url
模块时,最新版本的Ansible会显示警告:
"warnings": ["Consider using get_url module rather than running curl"]
我将如何做到这一点:
- name: Download pip installer
get_url:
url=https://bootstrap.pypa.io/get-pip.py
dest=/tmp/get-pip.py
mode=0440
- name: Install pip
command: /usr/bin/python /tmp/get-pip.py
有关get_url
模块的额外选项,请访问:http://docs.ansible.com/get_url_module.html
答案 1 :(得分:3)
编辑:虽然这回答了这个问题,但我认为mgsk的答案是一个更好的答案,因为我同意它不适合用Ansible来解决它。
这可以解决您的问题:
- name: install pip
shell: "python <(curl https://bootstrap.pypa.io/get-pip.py)" executable=/bin/bash
如果您想知道这两个命令之间的区别:
python <(curl https://bootstrap.pypa.io/get-pip.py)
python <$(curl https://bootstrap.pypa.io/get-pip.py)
第一个使用process substitution这是一个bash功能,这就是为什么你不能将它与/ bin / sh一起用作你的shell。它正在做的是获取curl命令的输出(这是一个python脚本),将它写入临时文件并使用该文件作为python的参数,它将python脚本作为其第一个参数。
第二个是模糊重定向,因为从curl生成的python脚本不是文件
答案 2 :(得分:0)
- name: configure zookeeper /etc/zookeeper/conf/zoo.cfg
shell: "{{ item }}"
with_items:
if [ -f /etc/zookeeper/conf/zoo_cfg.org ] ;
then cp /etc/zookeeper/conf/zoo_cfg.org /etc/zookeeper/conf/zoo.cfg ;
else cp /etc/zookeeper/conf/zoo.cfg /etc/zookeeper/conf/zoo_cfg.org;
fi;
cat /vagrant/zoo.cfg.j2 >> /etc/zookeeper/conf/zoo.cfg;