Возникла недавно задача по развертыванию сервиса в RHEL9 и я столкнулся с тем что в RHEL9 выпилен ansible-engine в виде отдельного репозитория и теперь используется пакет ansible-core, входящий в базовый репозиторий.
В чем различие: ansible-core поддерживает только 127 базовых модулей типа dnf, copy template и т.д.. Все остальное вынесено в коллекции.
А тут мне понадобился модуль sysctl, для того, чтобы включить IP forwarding.
До текущего момента я старался избегать использования коллекций. Скажем так, по религиозным причинам..
В общем-то ничего страшного, если речь идет о не очень большом количестве кода. Можно обойтись модулем shell и даже сделать это идемпотентно, но это означает, что вместо одного task будет 3 или 4. И это даже можно вынести в отдельную роль и т.п….
Но если мы имеем на руках репозиторий размером в несколько сот Мб? С кучей ролей, собиравшийся годами и используемый для RHEL7/8/9. Лично на меня от потенциального объема исправлений накатывала дикая печаль.
В общем я сдался и согласился на коллекции. Добавил в плейбук:
- ansible.posix.sysctl:
...
вместо
- sysctl:
...
Добавил в ansible.cfg параметр collections_paths. В RHEL9 старые роли заработали, а вот в RHEL8 я получил вот это:
ERROR! couldn't resolve module/action 'ansible.posix.sysctl'. This often indicates a misspelling, missing collection, or incorrect module path.
Печалька.
В общем небольшое исследование показало, что модули, объявленные конструкцией типа namespase.collection.modulename ansible-engine видеть не хочет ни в какую, а ansible-core воспринимает нормально:
# ansible-galaxy collection list
# /etc/ansible/ansible_collections
Collection Version
------------- -------
ansible.posix 1.4.0
# ansible-doc -l
...
ansible.posix.sysctl Manage entries in sysctl.conf
...
Но не переустанавливать же везде ansible-engine на ansible-core.
Ларчик открывается просто: везде использовать сокращенную форму. В этом случае оба варианта ansible работают корректно.