windows(wsl)、virtualBoxでAnsibleの開発環境を作る

##  次回からのサーバ接続memo
- virtualboxで仮想マシンの電源ON
- vscodeでリモート接続

再起動するとIP変わるかも→変わらなかった

```bash
# wsl
ssh 192.168.40.246 # control-node
ssh 192.168.40.96 # managed-node01
ssh 192.168.40.83 # managed-node02
```

## 方針
control_nodeを1台セットアップしてから、クローンしてmanaged_nodeを作成し、ホスト名変えることにする。  
そうすることでセットアップの手間が省ける

## wsl2のセットアップ
すでにセットアップしてたので今回は省略する。

資料（これでセットアップはしていない）
https://tech-lab.sios.jp/archives/21023#i-2

## wsl2にAnsibleのセットアップ
すでにセットアップしてたので今回は省略する。ControlNodeにする。仮想マシンでもControlNodeは作る

資料（これでセットアップはしていない）
https://tech-lab.sios.jp/archives/21023




## isoファイルダウンロード
仮想マシンを作るにはisoファイルなるものが必要。

https://rockylinux.org/ja/download

## 仮想マシン作成手順（ControlNode）
- ControlNode1台つくる。後でクローンする。
- 以下の手順通り行う必要がある

https://qiita.com/seshat/items/2c57ed9225c18c89469e

- ファイル→環境設定→入力→仮想マシン→ホストキーの組み合わせ→`ctrl`に変えた
- `自動インストールをスキップ`のチェックを外しておく。チェックがあると作成になぜか失敗する
- `Installation Source`は触ってはいけない。戻ることができない
- ホスト名にアンダーバー使えない
- rootのパスワードは`root`
- アカウントはユーザアカウントは`tsuyoshi`
- ユーザパスワードは`root`にしておこう
- ネットワーク、タイムゾーンがよく忘れる
- 再起動ボタンがあるので、押すとログインが可能になる。

## コンソールログイン
`tsuyoshi/root`でログインする

## ip確認（ControlNode）（コンソール接続）

```bash
[tsuyoshi@rocky01 ~]$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 08:00:27:cf:ec:bd brd ff:ff:ff:ff:ff:ff
    inet 192.168.40.7/24 brd 192.168.40.255 scope global dynamic noprefixroute enp0s3 # ここ！
       valid_lft 35940sec preferred_lft 35940sec
...
[tsuyoshi@rocky01 ~]$
```

## wslからパスワード認証でssh接続する
コンソール接続ではコピペができないので使いずらい。

```bash
ssh ip_address
```
パスワード`root`
wslのユーザもtsuyohiなので省略。省略しない場合は`ssh tsuyoshi@ip_address`

## ssh鍵作成する（ControlNode)


```bash
cd ~/
ssh-keygen -t ed25519 -C "your_email@example.com"
chmod 600 .ssh/id_ed25519
cat ~/.ssh/id_ed25519.pub > .ssh/authorized_keys
chmod 600 .ssh/authorized_keys

cat ~/.ssh/id_ed25519 # wslにもっていく
```

- パスフレーズはなしでOK
- id_ed25519はwslにも作成する

## パスワード認証をやめる（ControlNode）

```bash
sudo vi /etc/ssh/sshd_config
PasswordAuthentication no # 行は存在する.70行目ぐらい

sudo systemctl restart sshd
```

## sudoパスワード無効化（ControlNode）
面倒なので無効にする
```bash
sudo visudo
```

1番下に追加
```bash
tsuyoshi ALL=NOPASSWD: ALL
```

## yum update（ControlNode）

```bash
sudo yum update -y;sudo yum install vim git -y;sudo dnf install tree -y
```

