たそ@ITインフラ初心者

taso@初心者エンジニア

新卒2年目 エンジニアが適当に語るブログてす

Ansibleでルータ設定 #2 設定出力編 part1

お疲れ様です。たそ(@taso_int)です。
研修期間もそろそろ折り返し地点になりました。
基本情報技術者試験の勉強していますが結構苦戦してます。

今回も続きをやっていきたいと思います。
前回の内容について知りたい方はこちらへ

taso-int.hatenablog.com

1.構成図

f:id:taso_int:20210509162817j:plain

以前の構成から192.168.1.2→192.168.1.254に変更します。
しかし、AnsiblleホストとSSH接続しており、playbookで変更すると
止まってしまうので手動で設定変更をします。(まだ変更してない)
そこでstartup-configとrunnig-configの設定ファイルを保存して
変更部分を比較するplaybookを書きたいと思います。

2.動作設計

今回のplaybookの動作手順を考えたいと思います。
1.実際にコマンドをそれぞれ実行する。
2.実行結果をファイルで保存をする。 ←(ここまではできた)
3.ファイルの調整を行う。(startup-configとrunnig-configに行の修正)
4.ファイルを比較する。
5.比較結果をplaybook実行中に表示させる。
6.write memoryをするかを問い合わせる。

3.手順(完成部分?)

3-1.実際にコマンドをそれぞれ実行する。
コマンドを変数にしたいが別々のファイルで取得したいため
個別でコマンドを記述します。
ios_commandモジュールを利用してshow startup-config等を入力させます。
出力結果をregisterオプションを使ってresultに格納します。

  tasks:
    - name: show startup
      ios_command:
        commands: show startup-config
      register: result

3-2.実行結果をファイルで保存をする
出力をファイルに書き込む方法はcopyモジュール等が存在します。
今回はtemplateモジュールを利用してJinja2 テンプレート
を参照して出力することにしました。

横地さんのブログ参考になりました。

tekunabe.hatenablog.jp

実際のyaml

    - name: file make start
      template:
        src: ios_log.j2  #テンプレート参照名
        dest: "startconf_{{ inventory_hostname }}" #ファイル名

jinja2のテンプレート(ios_log.j2)

{% for out in result.stdout %} #出力結果の表示
{{ inventory_hostname }} #最初の1行目にルータの名前
{{ out }}

{% endfor %}

正直jinja2の書式がイマイチわかってないです。(Pythonなのにわからん)
ちなみにcopy モジュールをつかっても出力できます。

    - name: file make start
      copy:
        continent: "{{ result.stdout[0] }}" 
        dest: "startconf_{{ inventory_hostname }}"

実際のyaml

---
- hosts: ios
  gather_facts: false
  
  tasks:
    - name: show startup
      ios_command:
        commands: show startup-config
      register: result

    - name: file make start
      template:
        src: ios_log.j2
        dest: "startconf_{{ inventory_hostname }}"

    - name: show running
      ios_command:
        commands: show running-config
      register: result

    - name: file make start
      template:
        src: ios_log.j2
        dest: "runconf_{{ inventory_hostname }}"

playbookを実行してみる。
実行前
f:id:taso_int:20210516213329p:plain

実行結果
f:id:taso_int:20210516213706p:plain

しっかりと作成されています。

ファイルも見てみましょう。
f:id:taso_int:20210516220300p:plain

しっかり出来てますね。

4.つまずいている点

showコマンドの出力がバラバラで同じ位置にしたい。
ブログ書きながら解決しました…
show startup-config | begin version って記載すれば行ける。
オプション | begin begin以後に記載した文字列から
始まる行以下の行をすべて返すとのこと。

diffのやり方
diffぽいモジュールがないのでshellコマンドを使う可能性が高め。

stdoutとstdout_liensについて
5でdiff結果を表示したい。stdoutで表示すると改行コードが出て
かなり見づらい状況。
stdout_liensで見やすくなるらしいが試したところエラーを
吐き出してしまい原因がわからない。

次週ここを作成していきたいと思います。
ここまで読んでいただきありがとうございました。