WSLからraspberry piのアドレスを調べるのは、やっぱりpowershellが簡単でした。Ansibleにも入れても大丈夫

# WSLからRaspberry Piのアドレスを調べる

Windows10で実行しているWindows Subsystem for linuxからraspberry piにアクセスするのに、Windowsのping.exeを呼び出してraspberrypi.localのアドレスを調べてからSSH接続としていました。ちょっと不便

```terminal:ping.exeを使う
$ 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で試したら簡単でした。

```terminal:powershell.exeを使う
$ powershell.exe "(Resolve-DnsName -type A raspberrypi.local).IP4Address"
192.168.0.7
$
```

これならちょくせすSSH接続も引数に渡せばよいので、下記のようにしました。HostKeyAliasは、raspberry piのアドレスが変わっても困らないようにつけています。おすすめです

```terminal:powershell.exeを使う
$ ssh -o HostKeyAlias=raspberrypi.local -l pi $(powershell.exe "(Resolve-DnsName -type A raspberrypi.local).IP4Address")
Password: 
(以下省略)
```

:::note info
powershellの結果の開業がCRLFになって、エラーになってしまいました。とりあえずpowershellの結果から削除するように ~~`sed 's/\s*//g'`~~ ` tr -d '\r'` を追加しました。

```terminal:powershell.exeを使う
$ 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を使っています。

:::note warn
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
:::


```config:ansible.cfg
[ssh_connection]
ssh_args = -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null
```

```yaml:main.yaml
- 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`は一番よく使われているパスワードなので参考にしないでください

```terminal: ansibleの実行（ワーニングがでますが無視している）
$ 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]
(以下省略)
```