てくなべ (tekunabe)

ansible / network / automation

[Ansible] vyos_config モジュールで VyOS の設定変更をする

はじめに

前回の記事で、Ansible で VyOS を扱うための準備や、簡単な show コマンドを実行する方法をご紹介しました。

tekunabe.hatenablog.jp

この記事では、vyos_config モジュールを利用した設定変更の Playbook をご紹介します。


【目次】


■ vyos_config モジュールの基本

vyos_config モジュールは、setdelete など VyOS 上で実行するコマンドを指定して実行するモジュールです。

単純なコマンド指定の他にも、Jinja2 テンプレートを活用したコマンドの投入もできます。

また、コンフィグファイルのバックアップもできます。

各オプションや例は公式ドキュメントの説明ページに記載されています。

docs.ansible.com

ほかの vyos モジュールとの比較、使い分け

前回の記事が、主に show 系のコマンドの実行を担うのに対して、こちらのvyos_config モジュールは、コンフィギューレーションモード移行後の設定変更コマンドの実行を担います。

また、Ansible の vyos モジュール郡の中には、他にもvyos_interfaces モジュールや、vyos_l3_interfaces モジュールなどの、特定の機能専用のモジュールもあります。これらの機能専用のモジュールは、コマンドを直接指定するタイプではなく、モジュールのオプションを駆使して設定変更するモジュールです。

機能専用のモジュールがない場合は、今回紹介する vyos_config モジュールを利用する形になります。


■ 構成・想定

構成や、インベントリファイル、変数定義ファイルは、前回の記事と同じものとします。


■ 設定変更例1: 単純なベタ書きコマンド指定

まずは、単純に Playbook 内にコマンドをベタ書きする Playbook です。

Playbook 作成

例として、参照 NTP サーバーの設定をします。

実行前は、以下の通りの3大台が設定済みの状態です。

vagrant@vyos:~$ show configuration commands | match ntp
set system ntp server '0.pool.ntp.org'
set system ntp server '1.pool.ntp.org'
set system ntp server '2.pool.ntp.org'

Playbook は以下のとおりです。

  • confg01_basic.yml
---
- hosts: vyos
  gather_facts: false

  tasks:
    - name: configuration
      vyos_config:
        lines:
          - set system ntp server 10.0.1.123
          - set system ntp server 10.0.2.123

lines オプションに、実行したい設定変更もコマンドをリストで指定します。

これで、commit までされます。

また、vyos_config モジュールには他にもsave オプションがあります。デフォルト no で、設定変更が発生したときのみ save します。常に save したい場合は、 yes を指定します。

Playbook 実行

Playbook を実行します。

$ ansible-playbook -i inventory.ini confg01_basic.yml 

PLAY [vyos] ********************************************************************************

TASK [configuration] ***********************************************************************
changed: [vyos1]

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

実際に設定変更が行われたので、changed となりました。

なお、もう一度 Playbook を実行すると changed にはなりません。Playbook で指定したコンフィグがすでに入っていて、Ansible が設定不要と判断するためです。

確認

VyOS 側でコンフィグを確認します。

vagrant@vyos:~$ show configuration commands | match ntp
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 ntp server '10.0.1.123'
set system ntp server '10.0.2.123'

10.0.1.12310.0.2.123 の分が追加されました。

応用: 安全にコンフィグ差分を確認する

ansible-playbook コマンドの --cechk オプションと、--diff オプションを併用すると、「このPlaybook実行によってどなコンフィグ差分が発生するか」を設定変更を適用せずに確認できます。

$ ansible-playbook -i inventory.ini confg01_basic.yml --check --diff

PLAY [vyos] *******************************************************************************************************

TASK [configuration] **********************************************************************************************
[edit system ntp]
+server 10.0.1.123 {
+}
+server 10.0.2.123 {
+}
[edit]
changed: [vyos1]

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


■ 設定変更例2: Jinja2 テンプレートを利用したコマンド投入

次に、Playbook 内にコマンドをベタ書きせず、Jinja2 テンプレートを利用して、効率的にコマンドを投入する Playbook です。

Playbook 作成

先程に続いて、参照 NTP サーバーの設定(追加)をします。

続きなので、ここでは以下の通り5台が設定済みの状態です。

vagrant@vyos:~$ show configuration commands | match ntp
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 ntp server '10.0.1.123'
set system ntp server '10.0.2.123'

Playbook は以下のとおりです。

  • confg02_tepmplate.yml
---
- hosts: vyos
  gather_facts: false

  vars:
    ntp_servers:    # NTP サーバーを変数として定義
      - 10.0.3.123
      - 10.0.4.123
  tasks:
    - name: configuration
      vyos_config:
        src: ntp.j2 # Jinja2 テンプレートファイルを読み込む

src オプションに、読み込む Jinja2 ファイル名を指定します(あとで作成します)。

Jinja2 テンプレートファイルの作成

先どの Playbook が読み込む ntp.j2 を作成します。

  • ntp.j2
{% for n in ntp_servers %}
set system ntp server {{ n }}
{% endfor %}

変数 ntp_servers は、今回の場合、Playbook の Play の vars で指定したものを示します。

変数 ntp_servers には、10.0.3.12310.0.4.123 の2台のアドレスが定義されているので、この for は2会繰り返すことになり、結果として以下の set 文を生成します。

set system ntp server 10.0.3.123
set system ntp server 10.0.4.123

Playbook 実行

Playbook を実行します。

$ ansible-playbook -i inventory.ini confg02_tepmplate.yml 

PLAY [vyos] ************************************************************************************************************

TASK [configuration] ***************************************************************************************************
changed: [vyos1]

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

実際に設定変更が行われたので、changed となりました。やはり、もう一度 Playbook を実行すると changed にはなりません。

確認

一応、VyOS 側でコンフィグを確認します。

vagrant@vyos:~$ show configuration commands | match ntp
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 ntp server '10.0.1.123'
set system ntp server '10.0.2.123'
set system ntp server '10.0.3.123'
set system ntp server '10.0.4.123'

10.0.3.12310.0.4.123 の分が追加されました。


■ おわりに

vyos_config モジュールを利用して、コマンドべた書きと、テンプレートを利用したコマンド投入 Playbook 例をご紹介しました。

他の機能についてか、公式ドキュメントを参照してください。(再掲)

docs.ansible.com