こんにちは、鯨井貴博@opensourcetechです。
昨晩行ってきた 勉強会で Ansible については スーパーざっくりですが理解することができたので、早速 Juniper Junos を絡めて使ってみようと思います。
※行ってきた勉強会については、こちら。
8a1-APC勉強会-:【初心者向け】Ansibleではじめるサーバー・ネットワークの自動化』 に行ってきた! そして、Ansibleのインストール!! - Opensourcetechブログ
Ansibleを構成するファイル
Ansible自体の設定ファイル
/etc/ansible/ansible.cfgなどです。
などと書いたのは、複数の箇所に設定ファイルを配置でき、
その参照順が決められてるからです。
参照順
①変数ANSIBLE_CONFIGで定義したファイル
②カレントディレクトリ(ansibleコマンドを実行するディレクトリ)のansible.cfg
③ホームディレクトリ(ansibleコマンドを実行ユーザー)の.ansible.cfg
④/etc/ansible/ansible.cfg
詳細は、以下のドキュメントに書いてあります。(使用可能な変数についても書いてある)
Ansible Configuration Settings — Ansible Documentation
設定ファイルに関する注意点
/etc/ansible/ansible.cfgについては、Pythonのpipを使ってAnsibleをインストールした場合、自動生成されないので手動作成する必要あり。
※yumなどのパッケージマネージャで入れた場合は、作られるらしい(未確認)
今回使った設定ファイル(/etc/ansible/ansible.cfg)は、以下。
[defaults]
host_key_checking = False ・・・・ SSH known hostsに追加するかの質問を無視する
retry_files_enabled = False ・・・・「.retry拡張子」をつけた通信が確立できなかったホストの一覧ファイルを作る機能を無効化
※1は、以下への対応
The authenticity of host '192.168.10.40 (192.168.10.40)' can't be established.
ECDSA key fingerprint is SHA256:WLXFmvD9V4x2XZMzCUi8/Oo70hM0Ancmmu6QO/PruPw.
Are you sure you want to continue connecting (yes/no)?
※2は、以下への対応
TASK [set configuration test] **************************************************
fatal: [192.168.10.40]: FAILED! => {"msg": "ncclient is not installed"}
to retry, use: --limit @/Users/xjapan/Desktop/ansible_test/junos_test.retry
PLAY RECAP *********************************************************************
192.168.10.40 : ok=0 changed=0 unreachable=0 failed=1
XYZ:ansible_test xjapan$ ls
invetory junos_test.retry junos_test.yaml
XYZ:ansible_test xjapan$ cat junos_test.retry
192.168.10.40
Ansibleで管理対象とするホスト情報を記載するファイル
こちらは、Ansibleコマンドを実行するカレントディレクトリなど好きなところで大丈夫です。
今回使ったファイル(ファイル名:inventory)は、以下。
[junos] ・・・・ホストをグループ化する名前
192.168.10.40 ・・・・ホスト名
[junos:vars] ・・・・ホストグループに適用する変数設定
ansible_network_os=junos ・・・・junosの制御に必要
ansible_user=lab ・・・・junosへのsshで使用するユーザー名
ansible_ssh_pass=lab123 ・・・・junosへのsshで使用するパスワード
管理対象ホストで実行したい内容を記載するファイル(playbook)
こちらは、YAML形式で各ファイルとなります。
拡張子として、.ymlや.yaml 好きな方を使えばいい模様。
今回使ったファイル(ファイル名:junos_test2.yaml)は、以下。
なお、junos側ではnetconfによる接続が出来るように、
「set system service netconf ssh」をcommitしておきます。
---
- hosts: junos ・・・・ホストグループ指定
gather_facts: no ・・・・プラットフォームに関する情報を取得する動作を無効化
connection: netconf ・・・・junosへの接続にnetconfを使用
tasks:
- name: check status ・・・・ステータスの確認として、アップタイム(show system uptime)を実行
junos_command: ・・・・junosのoperationalモードのコマンドを指定するモジュール
commands:
- show system uptime
register: result ・・・・実施結果を変数resultに格納
- name: save status to file ・・・・格納した内容を指定ファイルへ出力
copy:
content: "{{ result.stdout[0] }}"
dest: check_uptime_testSRX.txt
YAMLファイルに関する注意点
・「-(ハイフン)」が、実行する内容の区切りになる。
・先頭のスペースでインデントされていることが大事。
スクリーンショットも念の為、つけておきます。
参考情報
Atom Editor でインデントを可視化する方法 - Opensourcetechブログ
なお、Ansibleに対応したエディターや開発環境があれば、
以下のようにキーワードを補完してくれるので作業の確実性が高められます。
ここで作成したファイルは、以下へアップしてありますので、
よかったら活用してください。
GitHub - kujiraitakahiro/ansible: for ansible(playbook, etc)
Ansibleコマンドの実行
実行した結果は、以下の通り。
「-i」はホスト情報を記載したファイルを指定するオプション。
XYZ:ansible_test xjapan$ ansible-playbook -i inventory junos_test2.yaml
PLAY [junos] *******************************************************************
TASK [check status] ************************************************************
ok: [192.168.10.40]
TASK [save status to file] *****************************************************
changed: [192.168.10.40]
PLAY RECAP *********************************************************************
192.168.10.40 : ok=2 changed=1 unreachable=0 failed=0
実施した結果は、「check_uptime_testSRX.txt」というファイルに出力されています。
inventory
check_uptime_testSRX.txt junos_test2.yaml
XYZ:ansible_test xjapan$ cat check_uptime_testSRX.txt
Current time: 2018-08-23 19:20:16 UTC
Time Source: LOCAL CLOCK
System booted: 2018-08-23 15:45:07 UTC (03:35:09 ago)
Protocols started: 2018-08-23 15:45:07 UTC (03:35:09 ago)
Last configured: 2018-08-23 17:03:12 UTC (02:17:04 ago) by root
7:20PM up 3:35, 1 user, load averages: 0.01, 0.04, 0.05
まとめ・その他、気が付いた点など
junosに対しては、--checkオプション(ドライラン)をつけて実施するとNG。
以下のように、Ansibleがブツブツ言ってきますw
XYZ:ansible_test xjapan$ ansible-playbook -i invetory junos_test2.yaml --check
PLAY [junos] *******************************************************************
TASK [check status] ************************************************************
fatal: [192.168.10.40]: FAILED! => {"changed": false, "msg": "invalid rpc for running in check_mode"}
PLAY RECAP *********************************************************************
192.168.10.40 : ok=0 changed=0 unreachable=0 failed=1
詳細については、以下のGitHub上のソースコードを見ればわかるかも。
ansible/lib/ansible/modules/network/junos at devel · ansible/ansible · GitHub
ansible/junos_command.py at devel · ansible/ansible · GitHub
GitHubにあるモジュールなどのソースコードは、Pythonで書かれているので、Pythonも学べる。
一粒で2度美味しいってやつですね。
モジュールがたくさん用意されている(約1,600くらいらしい)あるので、色々なことができるはず。
数が多いので大変かもしれませんが、一度目を通しておくと良さそうです。
Ansible プロフェッショナルの方から教えてもらったこと(追記)
--checkオプションは、junos_configモジュール(Junosのコンフィグレーションモードで実行するコマンド)では使える!
※Junos のcommit check ではないので注意。
--check に --diff をつけると、show | compare になる。