gekmihesg.openwrt
Ansible Role: openwrt
Ansibleを使ってOpenWRTやその派生版を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 (暗黙的)
これを実現するために、一部のモンキーパッチが含まれています(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:
OpenWRTシステムでsftpの代わりにscpを使用するかどうか。値は`yes`、`no`、または`smart`が可能です。Ansibleのデフォルトは`smtp`ですが、このロールのデフォルトは`yes`です。なぜならOpenWRTはデフォルトでsftpを提供しないからです。(デフォルト:yes)
openwrt_remote_tmp:
OpenWRTシステムのAnsibles remote_tmp設定。ターゲットデバイスのフラッシュの摩耗を避けるために/tmpにデフォルト設定されています。(デフォルト:/tmp)
openwrt_wait_for_connection, openwrt_wait_for_connection_timeout:
ホストを待機するかどうか(デフォルト:yes)およびネットワークまたはwifiの再起動後にどのくらい待機するか(300)。(ハンドラーを参照)
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一般公衆ライセンス 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を提出する前に、これを行ってください。
新しいモジュールのためにテストを書くことも強くお勧めします。