【VMvare ESXi】自宅にAnsible実行環境を作りたい～第3章：AnsibleによるvMXの設定変更 & syslogとの連携～

####はじめに
　前回、AnsibleでvMXのshowコマンドが取得出来たので、今回はAnsibleでvMXの設定変更を行います。
また、新たにsyslogサーバを構築して、Ansibleが実行されたことをvMXがsyslogサーバに通知させる
仕組みを追加します。手順としては以下の通りです。
　1. Ansibleの設定変更/モジュール追加
　2. syslogサーバの設定
　3. vMXへの設定追加
　4. 設定変更用のplaybook(set-descr.yml)作成
　5. syslogサーバに送信するログの設定
なお、ubuntuのバージョンは18.04.3です。

####1. Ansibleの設定変更/モジュール追加
　vMXの設定変更を行うためにはjunos_configモジュールを使用するのですが、
junosモジュールのコネクションタイプをnetconf(前回はnetwork_cli)にする必要があるので、
インベントリファイルを以下のように変更します。
※第2章のshowコマンド取得用のplaybook(get-int.yml)もnetconfで動作します

___インベントリ(hosts)___

```
[all:vars]
ansible_python_interpreter=/usr/bin/python3    # python3を使用

[junos]
junos_router_1 ansible_ssh_host=192.168.0.202

[junos:vars]
ansible_connection=netconf    # ここを変更(前回はnetwork_cli)
ansible_network_os=junos
ansible_user=ansible    # vMXにログインするユーザ
ansible_ssh_pass=password
```

netconfで接続するには、python-ncclientが必要なのでインストールします。
これがないと、Ansible実行時に「Failed to import the required Python library (ncclient)」
というエラーメッセージが出てきます。 

```text
sudo apt-get update
sudo apt-get install python-ncclient
```

####2. syslogサーバの設定
新たにsyslogサーバ(ubuntu)を構築して、以下のアドレスを設定します。
　IP：192.168.0.203/24
　GW：192.168.0.1（無線LANのアドレス）
　DNS：1.1.1.1
![内部構成2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554812/2049a8b6-e58b-32ab-20ce-cebb21f27b13.png)

