Ansibleでいろいろセットアップ

## 公開鍵配置とパスワード不要sudo
ログインパスワードは知っていて、Ansibleで操作するにはちょっとめんどくさいときに初期セットアップ的に行うやつ。公開鍵を配置し、sudo時にパスワード不要に設定する。
※完全にメモなのはごめんなさい。

### 事前作業
公開鍵を作成しておく。
```
# ssh-keygen
```
ansible本体と追加のパッケージをインストールする。
```
# dnf -y install ansible-core
# ansible --version
# ansible-galaxy collection install ansible.posix
# dnf install pip -y
# pip install passlib
```

インベントリファイルも作成しておく。
```ini:inventory.ini
[server]
192.168.13.113
```



### 実行コマンド
必要に応じて`--check`は外す。

```
# ansible-playbook -i inventory.ini set-pubkey.yml --ask-pass --ask-become-pass --check 
```

### Playbook
```yaml:set-pubkey.yml
---
- name: Deploy SSH public key
  hosts: all
  remote_user: sysadmin
  become: yes

  tasks:
    - name: Ensure .ssh directory exists
      file:
        path: "/home/sysadmin/.ssh"
        state: directory
        mode: '0700'
        owner: sysadmin
        group: sysadmin

    - name: Add SSH public key
      ansible.posix.authorized_key:
        user: sysadmin
        state: present
        key: "{{ lookup('file', '~/.ssh/id_rsa.pub') }}"

    - name: Allow passwordless sudo for sysadmin
      lineinfile:
        path: /etc/sudoers
        state: present
        regexp: '^sysadmin'
        line: 'sysadmin ALL=(ALL) NOPASSWD: ALL'
        validate: 'visudo -cf %s'
```

## いろいろセットアップする。
### 実行コマンド
必要に応じて`--check`は外す。

```
# ansible-playbook -i inventory.ini os-conf.yml --check
```

### Playbook
```yaml:os-conf.yml
---
- name: Configure system users, NTP, and install httpd, NetData
  hosts: all
  become: yes
  tasks:
    - name: Create user stadmin
      user:
        name: stadmin
        groups: wheel
        password: "{{ 'admin' | password_hash('sha512') }}"

    - name: Create user stuser
      user:
        name: stuser
        password: "{{ 'user' | password_hash('sha512') }}"

    - name: Install chrony package
      yum:
        name: chrony
        state: present

    - name: Configure chrony to use ntp.nict.jp
      lineinfile:
        path: /etc/chrony.conf
        regexp: '^pool'
        line: 'pool ntp.nict.jp iburst'
      notify: Restart chronyd

    - name: Ensure chronyd is started and enabled
      systemd:
        name: chronyd
        state: started
        enabled: yes

    - name: Install httpd
      package:
        name: httpd
        state: present

    - name: Ensure httpd is started and enabled
      systemd:
        name: httpd
        state: started
        enabled: yes

    - name: Open firewall for httpd
      firewalld:
        service: http
        permanent: yes
        state: enabled
      notify: Reload firewall

    - name: Install epel-release
      package:
        name: epel-release
        state: present

    - name: Install NetData
      package:
        name: netdata
        state: present

    - name: Ensure NetData is started and enabled
      systemd:
        name: netdata
        state: started
        enabled: yes

    - name: Open firewall for NetData
      firewalld:
        port: 19999/tcp
        permanent: yes
        state: enabled
      notify: Reload firewall

    - name: Get host IP address
      set_fact:
        host_ip: "{{ ansible_default_ipv4.address }}"

    - name: Setup the netdata.conf
      lineinfile:
        path: /etc/netdata/netdata.conf
        regexp: '^    bind to ='
        line: "    bind to = {{ host_ip }}"
      notify: Restart NetData

  handlers:
    - name: Restart chronyd
      systemd:
        name: chronyd
        state: restarted

    - name: Reload firewall
      command: firewall-cmd --reload

    - name: Restart NetData
      systemd:
        name: netdata
        state: restarted
```
## Ansibleを使わない場合の手順
### ユーザー作成・グループ追加
```
# useradd stadmin
# passwd stadmin
# usermod -aG wheel stadmin
# useradd stuser
# passwd stuser
```

### NTP設定
`/etc/chrony.conf`のpool行（3行目）を変更する。
```diff:/etc/chrony.conf
- pool 2.centos.pool.ntp.org iburst
+ pool ntp.nict.jp iburst
```
chronydの再起動
```
#  systemctl restart chronyd.service
```
### ApacheのインストールとFW許可
#### インストール
```
# dnf install httpd -y
```
#### Firewall許可
サービスでもポートでもどちらでも良い。

```:サービスで許可の場合
# firewall-cmd --add-service=http
# firewall-cmd --runtime-to-permanent
```
```:ポート指定で許可の場合
# firewall-cmd --add-port=80/tcp
# firewall-cmd --runtime-to-permanent
```

#### サービス起動・自動起動設定
```
# systemctl start httpd
# systemctl enable httpd
```

### Basic認証を実装
#### 設定ファイル
`/etc/httpd/conf.d/auth_basic.conf`に下記の通り設定を記載する。（新規作成）
```:/etc/httpd/conf.d/auth_basic.conf
<Directory /var/www/html/auth-basic>
    AuthType Basic
    AuthName "Basic Authentication"
    AuthUserFile /etc/httpd/conf/.htpasswd
    require valid-user
</Directory> 
```

#### ユーザー登録
`user`というユーザーを作成し、パスワードの設定を行う。
```
# htpasswd -c /etc/httpd/conf/.htpasswd user
New password:     # パスワード設定
Re-type new password:
Adding password for user user
```

#### ディレクトリ作成とApache再起動
テストページ用ディレクトリ（フォルダ）を作成し、Apacheを再起動する。（設定再読み込み）
```
# mkdir /var/www/html/auth-basic
# systemctl reload httpd
```

#### テスページ作成
`/var/www/html/auth-basic/index.html`に下記を記載する。（新規作成）
```
<html>
<body>
<div style="width: 100%; font-size: 40px; font-weight: bold; text-align: center;">
Test Page for Basic Authentication
</div>
</body>
</html>
```
#### 実装確認
`http://(IPアドレス)/auth-basic/`にブラウザでアクセスし、下記のようなダイアログが出て来たらユーザーパスワードを入力してページを表示させる。
注意したいのが、一度ブラウザで正しいユーザー／パスワードを入力すると、ブラウザを閉じるまでパスワードレスでページが表示できてしまう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616810/e0db3128-5948-da03-715e-21acc313d1dc.png)


### NetDataインストール
リソースモニタリングツールであるNetDataをインストールする。
#### epel-releaseインストール
`epel-release`は、追加のパッケージをインストールするときに使うやつ。
NetDataを入れるには必要。
```
# dnf install epel-release -y
```

#### NetDataインストール
```
# dnf install netdata -y
```

#### 設定ファイル編集
アクセスを受け付けられるよう、自分のIPアドレスを設定する。
```:/etc/netdata/netdata.conf
bind to = 192.168.17.118
```

#### 再起動とFW穴あけ
```
# systemctl enable --now netdata
# firewall-cmd --add-port=19999/tcp
# firewall-cmd --runtime-to-permanent
```

#### 動作確認
`http://(IPアドレス):19999/`にブラウザでアクセスすると、下記のような画面が表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616810/3a4ee42f-538c-fad0-959a-0da263486e66.png)