Контейнеры Python содержат ссылки на другие объекты. См. Этот пример:
>>> a = []
>>> b = [a]
>>> b
[[]]
>>> a.append(1)
>>> b
[[1]]
В этом b
есть список, содержащий один элемент, который является ссылкой на список a
. Список a
изменен.
Умножение списка на целое эквивалентно добавлению списка к себе несколько раз (см. операции общей последовательности ). Итак, продолжаем с примера:
>>> c = b + b
>>> c
[[1], [1]]
>>>
>>> a[0] = 2
>>> c
[[2], [2]]
Мы видим, что список c
теперь содержит две ссылки на список a
, который эквивалентен c = b * 2
.
Python FAQ также содержит объяснение этого поведения: Как создать многомерный список?
Я не знаком с Ansible
, но из сообщения об ошибке |
фактически передается как аргумент dpkg
и не интерпретируется как pipe между процессами. Вероятно, Ansible не выполняет команду через оболочку. Поэтому вы должны явно запросить его.
Я точно не знаю, как это сделать, попробуйте один из них:
command: bash -c "dpkg -l | grep python-apt"
или
command: bash -c 'dpkg -l | grep python-apt'
Если оба отказались, у вас все еще есть возможность поместить команды в сценарий оболочки и использовать этот скрипт в своей команде ...
EDIT: из документа:
Команда- выполняет команду на удаленном узле
Командный модуль принимает имя команды, за которым следует список аргументов, разделенных пробелами. Данная команда будет выполнена на всех выбранных узлах. Он не будет обрабатываться через оболочку, поэтому переменные типа $ HOME и операции типа «& lt;», «>», «|» и «& amp;» не будет работать (используйте модуль оболочки, если вам нужны эти функции).
shell - выполняет команды в узлах
Модуль оболочки принимает имя команды а затем список аргументов, разделенных пробелами. Это почти так же, как командный модуль, но выполняет команду через оболочку (/ bin / sh) на удаленном узле.
blockquote>Вам, вероятно, придется использовать
shell: dpkg -l | grep python-apt
По-прежнему интересно, работало бы мое первоначальное предположение (
bash -c "..."
) ...
прочитал о командном модуле в документации Ansible :
Он не будет обрабатываться через оболочку, поэтому ... операции типа «& lt;», > "," | "и" & amp; " не работает
blockquote>Как рекомендуется, используйте модуль оболочки :
- name: Check if python-apt is installed shell: dpkg -l | grep python-apt register: python_apt_installed ignore_errors: True
Для чего это стоит, вы можете проверить / подтвердить установка в среде debian с использованием команды
apt
:- name: ensure python-apt is installed apt: name=python-apt state=present
apt
для установки модулей и проверки их установки. И debian, и ubuntu уже есть, и python-apt
не имеет никаких ручных этапов установки.
– tedder42
11 July 2014 в 17:46