他の機器との疎通性が確認出来たら、syslogの設定を入れていきます。
設定では、以下のサイトを参考にさせていただきました。
[Rsyslog : リモートホストにログを転送する](https://www.server-world.info/query?os=Ubuntu_16.04&p=rsyslog&f=2)
[rsyslog.confの文法](https://qiita.com/11ohina017/items/087b1b7c4411c3b3195a)

①/etc/rsyslog.conf
ローカル(192.168.0.0/24)からのsyslogを取得出来るように以下の設定を追加します。
今回はTCPとUDPの両方を許可しました

```text
# provides UDP syslog reception
module(load="imudp")
input(type="imudp" port="514")

# provides TCP syslog reception
module(load="imtcp")
input(type="imtcp" port="514")

$AllowedSender UDP, 127.0.0.1, 192.168.0.0/24
$AllowedSender TCP, 127.0.0.1, 192.168.0.0/24
```

②/etc/rsyslog.d/50-default.conf
ホストごとにログファイルを取得したいので以下の設定を追加します。
2行目の行頭では、Facility.Priorityの形式で受け取るsyslogをフィルタリング出来るのですが、
今回はvMX側でフィルタリングをしたいので、全て受信できるように*.*にしました。

```text
$template All_log,"/var/log/auth.d/%fromhost%_%$year%%$month%%$day%.auth"
*.*     -?All_log
```

####3. vMXへの設定追加
　vMXがsyslogサーバに出力するための設定は、
set system syslog host ＜syslogサーバ＞ ＜Facility＞ ＜Severity(syslogレベル)＞
となっており、FacilityやSeverityによって送信するログをフィルタリング出来ます。
まずはAnsible実行時にどのようなログが出るかを確認するために、Facility-Severityをany-anyにしました。
また、netconfも許可しておきます。

```text
set system services netconf ssh port
set system syslog host 192.168.0.203 any any
````

####4. 設定変更用のplaybook(set-descr.yml)作成
　設定変更で使用するモジュールはjunos_configです。lines配下に複数のコマンドを
入力して設定変更することも可能です。

```yml
---
- name: descr TEST
  hosts: junos
  gather_facts: no
  tasks:
    - name: set descr
      junos_config:
        lines:
          - set interfaces fxp0 description ansible_test
```

playbookを実行してみると、設定変更のタスク(set descr)の結果がchangedになっています。

```text
test@ubuntu201:~/ansible$ ansible-playbook -i hosts set-descr.yml

PLAY [descr TEST] ******************************************************************************************************

TASK [set descr] *******************************************************************************************************
changed: [junos_router_1]    # changedになっている

PLAY RECAP *************************************************************************************************************
junos_router_1             : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
```

syslogサーバでログを確認すると、SSHログイン～Ansibleによる設定変更までのログが出力されています。
(ログが多かったのでgrepで一部抜粋)
すると、Ansibleで設定変更したときに UI_NETCONF_CMD というログが出ることがわかります。

```text
test@testubuntu:/var/log/auth.d$ grep netconf /var/log/auth.d/192.168.0.202_20200924.auth
Sep 24 09:52:08 192.168.0.202  mgd[8317]: UI_NETCONF_CMD: User 'ansible' used NETCONF client to run command 'get-software-information'
Sep 24 09:52:08 192.168.0.202  mgd[8317]: UI_NETCONF_CMD: User 'ansible' used NETCONF client to run command 'lock cannot reconstruct arguments'
Sep 24 09:52:08 192.168.0.202  mgd[8317]: UI_NETCONF_CMD: User 'ansible' used NETCONF client to run command 'get-configuration format="set"'
Sep 24 09:52:09 192.168.0.202  mgd[8317]: UI_NETCONF_CMD: User 'ansible' used NETCONF client to run command 'load-configuration action="set" format="text"'
Sep 24 09:52:09 192.168.0.202  mgd[8317]: UI_NETCONF_CMD: User 'ansible' used NETCONF client to run command 'validate cannot reconstruct arguments'
Sep 24 09:52:09 192.168.0.202  mgd[8317]: UI_NETCONF_CMD: User 'ansible' used NETCONF client to run command 'get-configuration compare="rollback" format="text" rollback="0"'
Sep 24 09:52:10 192.168.0.202  mgd[8317]: UI_NETCONF_CMD: User 'ansible' used NETCONF client to run command 'commit-configuration log=test'
Sep 24 09:52:10 192.168.0.202  mgd[8317]: UI_NETCONF_CMD: User 'ansible' used NETCONF client to run command 'unlock cannot reconstruct arguments'
Sep 24 09:52:11 192.168.0.202  mgd[8317]: UI_NETCONF_CMD: User 'ansible' used NETCONF client to run command 'close-session'
```

####5. syslogサーバに送信するログの設定
　vMXから出された UI_NETCONF_CMD がどのようなものなのか調査しましょう。
vMXで「help syslog ＜syslog名＞ 」と入力するとわかります。
すると、Facility：LOG_AUTH / Severity：infoであることがわかりました。

```text
ansible> help syslog UI_NETCONF_CMD
Name:          UI_NETCONF_CMD
Message:       User '<username>' used NETCONF client to run command '<command>'
Help:          User ran command using NETCONF API
Description:   The indicated user ran the indicated command using the NETCONF
               application programming interface (API).
Type:          Event: This message reports an event, not an error
Severity:      info
Facility:      LOG_AUTH
````

Facility：LOG_AUTHがvMXで設定できなかったので、[juniper：System Log Messages Reference](https://www.juniper.net/documentation/partners/ibm/junos11.4-oemlitedocs/syslog-messages.pdf)
で調べたのですが、netconf関連の設定はinteractive-commandsに分類されるようです。
以下の図は、ReferenceのP.74に書いてある内容です。

![netconf.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554812/42072bd5-78d5-4b64-9b0e-ce4bf3636b70.png)

実際、vMX入れた設定は以下になります。
Facility：interactive-commands / Severity：info を出力するようにして、UI_NETCONF_CMD 以外の大量に
出てくるログを出力しないようにしました。

```text
delete system syslog host 192.168.0.203 any any
set system syslog host 192.168.0.203 interactive-commands info
set system syslog host 192.168.0.203 match "!(.*UI_COMMIT_PROGRESS.*|.*UI_CHILD.*|.*UI_CMDLINE_READ_LINE.*)"
```

Ansible実行後のログは以下のようにシンプルになりました。

```text
Sep 24 11:02:51 192.168.0.202  mgd[21823]: UI_AUTH_EVENT: Authenticated user 'ansible' at permission level 'j-super-user'
Sep 24 11:02:51 192.168.0.202  mgd[21823]: UI_LOGIN_EVENT: User 'ansible' login, class 'j-super-user' [21823], ssh-connection '192.168.0.201 53240 192.168.0.202 22', client-mode 'cli'
Sep 24 11:02:51 192.168.0.202  mgd[21823]: UI_LOGOUT_EVENT: User 'ansible' logout
Sep 24 11:02:51 192.168.0.202  mgd[21822]: UI_AUTH_EVENT: Authenticated user 'ansible' at permission level 'j-super-user'
Sep 24 11:02:51 192.168.0.202  mgd[21822]: UI_LOGIN_EVENT: User 'ansible' login, class 'j-super-user' [21822], ssh-connection '192.168.0.201 53240 192.168.0.202 22', client-mode 'netconf'
Sep 24 11:02:51 192.168.0.202  mgd[21822]: UI_NETCONF_CMD: User 'ansible' used NETCONF client to run command 'get-software-information'
Sep 24 11:02:52 192.168.0.202  mgd[21822]: UI_NETCONF_CMD: User 'ansible' used NETCONF client to run command 'lock cannot reconstruct arguments'
Sep 24 11:02:52 192.168.0.202  mgd[21822]: UI_NETCONF_CMD: User 'ansible' used NETCONF client to run command 'get-configuration format="set"'
Sep 24 11:02:52 192.168.0.202  mgd[21822]: UI_NETCONF_CMD: User 'ansible' used NETCONF client to run command 'load-configuration action="set" format="text"'
Sep 24 11:02:52 192.168.0.202  mgd[21822]: UI_NETCONF_CMD: User 'ansible' used NETCONF client to run command 'validate cannot reconstruct arguments'
Sep 24 11:02:53 192.168.0.202  mgd[21822]: UI_NETCONF_CMD: User 'ansible' used NETCONF client to run command 'get-configuration compare="rollback" format="text" rollback="0"'
Sep 24 11:02:53 192.168.0.202  mgd[21822]: UI_NETCONF_CMD: User 'ansible' used NETCONF client to run command 'commit-configuration log=test'
Sep 24 11:02:53 192.168.0.202  mgd[21822]: UI_COMMIT: User 'ansible' requested 'commit' operation (comment: test)
Sep 24 11:02:54 192.168.0.202  mgd[21822]: UI_COMMIT_COMPLETED: commit complete
Sep 24 11:02:54 192.168.0.202  mgd[21822]: UI_NETCONF_CMD: User 'ansible' used NETCONF client to run command 'unlock cannot reconstruct arguments'
Sep 24 11:02:54 192.168.0.202  mgd[21822]: UI_NETCONF_CMD: User 'ansible' used NETCONF client to run command 'close-session'
Sep 24 11:02:54 192.168.0.202  mgd[21822]: UI_LOGOUT_EVENT: User 'ansible' logout
Sep 24 11:03:45 192.168.0.202  mgd[7133]: UI_DBASE_LOGOUT_EVENT: User 'ansible' exiting configuration mode
```

####関連記事
[【VMware ESXi】自宅にAnsible実行環境を作りたい～第1章：ubuntuサーバのDNS解決まで～](https://qiita.com/masa2223/items/8f5c31ebd930dacc3c13)
[【VMware ESXi】自宅にAnsible実行環境を作りたい～第2章：AnsibleとvMXの導入～](https://qiita.com/masa2223/items/582f7f956a8d3b018e24)