はじめてのあんしぶる

公開:2020/09/22
更新:2020/09/24
16 min読了の目安(約9800字TECH技術記事

Iac でよくでてくるAnsible君に挑戦してみた話です。
ネットワーク自動化や構成管理、冪等性などのキーワードがあるとだいたい出てくるツールだというふんわりとして理解しかなくて、ほとんど触ったことなくとっつきにくいと思ってました。
(実際かなり苦労しました笑)

今回、今月発売のSoftware Designにあったひよこ大佐の記事に丁度自分が業務でやりたかったvyosのバックアップコンフィグをとったり設定差分をとったりという記事があったのでやってみました。

Software Design 10月号

※間違っている箇所もあるかもしれませんがまだまだよわよわエンジニア、特にAnsibleについては初心者なのでまさかりではなく優しくコメントで指摘してくださると助かります。

構成

ESXi : ESXi-6.5.0-20180502001-standard (VMware, Inc.)
VyOS : rolling release 1.3
Ansible host : CentOS7

検証構成

前準備

※CentOS7 と VyOS のインストール方法については省略します

--------------------------------
$sudo yum install epel-release
$yum install python3
$yum install ansible
$pip3 install paramiko
$pip3 install network_cli

個人的にPython2系は使わない方針でいるので、Python3系での導入しています。結果的にansibleとpythonのversionが以下のようになってたら大丈夫です。
注目すべきはparamikoのpip installですね。network_cliは必要なのか分からないのですが、今回サーバ接続のopensshではなく、ネットワーク機器への接続となるのでparamiko必須です。pip3 install paramikoでいれてインストールしましょう。私は最初入れてなかったのでエラーがでました。この点については後述します。

[root@ansible opt]# ansible --version
ansible 2.9.13
 config file = /etc/ansible/ansible.cfg
 configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
 ansible python module location = /usr/local/lib/python3.6/site-packages/ansible
 executable location = /usr/local/bin/ansible
 python version = 3.6.8 (default, Apr  2 2020, 13:34:55) [GCC 4.8.5 20150623 (Red Hat 4.8.5-39)]  

ディレクトリ構造

[root@ansible project1]# tree
.
├── group_vars
│   └── vyos.yml
├── inventory.ini
└── vyos_configure.yml

ひよこ大佐の記事ではhostという形でinventoryファイルを作っているようでしたが、私がディレクトリ構造がどうなっていればいいのかよくわかっていなかったのでAnsibleのことならだいたいこの方の記事をみればいいと教えてもらったのでよこち先生の下の記事をみて作ってます

[Ansible] VyOS モジュール利用のことはじめ

なのでyamlファイルの構成なども完全にSoftware Designのひよこ大佐の記事のものと同一かというと異なってたりしますのでご了承ください。

ファイルの中身

〇group_vars/vyos.yml

[root@ansible project1]# cat group_vars/vyos.yml
---
ansible_network_os: vyos         #  ネットワークのOS Ciscoならiosとかかな
ansible_connection: network_cli  #  ネットワークの接続方式  
ansible_user: vyos               #  ログイン時のユーザー名
ansible_password: vyos           #  ログイン時のパスワード

※今回あくまでローカルの検証なので鍵認証を使っていません。このあとに鍵認証での接続のやり方をやってみようかなと思ってます。

〇vyos_configure.yml

こちらの内容に関してはSoftware Designを買って中身を見てみてね!

〇inventory.ini

[vyos]
vyos1 ansible_host=172.18.1.1

First Try : Python interpreterの認識失敗

こんな感じのメッセージが出てFailedが出ました。

[root@ansible project1]# ansibel-playbook -i inventory.ini vyos_configure.yml
PLAY [vyos1] ************************************************************************************************

TASK [Gathering Facts] **************************************************************************************
[WARNING]: Ignoring timeout(10) for vyos_facts
fatal: [vyos1]: FAILED! => {"ansible_facts": {}, "changed": false, "failed_modules": {"vyos_facts": {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "failed": true, "invocation": {"module_args": {"gather_network_resources": null, "gather_subset": ["all"], "host": null, "password": null, "port": null, "provider": null, "ssh_keyfile": null, "timeout": null, "username": null}}, "msg": "paramiko: The authenticity of host '172.18.1.1' can't be established.\nThe ssh-ed25519 key fingerprint is b'a5582539c9e2be85792b29577da170df'."}}, "msg": "The following modules failed to execute: vyos_facts\n"}

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

なんでかわからないですが、python interpreterの部分が"/usr/bin/python"になっています。version確認してpython3系であることを確認したのに...
対処策としてansibleで使用するpython interpreterのロケーションをansible.cfgの中に設定しました。

[defaults]
interpreter_python=/usr/bin/python3

Second Try : SSH接続失敗

前述していたparamikoのインストールし忘れですね。

[root@ansible project1]#ansible-playbook -i inventory.ini vyos_configure.yml 

PLAY [vyos1] ************************************************************************************************

TASK [show configure to vyos1] ******************************************************************************
fatal: [vyos1]: FAILED! => {"changed": false, "msg": "paramiko is not installed: No module named 'paramiko'"}

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

明示的にparamikoが入ってねぇよと言われるので対応は楽でした。

Third Try : SSH接続失敗

3度目の正直とやったところ失敗しました。

[root@ansible project1]#ansible-playbook -i inventory.ini vyos_configure.yml

PLAY [vyos1] ************************************************************************************************

TASK [show configure to vyos1] ******************************************************************************
fatal: [vyos1]: FAILED! => {"changed": false, "msg": "Failed to authenticate: Authentication failed."}

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

これに関しては別問題でした。最初認証鍵の問題かと思って検索したら"host_key_checking=no"をansible.cfgに入れろとあったので鍵認証しようとしてるのかと思い設定を入れました。

[defaults]
host_key_checking=no
interpreter_python=/usr/bin/python3

ただ、これでもエラーは止まりませんでした。

なぜかわからないですがCentOS7とVyOSとがSSH接続できていませんでした。ansible入れる前は普通には入れてたんですけどね。。。

[root@ansible ~]# tail /var/log/secure
Sep 21 04:01:41 ansible sshd[27587]: Failed password for root from 172.18.1.1 port 56704 ssh2
Sep 21 04:02:42 ansible unix_chkpwd[27642]: password check failed for user (root)
Sep 21 04:02:42 ansible sshd[27587]: pam_succeed_if(sshd:auth): requirement "uid >= 1000" not met by user "root"
Sep 21 04:02:44 ansible sshd[27587]: Failed password for root from 172.18.1.1 port 56704 ssh2
Sep 21 04:02:47 ansible unix_chkpwd[27647]: password check failed for user (root)
Sep 21 04:02:47 ansible sshd[27587]: pam_succeed_if(sshd:auth): requirement "uid >= 1000" not met by user "root"
Sep 21 04:02:49 ansible sshd[27587]: Failed password for root from 172.18.1.1 port 56704 ssh2
Sep 21 04:02:49 ansible sudo: pam_unix(sudo:session): session closed for user root
Sep 21 04:02:49 ansible sshd[27587]: Connection closed by 172.18.1.1 port 56704 [preauth]
Sep 21 04:02:49 ansible sshd[27587]: PAM 2 more authentication failures; logname= uid=0 euid=0 tty=ssh ruser= rhost=ansible  user=root

見てみたんですがSSHで接続するときにvyos/vyosの設定しているのにrootユーザで入ろうとしています。どうやってもこれを直すことができずにいらいらしてCentOS7をぶっ壊して再インストールしなおしたら治りました。
正直これに関してはほんとうに意味わからなかったです。

Fouth Try : 失敗

[root@ansible project1]# ansible-playbook -i inventory.ini vyos_configure.yml

PLAY [vyos1] *************************************************************************************************

TASK [Backup Config] ****************************************************************************************
/bin/sh: data: コマンドが見つかりません
fatal: [vyos1]: FAILED! => {"msg": "An unhandled exception occurred while running the lookup plugin 'pipe'. Error was a <class 'ansible.errors.AnsibleError'>, original message: lookup_plugin.pipe(data +%Y%m%d) returned 127"}

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

詳細は記事の都合上かけないのですが、filenameを指定する際のlookup部分になにかエラーがあるみたいです。これについては今調べてみてますね。
現状とりあえずバックアップコンフィグとるだけでいいやと思って設定色々と書き直しました。
とりあえず、filenameの部分は"vyos_before.cfg"という固定値でやってみることにしました。
※こちらについては解決しました。単純にtypoでしたOTL

Fifth Try : 成功

ほぼ一日かけて成功しました。ここまでくるとかなりげんなりしてました笑
これでできなかった同僚にヘルプ求めるところでした。

[root@ansible project1]# ansible-playbook -i inventory.ini vyos_configure.yml

PLAY [vyos1] *************************************************************************************************

TASK [Backup Config] ****************************************************************************************
changed: [vyos1]

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

やっとのことで成功したのでディレクトリを見てみましょう

[root@ansible project1]# tree
.
├── backup
│   └── vyos_before.cfg
├── group_vars
│   └── vyos.yml
├── inventory.ini
└── vyos_configure.yml

backupディレクトリ配下にファイルができてますね!

[root@ansible project1]# cat backup/vyos_before.cfg
set interfaces ethernet eth0 address '192.168.0.21/24'
set interfaces ethernet eth0 hw-id '00:0c:29:c6:84:29'
set interfaces ethernet eth1 address '172.18.1.1/24'
set interfaces ethernet eth1 hw-id '00:0c:29:c6:84:33'
set interfaces ethernet eth2 address '172.18.2.1/24'
set interfaces ethernet eth2 hw-id '00:0c:29:c6:84:3d'
set interfaces loopback lo
set protocols static route 0.0.0.0/0 next-hop 172.18.1.10
set service ssh port '22'
set system config-management commit-revisions '100'
set system console device ttyS0 speed '115200'
set system host-name 'vyos1'
set system ntp server 0.pool.ntp.org
set system ntp server 1.pool.ntp.org
set system ntp server 2.pool.ntp.org
set system syslog global facility all level 'info'
set system syslog global facility protocols level 'debug'

よしよし。バックアップをとることができましたね!

このあとは再度、yamlファイルの内容をSoftware Designの記事にやり直して、設定をいれてdiffを見たりしました。

感想

なるほどわからん笑
まだまだ自由自在にansibleの操作が!ってレベルではなくあくまで入門だと思います。ただ、やっていくイメージはついたかなといった感じです。
こんだけ試行錯誤したので、その分操作感覚はつかめた気がします。本来つまずく必要がないところでつまずいていた気もしますが笑