## python3.11導入（ControlNode）
:::note info
参考資料
- [RockyLinux OS 8 に Python 3.11 をインストール（AppStream）](https://qiita.com/witchcraze/items/386b30f1f80745f8a9e3)
- [pythonコマンドでpythonはpython3.8を指す](https://qiita.com/LI_MO/items/6328106cdd83fcb830d3)

:::

```bash
sudo dnf install python3.11 -y

which python3

python3 --version

# python関連ファイルを検索（見るだけかな）
whereis python

# シンボリックリンクを作成
sudo ln -s /usr/bin/python3.11 /usr/bin/python

# pythonのバージョンを表示
python -V
Python 3.11.5
```


## pipインストール（ControlNode）
```bash
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python get-pip.py # sudoですべきかも
pip list
```

<details><summary>実行例</summary><div>

```bash
[tsuyoshi@rocky01 ~]$ pip list
Package    Version
---------- -------
pip        24.0
setuptools 69.1.1
wheel      0.42.0
```

</div></details>


## ansibleインストール（ControlNode）

:::note info
参考資料
Ansible 9.3.0 contains ansible-core version 2.16.4　が新しい

- https://github.com/ansible/ansible/blob/stable-2.9/changelogs/CHANGELOG-v2.9.rst
- https://docs.ansible.com/ansible-core/2.16/
- https://github.com/ansible-community/ansible-build-data/blob/9.3.0/9/CHANGELOG-v9.md
- https://docs.ansible.com/ansible/devel/porting_guides/porting_guide_9.html
- https://www.python.org/downloads/
- https://docs.ansible.com/ansible/2.9_ja/installation_guide/intro_installation.html#pip-ansible

:::

yumではansibleの最新版がインストールできなかった。リポジトリにおそらくない。

```bash
pip install ansible ansible-lint # sudoをつけたいがつけるとpipがないと言われる。マニュアルにはグローバルにインストールするにはsudoをつけて--userなしでインストールと書いてあった
pip list
ansible-community --version
```

<details><summary>実行例</summary><div>

```bash
[tsuyoshi@rocky01 ~]$ pip list
Package      Version
------------ -------
ansible      9.3.0 # 最新が入った
ansible-core 2.16.4

[tsuyoshi@rocky01 ~]$ ansible-community --version
Ansible community version 9.3.0
...
```

</div></details>


## ipv6無効

https://ja.linux-console.net/?p=2752

```
sudo vim /etc/default/grub

# 以下の行を最後に追加します。
GRUB_CMDLINE_LINUX="$GRUB_CMDLINE_LINUX ipv6.disable=1"

sudo grub2-mkconfig -o /boot/grub2/grub.cfg
sudo grub2-mkconfig -o /boot/efi/EFI/rocky/grub2.cfg
sudo reboot

ip addr
```

## 仮想マシーンの複製
control_nodeをクローンして、managed_nodeを2台作る
- 電源OFF
- クローン
- 名前変更
- `ip addr`でip確認してwslでssh接続


## ホスト名変更
```bash
# sudo hostnamectl set-hostname control-node
sudo hostnamectl set-hostname managed-node01
sudo hostnamectl set-hostname managed-node02

uname -n
```
- ssh入りなおすだけでいい？
- このあと電源OFFー＞ON
- 全台リブートしないと、DNSが反映されてない気がする
- control-nodeからpingしてみる。名前解決ができることを確認する。もしかすると時間がかかる
```
ping managed-node01
ping managed-node02

ssh managed-node01
ssh managed-node02
```

## ansibleのコードのひな型作成（ControlNode)
```bash
mkdir -p ~/ansible_test/roles

cd ~/ansible_test/roles
ansible-galaxy init test_role
```

<details><summary>実行例</summary><div>

```bash
[tsuyoshi@rocky01 ansible_test]$ tree test_role/
test_role/
├── README.md
├── defaults
│   └── main.yml
├── files
├── handlers
│   └── main.yml
├── meta
│   └── main.yml
├── tasks
│   └── main.yml
├── templates
├── tests
│   ├── inventory
│   └── test.yml
└── vars
    └── main.yml
```

</div></details>

## テスト用playbook作成（ControlNode)

```bash
vi ~/ansible_test/playbook.yml
```

```bash:~/ansible_test/playbook.yml
---
- name: deploy test
  remote_user: tsuyoshi
  hosts: all
  # hosts: localhost
  gather_facts: no
  become: true
  tasks:
    - name: Perform ping
      ansible.builtin.ping:
      
    - name: exec test_role
      ansible.builtin.include_role:
        name: test_role
  # roles:
    # - role: test_role
    #   tags: common
    # - role: mattermost
    #   tags: mattermost
```


## テスト用role作成（ControlNode)

### main.yml作成
```bash
vi ~/ansible_test/roles/test_role/tasks/main.yml
```

```bash:~/ansible_test/roles/test_role/tasks/tasks/main.yml
---
- name: Copy file from local to remote
  ansible.builtin.copy:
    src: files/hello.txt
    dest: /tmp/hello.txt
    owner: root
    group: root
    mode: "0644"
```

### hello.txt作成
```bash
vi ~/ansible_test/roles/test_role/files/hello.txt
```

```bash:~/ansible_test/roles/test_role/files/hello.txt
hello
```

## inventory作成（ControlNode)

```bash
mkdir -p ~/ansible_test/inventories
vi ~/ansible_test/inventories/dev
```

```bash:~/ansible_test/inventories/dev
---
all:
 hosts:
   192.168.40.135:
 children:
  web:
   hosts:
    192.168.40.135:
  # db:
   # hosts:
     # 172.17.0.2:
```

```bash:~/ansible_test/inventories/dev
---
all:
  hosts:
    managed-node01:
    managed-node02:
  children:
    web:
      hosts:
        managed-node01:
    db:
      hosts:
        managed-node02:
```

## ansible-lint

https://ansible.readthedocs.io/projects/lint/usage/

```bash
# 検出
cd ~/
ansible-lint ~/ansible_test/

# エラーになるので消しておく
rm -v ~/ansible_test/roles/test_role/tests/test.yml
rm -v ~/ansible_test/roles/test_role/meta/main.yml

# 自動修正
ansible-lint ~/ansible_test/ --fix
```

## 疎通確認（ControlNode)

```bash
cd ~/ansible_test
ansible localhost -m ping
ansible all -i ~/ansible_test/inventories/dev -m ping
```

## playbookを試す（ControlNode)

```bash
cd ~/ansible_test
ansible-playbook -i ~/ansible_test/inventories/dev ~/ansible_test/playbook.yml

# sudoパスワードを無効化してないときは--ask-become-passが必要です
# ansible-playbook -i ~/ansible_test/inventories/dev playbook.yml --ask-become-pass
```
- Managedに/tmp/hello.txtがあればOK

## あとは自由に開発しましょう（ControlNode)

main.ymlにコードを追加すればOK
```bash
cd ~/ansible_test
vi ~/ansible_test/roles/test_role/tasks/tasks/main.yml
```

実行方法は

```bash
cd ~/ansible_test
ansible-playbook -i ~/ansible_test/inventories/dev playbook.yml
```

## vscodeを使う（vscodeでControlNodeにアクセス)

https://nakadalog.com/vscode-remotessh-virtualbox/

## タイムゾーン変更（ControlNode/ManagedNode）

初期構築時に設定忘れたら実行する

https://www.server-world.info/query?os=Rocky_Linux_8&p=timezone

## 勝手に電源OFFになる
なんでだろう？