gekmihesg.openwrt
Ansible Rol: openwrt
Gestiona OpenWRT y derivados con Ansible pero sin Python.
Al poner un host en el grupo de inventario openwrt
, algunos módulos se reemplazan con una versión de shell que funciona en una instalación estándar de OpenWRT, tratando de preservar la mayor parte de la funcionalidad original. Los hosts que no están en este grupo no se ven afectados. Esto permite tener tareas mezcladas con OpenWRT y otras plataformas. También hay algunos módulos nuevos específicos de OpenWRT incluidos (como uci
).
¡No todas las combinaciones de argumentos están probadas! Algunos casos solo han sido traducidos de Python por completitud.
Actualmente, se han implementado los siguientes módulos:
- command
- copy
- fetch (implícito)
- file
- lineinfile
- nohup (nuevo)
- opkg
- ping
- service
- setup
- shell (implícito)
- slurp
- stat
- sysctl
- template (implícito)
- uci (nuevo)
- wait_for_connection (implícito)
Para lograr todo esto, se utiliza algo de "monkey patching" (en caso de que te preguntes sobre vars_plugins
).
Compatibilidad
Se ha probado que este rol funciona correctamente con:
- LEDE 17.01 (manualmente)
- OpenWRT 18.06
- OpenWRT 19.07
- OpenWRT 21.02
- OpenWRT 22.03
Requisitos
Algunos módulos requieren opcionalmente una forma de generar hashes SHA1 o codificar datos en Base64. En el caso de Base64, hay una implementación muy lenta de hexdump | awk
incluida. Para SHA1 no hay una solución alternativa.
Los módulos intentarán encontrar comandos del sistema útiles para SHA1 (sha1sum
, openssl
) y Base64 (base64
, openssl
, solución alternativa) cuando sea necesario. Si no se encuentran comandos utilizables, la mayoría de las funciones seguirán funcionando, pero el módulo de fetch, por ejemplo, tendrá que ejecutarse con validate_checksum: no
, siempre descargará el archivo y devolverá changed: yes
.
Por lo tanto, se recomienda instalar coreutils-sha1sum
y coreutils-base64
, si no son proporcionados ya por busybox. El rol lo hace automáticamente por defecto (ver más abajo).
Variables del Rol
openwrt_install_recommended_packages:
Verifica algunos comandos e instala los paquetes correspondientes si faltan.
Ver requisitos arriba. (predeterminado: yes)
openwrt_scp_if_ssh:
Si utilizar scp en lugar de sftp para los sistemas OpenWRT. El valor puede ser `yes`,
`no` o `smart`. Ansible predetermina a `smart` pero este rol predetermina a `yes`
porque OpenWRT no ofrece sftp por defecto. (predeterminado: yes)
openwrt_remote_tmp:
Configuración de remote_tmp de Ansible para sistemas OpenWRT. Por defecto /tmp para evitar
desgaste en el flash del dispositivo objetivo. (predeterminado: /tmp)
openwrt_wait_for_connection, openwrt_wait_for_connection_timeout:
Si esperar por el host (predeterminado: yes) y por cuánto tiempo (300) después de un
reinicio de red o WiFi (ver handlers).
openwrt_ssh, openwrt_scp, openwrt_ssh_host, openwrt_ssh_user, openwrt_user_host:
Accesos directos para hacer cosas como
"command: {{ openwrt_scp }} {{ openwrt_user_host|quote }}:/etc/rc.local /tmp"
Ejemplo de Playbook
Inventario:
[aps]
ap1.ejemplo.com
ap2.ejemplo.com
ap3.ejemplo.com
[routers]
router1.ejemplo.com
[openwrt:children]
aps
routers
Playbook:
- hosts: openwrt
roles:
- gekmihesg.openwrt
tasks:
- name: copiar imagen de openwrt
command: "{{ openwrt_scp }} image.bin {{ openwrt_user_host|quote }}:/tmp/sysupgrade.bin"
delegate_to: localhost
- name: iniciar sysupgrade
nohup:
command: sysupgrade -q /tmp/sysupgrade.bin
- name: esperar por reinicio
wait_for_connection:
timeout: 300
delay: 60
- name: instalar mdns
opkg:
name: mdns
state: present
- name: habilitar y iniciar mdns
service:
name: mdns
state: started
enabled: yes
- name: copiar claves autorizadas
copy:
src: authorized_keys
dest: /etc/dropbear/authorized_keys
- name: revertir cambios pendientes
uci:
command: revert
- name: configurar dispositivo wifi radio0
uci:
command: set
key: wireless.radio0
value:
phy: phy0
type: mac80211
hwmode: 11g
channel: auto
- name: configurar interfaz wifi
uci:
command: section
config: wireless
type: wifi-iface
find_by:
device: radio0
mode: ap
value:
ssid: MiSSID
encryption: psk2+ccmp
key: muy secreto
- name: confirmar cambios
uci:
command: commit
notify: recargar wifi
Ejecutar los módulos fuera de un playbook es posible de esta manera:
$ 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
Licencia
Licencia Pública General GNU v3.0 (ver https://www.gnu.org/licenses/gpl-3.0.txt)
Desarrollo
Escribir módulos personalizados para este marco no es muy difícil. Los módulos están envueltos en un script envoltorio, que proporciona algunas funciones comunes para el análisis de parámetros, manejo de json, generación de respuestas y más.
Todos los módulos deben coincidir con openwrt_<module_name>.sh
. Si module_name no es uno de los módulos centrales de Ansible, también debe haber un <module_name>.py
. Este no tiene que tener ninguna funcionalidad (puede tener algo para sistemas que no son OpenWRT) y puede contener la documentación.
Asegúrate de instalar los paquetes del requirements.txt
en tu entorno virtual y, con el entorno virtual activado, ejecutar:
$ molecule test
antes de hacer commit y enviar tu PR.
Es también muy recomendable escribir pruebas para tu nuevo módulo.
ansible-galaxy install gekmihesg.openwrt