Terraform에서 간단한 raspberry pi 설정

라즈파이 3을 사용하여 Web Bluetooth API를 해보고 싶은 오랜만에 설정에서 해 보려고.
그러나 라즈파이의 셋업은 언제나 귀찮네요.
모니터와 키보드 연결하여 고정 IP 흔들어 SSH 연결하고 마침내 시작 같은.

그럴 때 인프라 공부회에서 Terraform이라는 것을 알았습니다.

AWS와 Azure, GCP 등에서 사용되는 환경 구축 도구입니다. golang으로 구현되어 있기 때문에 exe를 배치하는 것만으로 설치도 간단합니다. 본래의 용도와는 조금 다릅니다만 이것을 사용해 디스플레이나 키보드 없이도 라즈파이를 설정하고 RDP에 연결해 보았습니다. 사용한 것 ・Windows10 · Terraform v0.11.1 · Bonjour Print Services · Raspbian Stretch with desktop November 2017 설정 Terraform의 Win64bit용을 다운로드해 해동. C 드라이브 바로 아래에 배치하여 PATH로 설정했습니다.

라즈파이에 호스트 이름 (raspberry.local)으로 액세스하려면
Bonjour Print Services를 넣었습니다.



raspbian을 떨어 뜨려 16GB의 SD 카드에 구웠습니다.



PC와 라즈파이를 LAN 케이블로 직접 연결합니다.
PC의 USB 포트에 연결하여 라즈파이의 전원을 켭니다.



설정 파일(제1진)



Terraform 구성 파일을 쓰고 .tf로 저장합니다.
wlan0에 고정 IP를 설정합니다.

raspi_wifi.tf
variable "raspi_ip" {
  default = "raspberrypi.local"
}

resource "null_resource" "raspi_wifi" {

  connection {
    type = "ssh"
    user = "pi"
    host = "${var.raspi_ip}"
    password = "raspberry"
  }

  provisioner "remote-exec" {
    inline = [
      "sudo sh -c 'wpa_passphrase ssid password >> /etc/wpa_supplicant/wpa_supplicant.conf'",
      "sudo sh -c 'echo \"interface wlan0\" >> /etc/dhcpcd.conf'",
      "sudo sh -c 'echo \"static ip_address=192.168.0.20/24\" >> /etc/dhcpcd.conf'",
      "sudo sh -c 'echo \"static routers=192.168.0.1\" >> /etc/dhcpcd.conf'",
      "sudo sh -c 'echo \"static domain_name_servers=192.168.0.1\" >> /etc/dhcpcd.conf'",
      "sudo reboot"
    ]
  }
}

막상 실행(제1진)



ping raspberrypi.local에서 연결을 확인한 후 실행합니다.
C:\terraform_0.11.1_windows_amd64>terraform.exe apply -target=null_resource.raspi_wifi

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  + null_resource.raspi_wifi
      id: <computed>


Plan: 1 to add, 0 to change, 0 to destroy.

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

null_resource.raspi_wifi: Creating...
null_resource.raspi_wifi: Provisioning with 'remote-exec'...
null_resource.raspi_wifi (remote-exec): Connecting to remote host via SSH...
null_resource.raspi_wifi (remote-exec):   Host: raspberrypi.local
null_resource.raspi_wifi (remote-exec):   User: pi
null_resource.raspi_wifi (remote-exec):   Password: true
null_resource.raspi_wifi (remote-exec):   Private key: false
null_resource.raspi_wifi (remote-exec):   SSH Agent: false
null_resource.raspi_wifi (remote-exec): Connected!
null_resource.raspi_wifi: Still creating... (10s elapsed)
null_resource.raspi_wifi: Creation complete after 10s (ID: 5564360285778435530)

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

C:\terraform_0.11.1_windows_amd64>

재부팅을 기다리고 핑을 날려 보면 응답이있었습니다.
C:\terraform_0.11.1_windows_amd64>ping 192.168.0.20

192.168.0.20 に ping を送信しています 32 バイトのデータ:
192.168.0.20 からの応答: バイト数 =32 時間 =71ms TTL=64
192.168.0.20 からの応答: バイト数 =32 時間 =7ms TTL=64
192.168.0.20 からの応答: バイト数 =32 時間 =7ms TTL=64
192.168.0.20 からの応答: バイト数 =32 時間 =5ms TTL=64

192.168.0.20 の ping 統計:
    パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
    最小 = 5ms、最大 = 71ms、平均 = 22ms

C:\terraform_0.11.1_windows_amd64>

SSH 연결하여 설정을 확인합니다.
제대로 설정되어 있네요.
pi@raspberrypi:~ $ ifconfig wlan0
wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.0.20  netmask 255.255.255.0  broadcast 192.168.0.255
        inet6 fe80::7215:39ac:9f30:1f99  prefixlen 64  scopeid 0x20<link>
        inet6 240f:7b:96b1:1:4f85:988f:58ed:8716  prefixlen 64  scopeid 0x0<global>
        ether b8:27:eb:f2:e6:b2  txqueuelen 1000  (Ethernet)
        RX packets 64  bytes 8154 (7.9 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 61  bytes 9163 (8.9 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

pi@raspberrypi:~ $ tail -4 /etc/dhcpcd.conf
interface wlan0
static ip_address=192.168.0.20/24
static routers=192.168.0.1
static domain_name_servers=192.168.0.1

설정 파일(제2진)



Windows에서 RDP로 연결하고 싶기 때문에 xrdp를 넣어 키보드 설정을합니다.


raspi_xrdp.tf
variable "raspi_ip" {
  default = "raspberrypi.local"
}

resource "null_resource" "raspi_xrdp" {

  connection {
    type = "ssh"
    user = "pi"
    host = "${var.raspi_ip}"
    password = "raspberry"
  }

  provisioner "remote-exec" {
    inline = [
      "sudo apt-get update",
      "sudo apt-get -y install xrdp",
      "sudo wget http://w.vmeta.jp/temp/km-0411.ini -P /etc/xrdp",
      "sudo ln -s /etc/xrdp/km-0411.ini /etc/xrdp/km-e0010411.ini",
      "sudo ln -s /etc/xrdp/km-0411.ini /etc/xrdp/km-e0200411.ini",
      "sudo ln -s /etc/xrdp/km-0411.ini /etc/xrdp/km-e0210411.ini",
    ]
  }
}

막상 실행(제2진)



로그는 길기 때문에 생략합니다.
Apply complete! 로 정상적으로 완료한 것 같아서 접속해 보겠습니다.





오, 얼마나 쉽지 않니?

요약



본래의 사용법은 아닐지도 모르지만, 제가 편리하기 때문에 이것은 이것으로 좋은 것입니다.
똑같은 것은 ansible이라도 할 수 있지만 ansible은 Windows에서는 움직이지 않네요.

라즈파이를 사용하여 인프라 자동화를 배우고 싶습니다. (오시마)

※ 모두 어서 인프라 공부회

좋은 웹페이지 즐겨찾기