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.
Также настоятельно рекомендуется писать тесты для вашего нового модуля.
ansible-galaxy install gekmihesg/ansible-openwrt