#ansible
#ansible
Вопрос:
У меня есть следующая логика, которую я хотел бы реализовать с помощью Ansible:
Прежде чем обновлять некоторые пакеты операционной системы, я хочу проверить некоторые другие удаленные зависимости, которые включают запросы к некоторым конечным точкам и решить, подходит ли следующая версия или нет.
Скрипт new_version_available
возвращает 0, если есть что-то новое, и 1, если чего-то нового нет.
Чтобы избежать установки ненужных пакетов в рабочей среде или открытия ненужных портов в моем брандмауэре в DMZ, я хотел бы запустить этот скрипт локально на моем хосте, и если это удастся, мы запустим следующую задачу удаленно.
tasks:
- name: Check if there is new version available
command: "{{playbook_dir}}/new_version_available"
delegate_to: 127.0.0.1
register: new_version_available
ignore_errors: False
- name: Install our package
command:
cmd: '/usr/bin/our_installer update'
warn: False
when: new_version_available is succeeded
Что дает мне следующую ошибку:
фатальный: [localhost -> 127.0.0.1]: СБОЙ! => {«изменено»: false, «cmd»: «/home/foo/ansible-deploy-bar/new_version_available», «msg»: «[Ошибка 2] Нет такого файла или каталога», «rc»: 2}
Это означает, что моя команда не может быть найдена, однако мой скрипт существует, и у меня есть разрешение на доступ к нему.
Моя среда разработки, в которой я тестирую playbook, работает на виртуальной машине через NAT, где перенаправляет гостевой порт 22 на мой хост 2222, поэтому, если я хочу войти в свою виртуальную машину, я это делаю ssh root@localhost -p 2222
. Мой инвентарь выглядит следующим образом:
foo:
hosts:
localhost:2222
Мой вопрос:
Каким был бы простой способ достичь того, чего я хочу, то есть выполнить какую-то команду локально и передать результаты в регистр и использовать его в качестве условия в задаче? Запустите команду и передайте результат в качестве переменной среды в Ansible?
Я использую эту документацию в качестве поддержки https://docs.ansible.com/ansible/latest/user_guide/playbooks_delegation.html
Комментарии:
1. Я действительно не понимаю … единственная проблема на данный момент заключается в том, что скрипта нет в вашем каталоге playbook. Где это точно? С таким же успехом у него могут быть неправильные разрешения… Примечание: я предлагаю вам делегировать
localhost
, а не127.0.0.1
использовать неявный localhost, который используетlocal
соединение, а не обычно ненужный ssh в этом случае.2. У вас есть шебанг поверх этого? Есть ли у вас какие-либо команды в этом скрипте, которые полагаются на инициализацию вашим .bashrc ? Вы делегировали localhost (чтобы убедиться, что он использует правильного пользователя, то есть вы запускаете скрипт)?
3. На этом этапе я бы выпустил a
shell: "whoami amp;amp; pwd amp;amp; hostname amp;amp; ls -l {{ playbookdir }}"
в playbook и отладил вывод, чтобы увидеть, не полностью ли чего-то не хватает.4. Вы делегировали
localhost
(т.е.ansible_connection=local
), а не127.0.0.1
так, как я спрашивал несколько раз?5. Ваш инвентарь неверен. Более того, вы немного ищете проблемы. Идея, которая поможет вам разобраться: gist.github.com/zeitounator/6781298b31fbaba88916ab82cd059763