как избежать символа '=' в ansible playbook

У меня есть такой плейбук:

- name: make a http request
  shell: wget -O /dev/null http://my.site.com/some/url?with=args

Основная проблема - аргументы GET. Есть символ "=", который я не знаю, как правильно экранировать. Если я не экранирую это, ansible думает, что это еще один аргумент для модуля, но если я его экранирую, то он делает двойное экранирование, поэтому в результате у меня есть "/=" в оболочке.

Доступная версия: 1.7.1

Заранее спасибо!


person Kron    schedule 31.10.2014    source источник
comment
stackoverflow.com/questions/15783701/   -  person vaso123    schedule 31.10.2014
comment
проблема не в побеге из bash, проблема в побеге внутри ansible playbook   -  person Kron    schedule 31.10.2014


Ответы (2)


С небольшой помощью проблема была найдена.

Проблема была на самом деле в Ansible 1.7.1. После обновления до 1.7.2 проблема решилась.

Спасибо всем :)

person Kron    schedule 01.11.2014

Я не смог воспроизвести это простым вызовом wget. Я использую свой gravatar в качестве URL-адреса с аргументами. Вот пример звонка.

TASK: [shell wget -O /dev/null https://www.gravatar.com/avatar/cad260683598a6e41608b91a9b57099b?s=24] *** 

И вот вывод отладки:

<hostname> REMOTE_MODULE command wget -O /dev/null https://www.gravatar.com/avatar/cad260683598a6e41608b91a9b57099b?s=24 #USE_SHELL
... connected.\nHTTP request sent, awaiting response... 200 OK\nLength: 1089 (1.1K) [image/jpeg]\nSaving to: `/dev/null'\n\n     0K .                                                     100% 1.93M=0.001s\n\n2014-10-31 16:52:00 (1.93 MB/s) - `/dev/null' saved [1089/1089]", "stdout": ""}

Вообще говоря, использование command, shell и lineinfile — это форма запаха кода. В данном случае это означает использование модуля get_url или модуль uri. wget обычно подразумевает get_url, но вы отбрасываете вывод, поэтому используете его как curl, что означает, что модуль uri лучше.

Вот мой сборник игр. Мне нужно было добавить pip, так как httplib не был установлен на моем тестовом хосте.

  tasks:
  - debug: var=hostvars
  - pip: name=httplib2
    sudo: yes
  - uri: url=https://www.gravatar.com/avatar/cad260683598a6e41608b91a9b57099b?s=24

Вы можете видеть в подробном выводе, что он делает правильный вызов.

ok: [hostname] => {"accept_ranges": "bytes", "access_control_allow_origin": "*", "cache_control": "max-age=300", "changed": false, "content_disposition": "inline; filename=\"cad260683598a6e41608b91a9b57099b.jpeg\"", "content_length": "1089", "content_location": "https://www.gravatar.com/avatar/cad260683598a6e41608b91a9b57099b?s=24", "content_type": "image/jpeg", "date": "Fri, 31 Oct 2014 16:58:42 GMT", "expires": "Fri, 31 Oct 2014 17:03:42 GMT", "last_modified": "Fri, 04 Nov 2011 16:27:09 GMT", "link": "<https://www.gravatar.com/avatar/cad260683598a6e41608b91a9b57099b?s=24>; rel=\"canonical\"", "redirected": false, "server": "ECS (ams/49F2)", "source_age": "81", "status": 200, "via": "1.1 varnish", "x_cache": "HIT", "x_varnish": "3775458975 3775177699"}
person tedder42    schedule 31.10.2014
comment
Спасибо за ваш ответ. Я нашел проблему, похоже, это была ошибка в версии 1.7.1. Причина, по которой я использую оболочку с wget, в том, что я пытался использовать команды с минимальными зависимостями. В вашем примере с модулем uri это зависит от httplib2, поэтому я предпочитаю использовать wget, который фактически присутствует почти во всех системах. - person Kron; 01.11.2014