Оболочный модуль: <с незаменимым

Я хочу запустить команду:

- 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: этот вопрос об использовании оператора < в модуле оболочки, и я знаю, что лучше использовать apt для установки чего-то

3 ответа

EDIT: хотя это отвечает на этот вопрос, я думаю, что ответ 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)

Первый использует замену процесса, которая является функцией bash, поэтому вы не можете использовать ее с /bin/sh в качестве оболочки, Он делает вывод команды curl (которая является python script), записывая ее во временный файл и используя этот файл в качестве аргумента для python, который принимает в качестве первого аргумента python script.

Второй - неоднозначное перенаправление, потому что python script, который генерируется из curl, не является файлом


Используйте модуль command, если вам действительно не нужно shell.

Также вам будет лучше использовать модуль get_url для загрузки файла вместо того, чтобы полагаться на curl, установленный на удаленном сервере. В последних версиях Ansible будет отображаться предупреждение, когда вы пытаетесь использовать curl вместо модуля get_url также:

"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


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

licensed under cc by-sa 3.0 with attribution.