openwrt

Ansible Роль: openwrt

Управляйте OpenWRT и его производными с помощью Ansible, но без Python.

Поместив хост в группу инвентаря openwrt, некоторые модули заменяются на версию для оболочки, работающую на стандартной установке OpenWRT, стараясь сохранить большую часть оригинального функционала. Хосты, которые не находятся в этой группе, не затрагиваются. Это позволяет смешивать задачи OpenWRT и других платформ. Также включены некоторые новые модули, специфические для OpenWRT (например, uci). Не все комбинации аргументов протестированы! Некоторые случаи были просто переведены с Python для полноты информации.

В настоящее время реализованы следующие модули:

  • command
  • copy
  • fetch (неявный)
  • file
  • lineinfile
  • nohup (новый)
  • opkg
  • ping
  • service
  • setup
  • shell (неявный)
  • slurp
  • stat
  • sysctl
  • template (неявный)
  • uci (новый)
  • wait_for_connection (неявный)

Для достижения всего этого используется некоторый monkey patching (если вы удивляетесь по поводу vars_plugins).

Совместимость

Эта роль была успешно протестирована с:

  • LEDE 17.01 (вручную)
  • OpenWRT 18.06
  • OpenWRT 19.07
  • OpenWRT 21.02
  • OpenWRT 22.03

Требования

Некоторые модули по желанию требуют способа генерации SHA1 хэшей или кодирования данных в Base64. В случае Base64, есть очень медленная реализация hexdump | awk. Для SHA1 обходного пути нет. Модули попытаются найти полезные системные команды для SHA1 (sha1sum, openssl) и Base64 (base64, openssl, обходной путь) при необходимости. Если полезные команды не найдены, многие функции все еще будут работать, но, например, модуль fetch должен быть запущен с validate_checksum: no, всегда будет загружать файл и возвращать changed: yes. Поэтому рекомендуется установить coreutils-sha1sum и coreutils-base64, если команды уже не предоставляются busybox. Роль делает это автоматически по умолчанию (см. ниже).

Переменные роли

openwrt_install_recommended_packages:
    Проверяет наличие некоторых команд и устанавливает соответствующие пакеты, если они
    отсутствуют. См. требования выше. (по умолчанию: yes)

openwrt_scp_if_ssh:
    Использовать ли scp вместо sftp для систем OpenWRT. Значение может быть `yes`,
    `no` или `smart`. Ansible по умолчанию устанавливает `smart`, но эта роль по умолчанию устанавливает `yes`,
    потому что OpenWRT не предлагает sftp по умолчанию. (по умолчанию: yes)

openwrt_remote_tmp:
    Установка remote_tmp для систем OpenWRT. По умолчанию /tmp, чтобы избежать
    износа флеш-памяти на целевом устройстве. (по умолчанию: /tmp)

openwrt_wait_for_connection, openwrt_wait_for_connection_timeout:
    Ожидать ли хост (по умолчанию: yes) и как долго (300) после
    перезагрузки сети или Wi-Fi (см. обработчики).

openwrt_ssh, openwrt_scp, openwrt_ssh_host, openwrt_ssh_user, openwrt_user_host:
    Упрощенные команды для выполнения действий, таких как
    "command: {{ openwrt_scp }} {{ openwrt_user_host|quote }}:/etc/rc.local /tmp"

Пример плейбука

Инвентарь:

[aps]
ap1.example.com
ap2.example.com
ap3.example.com

[routers]
router1.example.com

[openwrt:children]
aps
routers

Плейбук:

- hosts: openwrt
  roles:
    - gekmihesg.openwrt
  tasks:
    - name: копировать образ openwrt
      command: "{{ openwrt_scp }} image.bin {{ openwrt_user_host|quote }}:/tmp/sysupgrade.bin"
      delegate_to: localhost
    - name: начать sysupgrade
      nohup:
        command: sysupgrade -q /tmp/sysupgrade.bin
    - name: ждать перезагрузки
      wait_for_connection:
        timeout: 300
        delay: 60
    - name: установить mdns
      opkg:
        name: mdns
        state: present
    - name: включить и запустить mdns
      service:
        name: mdns
        state: started
        enabled: yes
    - name: копировать авторизованные ключи
      copy:
        src: authorized_keys
        dest: /etc/dropbear/authorized_keys
    - name: отменить ожидающие изменения
      uci:
        command: revert
    - name: настроить радио устройства wifi radio0
      uci:
        command: set
        key: wireless.radio0
        value:
          phy: phy0
          type: mac80211
          hwmode: 11g
          channel: auto
    - name: настроить интерфейс wifi
      uci:
        command: section
        config: wireless
        type: wifi-iface
        find_by:
          device: radio0
          mode: ap
        value:
          ssid: MySSID
          encryption: psk2+ccmp
          key: very secret
    - name: подтвердить изменения
      uci:
        command: commit
      notify: перезагрузить wifi

Запуск модулей вне плейбука возможен следующим образом:

$ export ANSIBLE_LIBRARY=~/.ansible/roles/gekmihesg.openwrt/library
$ export ANSIBLE_VARS_PLUGINS=~/.ansible/roles/gekmihesg.openwrt/vars_plugins
$ ansible -i openwrt-hosts -m setup all

Лицензия

GNU General Public License v3.0 (см. https://www.gnu.org/licenses/gpl-3.0.txt)

Разработка

Написание пользовательских модулей для этой структуры не так уж сложно. Модули обернуты в скрипт-обертку, который предоставляет общие функции для разбора параметров, обработки json, генерации ответов и некоторые другие. Все модули должны соответствовать openwrt_<module_name>.sh. Если module_name не является одним из основных модулей Ansible, также должен быть <module_name>.py. Это не обязательно должно иметь какую-либо функциональность (оно может иметь таковую для не OpenWRT систем) и может содержать документацию.

Убедитесь, что вы установили пакеты из requirements.txt в ваше виртуальное окружение и, с активированным venv, выполните:

$ molecule test

перед коммитом и отправкой вашего PR.

Также настоятельно рекомендуется писать тесты для вашего нового модуля.

О проекте

Manage OpenWRT without python

Установить
ansible-galaxy install gekmihesg/ansible-openwrt
Лицензия
gpl-3.0
Загрузки
20301
Владелец