Запустите локальную команду с Ansible и разделите переменную в удаленном контексте

#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