👏
ansibleでRaspberry Piのethernet接続の固定IPを振る
Raspberry Pi 4を実家で運用していたのですが、新しいSDカードをセットアップして古い環境からの移行をする際にansibleを活用してみました。
前提条件
- Raspberry Pi OS Lite 64-bit版をSDカードに書き出していること
- Raspberry Piには事前にsshでログイン出来ていること、かつ、sudoが実行できる環境にあること
- Raspberry Piのネットワーク設定はNetworkManagerを使う
- ansibleのcommunity.general.nmcliモジュールは使わないでテンプレートから固定IPアドレスを割り振る
- pipの代わりにuvを利用しているので、適当に読み替えてください。
- SSHユーザ名はuserとしていますので、適当に読み替えてください。
Raspberry Pi側の作業
まず、eth0に割り振られたUUIDを調べます。
ssh user@192.168.0.xx
nmcli connection show|grep eth0
表示されたUUIDをコピーしておきます。
ansible環境構築
まず、ansibleの環境をuvを使ってセットアップします。
uv init new-pi-ansible
cd new-pi-ansible
rm main.py #いらないので削除
uv add ansible
次にroles/base/tasks/main.yml
とroles/base/tasks/static_ip.yml
とroles/base/templates/eth0.j2
を作成します。
mkdir -p roles/base/tasks
touch roles/base/tasks/main.yml
touch roles/base/tasks/static_ip.yml
mkdir -p roles/base/templates/
touch roles/base/templates/eth0.j2
roles/base/tasks/main.yml
は以下の内容です。
---
- include_tasks: static_ip.yml
roles/base/tasks/static_ip.yml
は以下の内容です。
---
- name: setup connection name to eth0
command: nmcli connection modify {{ eth0_uuid }} connection.id eth0
- name: setup static ip
template:
src: eth0.j2
dest: /etc/NetworkManager/system-connections/eth0.nmconnection
owner: root
group: root
- name: reload network
command: nmcli connection reload
roles/base/templates/eth0.j2
は以下の内容です。
[connection]
id=eth0
uuid={{ eth0_uuid }}
type=ethernet
autoconnect=true
interface-name=eth0
[ethernet]
[ipv4]
dns={{ dns_address }}
method=manual
address1={{ ip_address }}/24,{{ gateway_address }}
autoconnect=true
続いて、inventory.ini
とnew-pi.yml
を作成します。
touch inventory.ini
touch new-pi.yml
inventory.ini
は以下の内容です。IPアドレスとansibleを実行するユーザを指定します。
[new-pi]
192.168.0.xx ansible_user=user
new-pi.yml
は以下の内容です。UUIDなどは適当に読み替えてください。
- hosts: new-pi
become: yes
roles:
- base
vars:
ip_address: 192.168.0.yy
gateway_address: 192.168.0.1
eth0_uuid: 05a32479-940b-3e70-b481-19cb4bf5d945
dns_address: 1.1.1.1
あとはansible-playbook
を実行します。--ask-become-pass
はsudoを実行するためのパスワードを聞いてくるオプションです。
uv run ansible-playbook -i inventory.ini new-pi.yml --ask-become-pass
設定が完了したら新しいIPアドレスで動作しているか確認してください。また、inventory.ini
も続きの作業をやる場合には修正しておく必要があります。
また、DNSのアドレスの反映は再起動後になりますので、Raspberry Piの再起動を実施しましょう。
解説
-
nmcli connection modify {{ eth0_uuid }} connection.id eth0
ではデフォルトの接続名をeth0
に変更する処理をしています。これはWired Connection
とかいうスペースが含まれる名前がデフォルトで割り振られるため、事前に設定しやすい名前にしておこうという魂胆です。ただ、eth0.j2
の内容で上書きされるかもしれないので必要無いかもしれないです。 -
eth0.j2
はNetworkManagerの設定ファイルの/etc/NetworkManager/system-connections/eth0.nmconnection
となります。このファイルがある状態でnmcli connection reload
が実行されると新しいIPアドレスにすぐに振られる状態になります。そのため、ansibleで続きをやろうとするとreload
のタイミングで一旦切れるので注意が必要です。 - uv便利なのでみんな使いましょう。
Discussion