Zenn
👏

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.ymlroles/base/tasks/static_ip.ymlroles/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.ininew-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便利なのでみんな使いましょう。
Georepublic Tech Blog

Discussion

ログインするとコメントできます