WSLからRaspberry Piのアドレスを調べる
Windows10で実行しているWindows Subsystem for linuxからraspberry piにアクセスするのに、Windowsのping.exeを呼び出してraspberrypi.localのアドレスを調べてからSSH接続としていました。ちょっと不便
$ ping.exe -4 raspberrypi.local
raspberrypi.local [192.168.0.7]に ping を送信しています 32 バイトのデータ:
192.168.0.7 からの応答: バイト数 =32 時間 =5ms TTL=64
(以下省略)
raspberry piのアドレスを調べるのはpowershellでできるとあったので、powershellで試したら簡単でした。
$ powershell.exe "(Resolve-DnsName -type A raspberrypi.local).IP4Address"
192.168.0.7
$
これならちょくせすSSH接続も引数に渡せばよいので、下記のようにしました。HostKeyAliasは、raspberry piのアドレスが変わっても困らないようにつけています。おすすめです
$ ssh -o HostKeyAlias=raspberrypi.local -l pi $(powershell.exe "(Resolve-DnsName -type A raspberrypi.local).IP4Address")
Password:
(以下省略)
powershellの結果の開業がCRLFになって、エラーになってしまいました。とりあえずpowershellの結果から削除するように sed 's/\s*//g'
tr -d '\r'
を追加しました。
$ ssh -o HostKeyAlias=raspberrypi.local -l pi $(powershell.exe "(Resolve-DnsName -type A raspberrypi.local).IP4Address" | tr -d '\r')
Password:
(以下省略)
Ansibleにも入れても大丈夫
ansibleでもpowershellでraspberry piのアドレスを調べてるようにするのもできましたので、参考に載せておきます。
hosts: localhost
でraspberry piのアドレスを調べてadd_host
でraspberrypi
を登録しています。
hosts: raspberrypi
は、初期パスワードの変更とNTPやtimezoneの設定してパッケージをインストールするとこまでしか書いていません。
初期パスワードの変更は、一回デフォルトに変更して接続を試しているので二回目だとエラーになるためignore_unreachable: yes
を入れています。
ansibleは、2.11.8を使っています。
Raspberry pi の新しいOSは、SDカードのイメージを作成するときに、いろいろ設定ができるように拡張されました。
また、デフォルトユーザもpiではなくなっています。
この記事はあまり参考にならないです。
下記当たりを参考にしてください
https://www.raspberrypi.com/documentation/computers/getting-started.html#advanced-options
https://www.raspberrypi.com/documentation/computers/configuration.html#setting-up-a-headless-raspberry-pi
[ssh_connection]
ssh_args = -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null
- hosts: localhost
gather_facts: no
pre_tasks:
- name: Find IP Address of Raspberry Pi
shell: |
powershell.exe "(Resolve-DnsName -type A raspberrypi.local).IP4Address"
changed_when: False
register: resolve
- name: Show IP Address of Raspberry Pi
debug:
msg: '{{ resolve.stdout }}'
- name: Add Raspberry Pi to hosts
add_host:
hostname: raspberrypi
ansible_ssh_host: '{{ resolve.stdout }}'
ansible_user: pi
# New password
ansible_password: 123456
ansible_python_interpreter: python3
changed_when: False
- hosts: raspberrypi
gather_facts: no
become: true
handlers:
- name: Restart timesyncd
systemd:
name: systemd-timesyncd
state: restarted
daemon_reload: yes
tasks:
- name: Change password from default password
block:
- name: Set default password to sshpass
set_fact:
# Default password
ansible_ssh_pass: raspberry
- name: Try changing pi user password (Ignore if unreachable)
shell: |
echo '{{ ansible_user }}:{{ ansible_password }}' | chpasswd
ignore_unreachable: yes
- set_fact:
ansible_ssh_pass: null
- name: NTP settings for timesyncd
lineinfile:
dest: /etc/systemd/timesyncd.conf
regexp: '^#?NTP='
line: 'NTP=ntp.nict.jp'
notify:
- Restart timesyncd
- name: Set timezone to tokyo
timezone:
name: Asia/Tokyo
- name: Install packages
apt:
package:
- i2c-tools
- python3-pip
新しいパスワードとして設定している123456
は一番よく使われているパスワードなので参考にしないでください
$ ansible-playbook main.yaml
[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match
'all'
PLAY [localhost] *******************************************************************************************************
TASK [Find IP Address of Raspberry Pi] *********************************************************************************
ok: [localhost]
TASK [Show IP Address of Raspberry Pi] *********************************************************************************
ok: [localhost] => {
"msg": "192.168.0.7"
}
TASK [Add Raspberry Pi to hosts] ***************************************************************************************
ok: [localhost]
(以下省略)