==
сравнивает ссылки на объекты.
.equals()
сравнивает значения String.
Иногда ==
дает иллюзии сравнения значений String, как в следующих случаях:
String a="Test";
String b="Test";
if(a==b) ===> true
Это связано с тем, что при создании любого строкового литерала JVM сначала ищет этот литерал в пуле строк, и если он найдет совпадение, эта же ссылка будет передана новой String. Из-за этого получаем:
(a == b) ===> true
String Pool
b -----------------> "test" <-----------------a
Однако ==
не выполняется в следующем случае:
String a="test";
String b=new String("test");
if (a==b) ===> false
В этом случае для new String("test")
оператор new String будет создан в куче, и эта ссылка будет указана на b
, поэтому b
будет дана ссылка на кучу, а не на String pool.
Теперь a
указывает на String в пуле String, а b
указывает на String в куче. Из-за этого мы получаем:
, если (a == b) ===> false.
String Pool
"test" <-------------------- a
Heap
"test" <-------------------- b
Пока .equals()
всегда сравнивает значение String, поэтому дает true в обоих случаях:
String a="Test";
String b="Test";
if(a.equals(b)) ===> true
String a="test";
String b=new String("test");
if(a.equals(b)) ===> true
Таким образом, использование .equals()
всегда лучше.
Вы используете более старую версию Ansible, у которой не было модуля, который вы пытаетесь запустить.
Как его проверить?
ansible-playbook --version
И проверьте вывод. Он должен показать что-то вроде: ansible-playbook 2.4.1.0 Вы попытались написать роль и поместить пьесу в my_role/tasks/main.yml
.
Файл tasks/main.yml
должен содержать только список задач. Если вы указали:
---
- name: Configure servers
hosts: my_hosts
tasks:
- name: My first task
my_module:
parameter1: value1
Ansible пытается найти модуль действия с именем hosts
и модуль действия с именем tasks
. Это не делает, поэтому он выдает ошибку.
Решение: укажите только список задач в файле tasks/main.yml
:
---
- name: My first task
my_module:
parameter1: value1
Имя модуля действия написано с ошибкой.
Это довольно очевидно, но упускается из виду. Если вы используете неправильное имя модуля, например users
вместо user
, Ansible сообщит «никаких действий, обнаруженных в задаче».
Ansible был разработан как очень расширяемая система. У него нет ограниченного набора модулей, которые вы можете запустить, и он не может проверить «заранее» правописание каждого модуля действий.
Фактически вы можете написать и затем указать свой собственный модуль с именем qLQn1BHxzirz
и Ansible должен это уважать.
Вы пытаетесь выполнить модуль, не распределенный с Ansible.
Имя модуля действия верное, но это не стандартный модуль, распространяемый вместе с Ansible.
Если вы используете модуль, предоставляемый третьей стороной - поставщиком программного обеспечения или оборудования или другим модулем, открытым публично, вы должны сначала загрузить модуль и поместить его в соответствующий каталог.
Вы можете поместить его либо в подкаталог modules
в учебнике, либо в общий путь.
Сильный внешний вид ANSIBLE_LIBRARY
или аргумент командной строки --module-path
.
Чтобы проверить какие пути действительны, запустите:
ansible-playbook --version
и проверьте значение:
настроенный путь поиска модуля =
Ansible версия 2.4 и выше должна содержать список путей.
Причина № 5
У вас действительно нет действий внутри задачи.
Задача должна иметь определенный модуль действия. Следующий пример недействителен:
- name: My task become: true