gekmihesg.openwrt
Ansible-Rolle: openwrt
Verwalte OpenWRT und Abkömmlinge mit Ansible, aber ohne Python.
Indem du einen Host in die Inventargruppe openwrt
einfügst, werden einige Module durch eine Shell-Version ersetzt, die auf einer Standard-OpenWRT-Installation läuft, wobei versucht wird, die meisten ursprünglichen Funktionen beizubehalten. Hosts, die nicht in dieser Gruppe sind, sind nicht betroffen. Dies ermöglicht es, Aufgaben mit OpenWRT und anderen Plattformen zu mischen. Es sind auch einige neue, OpenWRT-spezifische Module enthalten (wie uci
).
Nicht alle Argumentkombinationen sind getestet! Einige Fälle wurden nur aus Vollständigkeitsgründen von Python übersetzt.
Derzeit sind die folgenden Module implementiert:
- command
- copy
- fetch (implizit)
- file
- lineinfile
- nohup (neu)
- opkg
- ping
- service
- setup
- shell (implizit)
- slurp
- stat
- sysctl
- template (implizit)
- uci (neu)
- wait_for_connection (implizit)
Um all dies zu erreichen, sind einige Anpassungen erforderlich (falls du dich über die vars_plugins
wunderst).
Kompatibilität
Diese Rolle wurde erfolgreich getestet mit:
- LEDE 17.01 (manuell)
- OpenWRT 18.06
- OpenWRT 19.07
- OpenWRT 21.02
- OpenWRT 22.03
Anforderungen
Einige Module benötigen optional eine Möglichkeit, SHA1-Hashes zu generieren oder Daten Base64 zu codieren. Im Falle von Base64 gibt es eine sehr langsame hexdump | awk
Implementierung. Für SHA1 gibt es keinen Workaround.
Die Module versuchen, verwendbare Systembefehle für SHA1 (sha1sum
, openssl
) und Base64 (base64
, openssl
, Workaround) zu finden, wenn nötig. Wenn keine verwendbaren Befehle gefunden werden, funktioniert die meiste Funktionalität weiterhin, aber das fetch-Modul muss zum Beispiel mit validate_checksum: no
ausgeführt werden, wird immer die Datei herunterladen und changed: yes
zurückgeben.
Daher wird empfohlen, coreutils-sha1sum
und coreutils-base64
zu installieren, wenn die Befehle nicht bereits von Busybox bereitgestellt werden. Die Rolle erledigt dies standardmäßig automatisch (siehe unten).
Rollenvariablen
openwrt_install_recommended_packages:
Überprüft einige Befehle und installiert die entsprechenden Pakete, wenn sie fehlen.
Siehe Anforderungen oben. (Standard: ja)
openwrt_scp_if_ssh:
Ob scp anstelle von sftp für OpenWRT-Systeme verwendet werden soll. Der Wert kann `ja`,
`nein` oder `intelligent` sein. Ansible verwendet standardmäßig `intelligent`, aber diese Rolle verwendet standardmäßig `ja`,
da OpenWRT standardmäßig kein sftp anbietet. (Standard: ja)
openwrt_remote_tmp:
Ansibles remote_tmp-Einstellung für OpenWRT-Systeme. Standardmäßig auf /tmp eingestellt, um
Flash-Verschleiß auf dem Zielgerät zu vermeiden. (Standard: /tmp)
openwrt_wait_for_connection, openwrt_wait_for_connection_timeout:
Ob auf den Host gewartet werden soll (Standard: ja) und wie lange (300), nach einem
Netzwerk- oder WLAN-Neustart (siehe Handler).
openwrt_ssh, openwrt_scp, openwrt_ssh_host, openwrt_ssh_user, openwrt_user_host:
Hilfsshortcuts, um Dinge wie
"command: {{ openwrt_scp }} {{ openwrt_user_host|quote }}:/etc/rc.local /tmp" zu tun.
Beispiel-Playbook
Inventar:
[aps]
ap1.example.com
ap2.example.com
ap3.example.com
[routers]
router1.example.com
[openwrt:children]
aps
routers
Playbook:
- hosts: openwrt
roles:
- gekmihesg.openwrt
tasks:
- name: OpenWRT-Image kopieren
command: "{{ openwrt_scp }} image.bin {{ openwrt_user_host|quote }}:/tmp/sysupgrade.bin"
delegate_to: localhost
- name: Sysupgrade starten
nohup:
command: sysupgrade -q /tmp/sysupgrade.bin
- name: Auf Neustart warten
wait_for_connection:
timeout: 300
delay: 60
- name: mdns installieren
opkg:
name: mdns
state: present
- name: mdns aktivieren und starten
service:
name: mdns
state: started
enabled: yes
- name: autorisierte Schlüssel kopieren
copy:
src: authorized_keys
dest: /etc/dropbear/authorized_keys
- name: ausstehende Änderungen zurücksetzen
uci:
command: revert
- name: WLAN-Gerät radio0 konfigurieren
uci:
command: set
key: wireless.radio0
value:
phy: phy0
type: mac80211
hwmode: 11g
channel: auto
- name: WLAN-Schnittstelle konfigurieren
uci:
command: section
config: wireless
type: wifi-iface
find_by:
device: radio0
mode: ap
value:
ssid: MeinSSID
encryption: psk2+ccmp
key: sehr geheim
- name: Änderungen übernehmen
uci:
command: commit
notify: WLAN neu laden
Die Module außerhalb eines Playbooks auszuführen, ist so möglich:
$ 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
Lizenz
GNU General Public License v3.0 (siehe https://www.gnu.org/licenses/gpl-3.0.txt)
Entwicklung
Das Schreiben eigener Module für dieses Framework ist nicht schwer. Die Module sind in ein Wrapper-Skript eingebettet, das einige gemeinsame Funktionen für Parameteranalyse, JSON-Verarbeitung, Antwortgenerierung und mehr bereitstellt.
Alle Module müssen dem Muster openwrt_<modul_name>.sh
entsprechen. Wenn modul_name nicht eines der Kernmodule von Ansible ist, muss auch eine <modul_name>.py
vorhanden sein. Diese muss keine Funktionalität haben (sie kann einige für Nicht-OpenWRT-Systeme haben) und kann die Dokumentation enthalten.
Stelle sicher, dass du die Pakete aus requirements.txt
in deiner virtuellen Umgebung installierst und, mit aktivierter venv, führe Folgendes aus:
$ molecule test
bevor du deine Änderungen committest und einreichst.
Es wird auch dringend empfohlen, Tests für dein neues Modul zu schreiben.
ansible-galaxy install gekmihesg.openwrt