はじめに
2020/05/16 に、YouTube Live でつまずいきながら進める Ansible 【Part1】という配信をしました。 実際に作業しながらエラーと戦ってすすめるものです。
とりあえず目指したのは以下のアンケートで一番多かった、show コマンドの結果をファイルで保存する Playbook です。
近いうちにAnsibleのネットワーク系の「Playbook 何か書く」配信をやってみたいのですが、どんなPlaybookがよいでしょうか。(選択肢にないものはリプくださいませ)
— よこち(yokochi) (@akira6592) 2020年5月14日
Part 1 では、Ansible のインストールからはじめました。 環境は、CentOS 8.0 を利用しました。
つまずいたエラーと原因、対処をふりかえります。
動画
■ 検証環境 VM への SSH 接続 (Ansible 以前の以前の問題・・)
VS Code Remote - SSH で接続で fingerprint のエラーになる
原因
VM ごとを消して再作成したら fingerprint が変更されて、known_hosts
に記録されていたものと不一致になっていたため。
対処
known_hosts
を削除した(乱暴)。
■ venv の作成 と ansible のインストール
python -m venv ansible
で python
コマンドがないというエラーになる
原因
RHEL8/CentOS 8 でシステムに組み込まれてるのは /usr/libexec/platform-python
であって、python
コマンドは利用できないため
対策
dnf install python3
で別途インストール。(一応、システムに組み込みのものとは別にする)
■ Playbook 実行
paramiko is not installed: No module named 'paramiko'
というエラーになる
原因
ネットワーク機器に SSH 接続するときに必要なライブラリ paramiko
がインストールされていないなめ
詳細: [Ansible] エラー「paramiko is not installed: No module named 'paramiko'」の原因と対策 - てくなべ (tekunabe)
対処
pip install paramiko
でインストール
fingerprint エラーになる
原因
初回接続の相手であり、known_hosts
に載っていないため
対処
ansible.cfg
に以下のように設定する。(検証環境のため、簡易的な対処)
[defaults] host_key_checking=False
設定が意図通り変更されたかどうかは ansible-config dump --only-changed
で確認する。
詳細: [Ansible] デフォルトから変更されている設定項目を確認する方法(ansible-config dump --only-changed) - てくなべ (tekunabe)
ios_command モジュール実行時に unsupported parameters
というエラーになる
- name: test ios_command: command: - show ip route
というタスクに対して以下のエラー。
"Unsupported parameters for (ios_command) module: command Supported parameters include: auth_pass, authorize, commands, host, interval, match, password, port, provider, retries, ssh_keyfile, timeout, username, wait_for"
原因
オプション名は command
ではなく、commands
が正しい
対処
以下に修正
- name: test ios_command: commands: - show ip route
Part 2にむけて
いきなり VM への接続で予想外につまずいてあせりました・・。
show ip route
コマンドの実行結果を、ファイルに保存しましたが、以下のように、改行もされず、余計なものが入っている状態でした。これをもう少し欲しい状態にします。
{"changed": false, "stdout": ["Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP\n D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area \n N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2\n E1 - OSPF external type 1, E2 - OSPF external type 2\n i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2\n ia - IS-IS inter area, * - candidate default, U - per-user static route\n o - ODR, P - periodic downloaded static route, H - NHRP, l - LISP\n a - application route\n + - replicated route, % - next hop override, p - overrides from PfR\n\nGateway of last resort is 192.168.1.1 to network 0.0.0.0\n\nS* 0.0.0.0/0 [1/0] via 192.168.1.1\n 10.0.0.0/8 is variably subnetted, 4 subnets, 2 masks\nC 10.0.0.0/24 is directly connected, GigabitEthernet0/3\nL 10.0.0.1/32 is directly connected, GigabitEthernet0/3\nC 10.255.255.1/32 is directly connected, Loopback0\nO 10.255.255.2/32 [110/2] via 10.0.0.2, 05:24:25, GigabitEthernet0/3\n 172.16.0.0/16 is variably subnetted, 2 subnets, 2 masks\nC 172.16.1.0/24 is directly connected, GigabitEthernet0/1\nL 172.16.1.253/32 is directly connected, GigabitEthernet0/1\n 192.168.1.0/24 is variably subnetted, 2 subnets, 2 masks\nC 192.168.1.0/24 is directly connected, GigabitEthernet0/0\nL 192.168.1.11/32 is directly connected, GigabitEthernet0/0"], "stdout_lines": [["Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP", " D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area ", " N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2", " E1 - OSPF external type 1, E2 - OSPF external type 2", " i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2", " ia - IS-IS inter area, * - candidate default, U - per-user static route", " o - ODR, P - periodic downloaded static route, H - NHRP, l - LISP", " a - application route", " + - replicated route, % - next hop override, p - overrides from PfR", "", "Gateway of last resort is 192.168.1.1 to network 0.0.0.0", "", "S* 0.0.0.0/0 [1/0] via 192.168.1.1", " 10.0.0.0/8 is variably subnetted, 4 subnets, 2 masks", "C 10.0.0.0/24 is directly connected, GigabitEthernet0/3", "L 10.0.0.1/32 is directly connected, GigabitEthernet0/3", "C 10.255.255.1/32 is directly connected, Loopback0", "O 10.255.255.2/32 [110/2] via 10.0.0.2, 05:24:25, GigabitEthernet0/3", " 172.16.0.0/16 is variably subnetted, 2 subnets, 2 masks", "C 172.16.1.0/24 is directly connected, GigabitEthernet0/1", "L 172.16.1.253/32 is directly connected, GigabitEthernet0/1", " 192.168.1.0/24 is variably subnetted, 2 subnets, 2 masks", "C 192.168.1.0/24 is directly connected, GigabitEthernet0/0", "L 192.168.1.11/32 is directly connected, GigabitEthernet0/0"]], "failed": false}