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.

Acerca del proyecto

Manage OpenWRT without python

Instalar
ansible-galaxy install gekmihesg.openwrt
Licencia
gpl-3.0
Descargas
35.5k
Propietario