shell模块:<与ansible

时间:2014-12-03 15:55:45

标签: shell ansible ansible-playbook

我想运行一个命令:

- 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进行安装

3 个答案:

答案 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;