Opensourcetechブログ

OpensourcetechによるNGINX/Kubernetes/Zabbix/Neo4j/Linuxなどオープンソース技術に関するブログです。

Ansible で Juniper Junos を制御してみる!!

こんにちは、鯨井貴博@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)は、以下。

XYZ:ansible_test xjapan$ cat /etc/ansible/ansible.cfg
[defaults]
host_key_checking = False ・・・・  SSH known hostsに追加するかの質問を無視する
retry_files_enabled = False  ・・・・「.retry拡張子」をつけた通信が確立できなかったホストの一覧ファイルを作る機能を無効化

 

 ※1は、以下への対応

XYZ:ansible_test xjapan$ ssh root@192.168.10.40
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ファイルに関する注意点

 ・「-(ハイフン)」が、実行する内容の区切りになる。

 ・先頭のスペースでインデントされていることが大事。

  スクリーンショットも念の為、つけておきます。

f:id:opensourcetech:20180830163712p:plain

 

参考情報

Atom Editor でインデントを可視化する方法 - Opensourcetechブログ

 

 

 なお、Ansibleに対応したエディターや開発環境があれば、

 以下のようにキーワードを補完してくれるので作業の確実性が高められます。

f:id:opensourcetech:20180823191922p:plain

 

ここで作成したファイルは、以下へアップしてありますので、

よかったら活用してください。

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」というファイルに出力されています。

XYZ:ansible_test xjapan$ ls
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

f:id:opensourcetech:20180823192943p:plain

 

GitHubにあるモジュールなどのソースコードは、Pythonで書かれているので、Pythonも学べる。

一粒で2度美味しいってやつですね。

 

モジュールがたくさん用意されている(約1,600くらいらしい)あるので、色々なことができるはず

数が多いので大変かもしれませんが、一度目を通しておくと良さそうです。

 

 

 Ansible プロフェッショナルの方から教えてもらったこと(追記)

 --checkオプションは、junos_configモジュール(Junosのコンフィグレーションモードで実行するコマンド)では使える!

f:id:opensourcetech:20180827225256p:plain

 ※Junos のcommit check ではないので注意。

f:id:opensourcetech:20180827225413p:plain

 

--check に --diff をつけると、show | compare になる。

f:id:opensourcetech:20180827225504p:plain

f:id:opensourcetech:20180827225555p:plain

 

 

www.slideshare.net

github.com

www.facebook.com

twitter.com

www.instagram.com

 

 

にほんブログ村 IT技術ブログ Linuxへ
Linux

にほんブログ村 IT技術ブログ オープンソースへ
オープンソース

 

 

Opensourcetech by Takahiro Kujirai