初めてのAnsibleもくもく会

Ansible もくもく会に参加してきた。

今年の1月に開催された Network Automation with Ansibleの場や、
他の勉強会の時に、もくもく会はそこまでハードルは高くないと伺い、もくもく会への参加を決意。

自分と同じように行きづらい雰囲気を感じている人がいるのなら、
少しでもハードルを下げられる記事になれればと思います。




会場は、AP Communicationsさん。
こんな感じでした。
<img width="1050" alt="スクリーンショット 2019-05-16 21.36.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417512/d919659e-29be-074e-6556-f741f091eda1.png">


"Engineer Driven"、かっこいい。


#Ansibleもくもく会とは
自分のペースでAnsibleに触れる場。

#もくもくする前に自問してみた
####▶︎ 今回、もくもく会で得たい事
・Ansibleの環境構築含め、やりたい事が実現できるようにスキルを身につけたい。
・自社の業務環境でAnsible使って、改善できないかな。(むしろ、やってやる。)
・上記の環境構築の相談ができたらしたい。


#もくもく開始前のアナウンス
####▶︎ アップデート
Ansibleユーザ会が1年前に比べ、約1,000人くらい増加。
ユーザ会では、経験談などをシェアできる場も提供している。
TrelloでAnsibleの持ち込み企画も募集している。

####▶︎ 直近のイベント
・5/31 Ansible night in Osaka
・6/13 Ansibleもくもく会 in Red Hat

#もくもくしてみた
Gitに上げられた教材を使っても良いし、他にやりたい事があればそっちをやっても良い。
https://github.com/network-automation/linklight/blob/master/exercises/networking_v2/README.ja.md


####▶︎ 構成情報
<img width="977" alt="スクリーンショット 2019-05-14 19.32.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417512/71c90b38-96a3-9531-eb76-59052f7674b6.png">

####▶︎ 教材
<img width="977" alt="スクリーンショット 2019-05-14 19.31.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417512/b18ac07e-9d4a-f8fa-afef-746916fcb1e0.png">


もくもく会は初参加だった為、ドリル的な感覚で、教材を上から舐めてみた。
下記は実際に自分がやった内容を一部貼り付けています。
教材と内容が重複する形になるので、細かい説明は教材を確認してください。




####Section 01 - Ansibleを用いたネットワーク機器からのデータ取集
▶︎ Exercise 1.0 - Anisbleのlab環境を確認してみよう

Ansible.cfgの中身を確認

```
[student24@ansible networking-workshop]$ cat ~/.ansible.cfg
[defaults]
stdout_callback = yaml
connection = smart
timeout = 60
deprecation_warnings = False
host_key_checking = False
retry_files_enabled = False
inventory = /home/student24/networking-workshop/lab_inventory/hosts
[persistent_connection]
connect_timeout = 60
command_timeout = 60
[student24@ansible networking-workshop]$ 
```

Inventoryファイルの中身を確認
- Ansibleで使用する定義を確認する

```
[student24@ansible networking-workshop]$ cat ~/networking-workshop/lab_inventory/hosts 
[all:vars]
ansible_ssh_private_key_file=/home/student24/.ssh/aws-private.pem
[routers:children]
cisco

[cisco]
rtr1 ansible_host=35.172.190.244 private_ip=172.16.172.61
rtr2 ansible_host=54.175.227.150 private_ip=172.17.175.108
rtr3 ansible_host=3.90.179.255 private_ip=172.16.184.46
rtr4 ansible_host=54.82.90.77 private_ip=172.17.55.218


[cisco:vars]
ansible_user=ec2-user
ansible_network_os=ios
ansible_connection=network_cli


[dc1]
rtr1
rtr3

[dc2]
rtr2
rtr4

[hosts]
host1 ansible_host=54.163.12.44 ansible_user=ec2-user private_ip=172.17.153.76

[control]
ansible ansible_host=3.83.231.68 ansible_user=student24 private_ip=172.16.33.116
[student24@ansible networking-workshop]$ 
```


▶︎ Exercise 1.1 - 初めてのplaybookを書いてみよう
gather_ios_data.ymlを作成
- ios_factsモジュールを使う

```
[student24@ansible networking-workshop]$ vim gather_ios_data.yml
---
- name: GATHER INFORMATION FROM ROUTERS
  hosts: cisco
  connection: network_cli
  gather_facts: no

  tasks:
    - name: GATHER ROUTER FACTS
      ios_facts:
```


作成したPlaybook ”gather_ios_data.yml” 実行

```
[student24@ansible networking-workshop]$ ansible-playbook -i lab_inventory/hosts gather_ios_data.yml 

PLAY [GATHER INFORMATION FROM ROUTERS] *****************************************

TASK [GATHER ROUTER FACTS] *****************************************************
ok: [rtr4]
ok: [rtr3]
ok: [rtr1]
ok: [rtr2]

PLAY RECAP *********************************************************************
rtr1                       : ok=1    changed=0    unreachable=0    failed=0   
rtr2                       : ok=1    changed=0    unreachable=0    failed=0   
rtr3                       : ok=1    changed=0    unreachable=0    failed=0   
rtr4                       : ok=1    changed=0    unreachable=0    failed=0   

[student24@ansible networking-workshop]$ 
```
TASKにて全てのルータにて反映された事を確認。

-vをつけてPlaybookを実行する事で、実際の実行結果を確認できる。
今回は、rtr1のみ実行結果を表示。他のルータは省略。

```
[student24@ansible networking-workshop]$ ansible-playbook -i lab_inventory/hosts gather_ios_data.yml -v
Using /home/student24/.ansible.cfg as config file

PLAY [GATHER INFORMATION FROM ROUTERS] *****************************************

TASK [GATHER ROUTER FACTS] *****************************************************
ok: [rtr3] => changed=false 
  ansible_facts:
    ansible_net_all_ipv4_addresses:
    - 10.100.100.3
・
・
・
ok: [rtr1] => changed=false 
  ansible_facts:
    ansible_net_all_ipv4_addresses:
    - 192.168.35.101
    - 172.16.172.61
    - 192.168.1.101
    - 10.1.1.101
    - 10.200.200.1
    - 10.100.100.1
    - 10.255.0.254
    ansible_net_all_ipv6_addresses: []
    ansible_net_filesystems:
    - 'bootflash:'
    ansible_net_filesystems_info:
      'bootflash:':
        spacefree_kb: 6881148
        spacetotal_kb: 7712284
    ansible_net_gather_subset:
    - hardware
    - default
    - interfaces
    ansible_net_hostname: rtr1
    ansible_net_image: boot:packages.conf
    ansible_net_interfaces:
      GigabitEthernet1:
        bandwidth: 1000000
        description: null
        duplex: Full
        ipv4:
        - address: 172.16.172.61
          subnet: '16'
        lineprotocol: 'up '
        macaddress: 0ae8.0c21.1954
        mediatype: Virtual
        mtu: 1500
        operstatus: up
        type: CSR vNIC
      Loopback0:
        bandwidth: 8000000
        description: null
        duplex: null
        ipv4:
        - address: 192.168.1.101
          subnet: '24'
        lineprotocol: 'up '
        macaddress: null
        mediatype: null
        mtu: 1514
        operstatus: up
        type: null
      Loopback1:
        bandwidth: 8000000
        description: null
        duplex: null
        ipv4:
        - address: 10.1.1.101
          subnet: '24'
        lineprotocol: 'up '
        macaddress: null
        mediatype: null
        mtu: 1514
        operstatus: up
        type: null
      Tunnel0:
        bandwidth: 100
        description: null
        duplex: null
        ipv4:
        - address: 10.100.100.1
          subnet: '24'
        lineprotocol: 'up '
        macaddress: null
        mediatype: null
        mtu: 9976
        operstatus: up
        type: null
      Tunnel1:
        bandwidth: 100
        description: null
        duplex: null
        ipv4:
        - address: 10.200.200.1
          subnet: '24'
        lineprotocol: 'up '
        macaddress: null
        mediatype: null
        mtu: 9976
        operstatus: up
        type: null
      Tunnel2:
        bandwidth: 100
        description: null
        duplex: null
        ipv4:
        - address: 10.255.0.254
          subnet: '24'
        lineprotocol: 'up '
        macaddress: null
        mediatype: null
        mtu: 9972
        operstatus: up
        type: null
      VirtualPortGroup0:
        bandwidth: 750000
        description: null
        duplex: null
        ipv4:
        - address: 192.168.35.101
          subnet: '24'
        lineprotocol: 'up '
        macaddress: 001e.e6ae.75bd
        mediatype: null
        mtu: 1500
        operstatus: up
        type: Virtual Port Group
    ansible_net_memfree_mb: 1873821
    ansible_net_memtotal_mb: 2169814
    ansible_net_model: CSR1000V
    ansible_net_serialnum: 9IJ6CG5FV5L
    ansible_net_version: 16.10.01b
ok: [rtr2] => changed=false 
  ansible_facts:
    ansible_net_all_ipv4_addresses:
    - 192.168.35.101
・
・
・
ok: [rtr4] => changed=false 
  ansible_facts:
    ansible_net_all_ipv4_addresses:
    - 10.101.101.4
・
・
・
    ansible_net_model: CSR1000V
    ansible_net_serialnum: 9VCVJK8PRGW
    ansible_net_version: 16.10.01b

PLAY RECAP *********************************************************************
rtr1                       : ok=1    changed=0    unreachable=0    failed=0   
rtr2                       : ok=1    changed=0    unreachable=0    failed=0   
rtr3                       : ok=1    changed=0    unreachable=0    failed=0   
rtr4                       : ok=1    changed=0    unreachable=0    failed=0   

[student24@ansible networking-workshop]$ 
```





Playbook “gather_ios_data.yml” に2つのタスク(IOSのVersion確認とSerial Nummber確認)と、debugモジュールを追加

```
[student24@ansible networking-workshop]$ vim gather_ios_data.yml 
---
- name: GATHER INFORMATION FROM ROUTERS
  hosts: cisco
  connection: network_cli
  gather_facts: no

  tasks:
    - name: GATHER ROUTER FACTS
      ios_facts:

    - name: DISPLAY VERSION
      debug:
        msg: "The IOS version is: {{ ansible_net_version }}"

    - name: DISPLAY SERIAL NUMBER
      debug:
        msg: "The serial number is:{{ ansible_net_serialnum }}"
```


Playbook “gather_ios_data.yml” の実行
- オプションの-vを使わず、ネットワーク機器のバージョンとシリアル番号の収集が結果として返ってくる
  タスクが3つとも完了している事を確認

```
[student24@ansible networking-workshop]$ ansible-playbook -i lab_inventory/hosts gather_ios_data.yml 

PLAY [GATHER INFORMATION FROM ROUTERS] *****************************************

TASK [GATHER ROUTER FACTS] *****************************************************
ok: [rtr1]
ok: [rtr3]
ok: [rtr2]
ok: [rtr4]

TASK [DISPLAY VERSION] *********************************************************
ok: [rtr2] => 
  msg: 'The IOS version is: 16.10.01b'
ok: [rtr1] => 
  msg: 'The IOS version is: 16.10.01b'
ok: [rtr4] => 
  msg: 'The IOS version is: 16.10.01b'
ok: [rtr3] => 
  msg: 'The IOS version is: 16.10.01b'

TASK [DISPLAY SERIAL NUMBER] ***************************************************
ok: [rtr3] => 
  msg: The serial number is:9S0KV8XIOT8
ok: [rtr1] => 
  msg: The serial number is:9IJ6CG5FV5L
ok: [rtr4] => 
  msg: The serial number is:9VCVJK8PRGW
ok: [rtr2] => 
  msg: The serial number is:9VVVYS8CAML

PLAY RECAP *********************************************************************
rtr1                       : ok=3    changed=0    unreachable=0    failed=0   
rtr2                       : ok=3    changed=0    unreachable=0    failed=0   
rtr3                       : ok=3    changed=0    unreachable=0    failed=0   
rtr4                       : ok=3    changed=0    unreachable=0    failed=0   

[student24@ansible networking-workshop]$ 
```



▶︎ Exercise 1.2 - Moduleのドキュメントの確認方法、 出力結果の登録方法、 tagの使い方
ios_commandモジュールの利用
- 手動オペレーションと同様にshowコマンドの実行結果を取得する事ができる。
  ・show runからホスト名を取得
  ・IFのbrief情報を取得

```
[student24@ansible networking-workshop]$ vim gather_ios_data.yml 
---
- name: GATHER INFORMATION FROM ROUTERS
  hosts: cisco
  connection: network_cli
  gather_facts: no

  tasks:
    - name: GATHER ROUTER FACTS
      ios_facts:

    - name: DISPLAY VERSION
      debug:
        msg: "The IOS version is: {{ ansible_net_version }}"

    - name: DISPLAY SERIAL NUMBER
      debug:
        msg: "The serial number is:{{ ansible_net_serialnum }}"

    - name: COLLECT OUTPUT OF SHOW COMMANDS
      ios_command:
        commands:
          - show run | i hostname
          - show ip interface brief
      tags: show
```


再度、Playbook “gather_ios_data.yml” を実行
- タグで限定的に情報を引っ掛けてくることもできる。

```
[student24@ansible networking-workshop]$ ansible-playbook -i lab_inventory/hosts gather_ios_data.yml --tags=show -v
Using /home/student24/.ansible.cfg as config file

PLAY [GATHER INFORMATION FROM ROUTERS] *****************************************

TASK [COLLECT OUTPUT OF SHOW COMMANDS] *****************************************
ok: [rtr2] => changed=false 
  stdout:
  - hostname rtr2
  - |-
    Interface              IP-Address      OK? Method Status                Protocol
    GigabitEthernet1       172.17.175.108  YES DHCP   up                    up
    Loopback0              192.168.2.102   YES manual up                    up
    Loopback1              10.2.2.102      YES manual up                    up
    Tunnel0                10.101.101.2    YES manual up                    up
    Tunnel1                10.200.200.2    YES manual up                    up
    VirtualPortGroup0      192.168.35.101  YES TFTP   up                    up
  stdout_lines: <omitted>
ok: [rtr1] => changed=false 
  stdout:
  - hostname rtr1
  - |-
    Interface              IP-Address      OK? Method Status                Protocol
    GigabitEthernet1       172.16.172.61   YES DHCP   up                    up
    Loopback0              192.168.1.101   YES manual up                    up
    Loopback1              10.1.1.101      YES manual up                    up
    Tunnel0                10.100.100.1    YES manual up                    up
    Tunnel1                10.200.200.1    YES manual up                    up
    Tunnel2                10.255.0.254    YES manual up                    up
    VirtualPortGroup0      192.168.35.101  YES TFTP   up                    up
  stdout_lines: <omitted>
ok: [rtr4] => changed=false 
  stdout:
  - hostname rtr4
  - |-
    Interface              IP-Address      OK? Method Status                Protocol
    GigabitEthernet1       172.17.55.218   YES DHCP   up                    up
    Loopback0              192.168.4.104   YES manual up                    up
    Loopback1              10.4.4.104      YES manual up                    up
    Tunnel0                10.101.101.4    YES manual up                    up
    VirtualPortGroup0      192.168.35.101  YES TFTP   up                    up
  stdout_lines: <omitted>
ok: [rtr3] => changed=false 
  stdout:
  - hostname rtr3
  - |-
    Interface              IP-Address      OK? Method Status                Protocol
    GigabitEthernet1       172.16.184.46   YES DHCP   up                    up
    Loopback0              192.168.3.103   YES manual up                    up
    Loopback1              10.3.3.103      YES manual up                    up
    Tunnel0                10.100.100.3    YES manual up                    up
    VirtualPortGroup0      192.168.35.101  YES TFTP   up                    up
  stdout_lines: <omitted>

PLAY RECAP *********************************************************************
rtr1                       : ok=1    changed=0    unreachable=0    failed=0   
rtr2                       : ok=1    changed=0    unreachable=0    failed=0   
rtr3                       : ok=1    changed=0    unreachable=0    failed=0   
rtr4                       : ok=1    changed=0    unreachable=0    failed=0   

[student24@ansible networking-workshop]$ 
```


####Section 02 - Ansibleを用いたコンフィグ・バックアップ・リストアの実践
▶︎ Exercise 2.0 - Routerのコンフィグを更新してみよう


今度はPlaybook “router_config.yml” を作成
- ios_configモジュールを使い、以下のconfigを追加するよう記載
   ・snmp-server community ansible-public RO
   ・snmp-server community ansible-private RW

```
[student24@ansible networking-workshop]$ vim router_configs.yml
---
- name: SNMP RO/RW STRING CONFIGURATION
  hosts: cisco
  gather_facts: no
  connection: network_cli

  tasks:

    - name: ENSURE THAT THE DESIRED SNMP STRINGS ARE PRESENT
      ios_config:
        commands:
          - snmp-server community ansible-public RO
          - snmp-server community ansible-private RW
```


Playbook “router_configs.yml” を実行

```
[student24@ansible networking-workshop]$ ansible-playbook -i lab_inventory/hosts router_configs.yml 
```


実際にRouter rtr1のconfigに設定が入った事を確認

```
rtr1#show running-config | include snmp
snmp-server community ansible-public RO
snmp-server community ansible-private RW
rtr1#
```





secure_router.cfgを作成

```
[student24@ansible networking-workshop]$ vim secure_router.cfg
line con 0
 exec-timeout 5 0
line vty 0 4
 exec-timeout 5 0
 transport input ssh
ip ssh time-out 60
ip ssh authentication-retries 5
service password-encryption
service tcp-keepalives-in
service tcp-keepalives-out
```

Playbook “router_configs.yml” にHARDEN IOS ROUTERSを追加

```
[student24@ansible networking-workshop]$ vim router_configs.yml
---
- name: UPDATE THE SNMP RO/RW STRINGS
  hosts: cisco
  gather_facts: no
  connection: network_cli

  tasks:

    - name: ENSURE THAT THE DESIRED SNMP STRINGS ARE PRESENT
      ios_config:
        commands:
          - snmp-server community ansible-public RO
          - snmp-server community ansible-private RW
          - snmp-server community ansible-test RO


- name: HARDEN IOS ROUTERS
  hosts: cisco
  gather_facts: no
  connection: network_cli

  tasks:

    - name: ENSURE THAT ROUTERS ARE SECURE
      ios_config:
        src: secure_router.cfg
```

Playbook “router_config.yml” 実行前のRouter rtr1 config

```
rtr1#show running-config | include line
line con 0
line vty 0 4
rtr1#
rtr1#show running-config | include ssh 
ip ssh rsa keypair-name ssh-key
ip ssh version 2
ip ssh pubkey-chain
   key-hash ssh-rsa 2998C6AEB4C6351B5E0D2A894F084D99 ec2-user
 transport input ssh
rtr1#
rtr1#show running-config | include service
service timestamps debug datetime msec
service timestamps log datetime msec
service call-home
rtr1#
```

Playbok ”router_config.yml” 実行

```
[student24@ansible networking-workshop]$ ansible-playbook -i lab_inventory/hosts router_configs.yml

PLAY [SNMP RO/RW STRING CONFIGURATION] *****************************************

TASK [ENSURE THAT THE DESIRED SNMP STRINGS ARE PRESENT] ************************
ok: [rtr1]
ok: [rtr3]
ok: [rtr2]
ok: [rtr4]

PLAY [HARDEN IOS ROUTERS] ******************************************************

TASK [ENSURE THAT ROUTERS ARE SECURE] ******************************************
changed: [rtr1]
changed: [rtr3]
changed: [rtr4]
changed: [rtr2]

PLAY RECAP *********************************************************************
rtr1                       : ok=2    changed=1    unreachable=0    failed=0   
rtr2                       : ok=2    changed=1    unreachable=0    failed=0   
rtr3                       : ok=2    changed=1    unreachable=0    failed=0   
rtr4                       : ok=2    changed=1    unreachable=0    failed=0   

[student24@ansible networking-workshop]$ 
```

実行結果をRouter rtr1 にて確認

```
rtr1#
rtr1#show running-config | include line
line con 0
line vty 0 4
rtr1#show running-config | include service
service tcp-keepalives-in
service tcp-keepalives-out
service timestamps debug datetime msec
service timestamps log datetime msec
service password-encryption
service call-home
rtr1#
rtr1#
rtr1#show running-config | include ssh    
ip ssh time-out 60
ip ssh authentication-retries 5
ip ssh rsa keypair-name ssh-key
ip ssh version 2
ip ssh pubkey-chain
   key-hash ssh-rsa 2998C6AEB4C6351B5E0D2A894F084D99 ec2-user
 transport input ssh
rtr1#
```


▶︎ Exercise 2.1 - Routerのコンフィグをバックアップしてみよう
Playbook “backup.yml”を作成
- Ciscoルータの設定をバックアップするためのプレイブックを作成。ios_configモジュールを使う。

```
[student24@ansible networking-workshop]$ vim backup.yml
---
- name: BACKUP ROUTER CONFIGURATIONS
  hosts: cisco
  connection: network_cli
  gather_facts: no

  tasks:
    - name: BACKUP THE CONFIG
      ios_config:
        backup: yes
      register: config_output
```


Playbook ”backup.yml” を実行

```
[student24@ansible networking-workshop]$ ansible-playbook -i lab_inventory/hosts backup.yml

PLAY [BACKUP ROUTER CONFIGURATIONS] ********************************************

TASK [BACKUP THE CONFIG] *******************************************************
ok: [rtr2]
ok: [rtr1]
ok: [rtr3]
ok: [rtr4]

PLAY RECAP *********************************************************************
rtr1                       : ok=1    changed=0    unreachable=0    failed=0   
rtr2                       : ok=1    changed=0    unreachable=0    failed=0   
rtr3                       : ok=1    changed=0    unreachable=0    failed=0   
rtr4                       : ok=1    changed=0    unreachable=0    failed=0   

[student24@ansible networking-workshop]$ 
```

backupというディレクトリ作成できた事を確認

```
[student24@ansible networking-workshop]$ ls -l backup
合計 36
-rw-rw-r--. 1 student24 student24 8801  5月 14 11:35 rtr1_config.2019-05-14@11:35:53
-rw-rw-r--. 1 student24 student24 8083  5月 14 11:35 rtr2_config.2019-05-14@11:35:53
-rw-rw-r--. 1 student24 student24 7536  5月 14 11:35 rtr3_config.2019-05-14@11:35:53
-rw-rw-r--. 1 student24 student24 7544  5月 14 11:35 rtr4_config.2019-05-14@11:35:53
[student24@ansible networking-workshop]$ 
[student24@ansible networking-workshop]$ ls
README.ja.md  backup.yml           lab_inventory       secure_router.cfg
README.md     exercises            parsers             templates
backup        gather_ios_data.yml  router_configs.yml
[student24@ansible networking-workshop]$ 
```

Playbook ”backup.yml” にcopyモジュールを追加

```
[student24@ansible networking-workshop]$ vim backup.yml
---
- name: BACKUP ROUTER CONFIGURATIONS
  hosts: cisco
  connection: network_cli
  gather_facts: no

  tasks:
    - name: BACKUP THE CONFIG
      ios_config:
        backup: yes
      register: config_output

    - name: RENAME BACKUP
      copy:
        src: "{{config_output.backup_path}}"
        dest: "./backup/{{inventory_hostname}}.config"
```

再度Playbook ”backup.yml” を実行

```
student24@ansible networking-workshop]$ ansible-playbook -i lab_inventory/hosts backup.yml

PLAY [BACKUP ROUTER CONFIGURATIONS] ********************************************

TASK [BACKUP THE CONFIG] *******************************************************
ok: [rtr1]
ok: [rtr2]
ok: [rtr3]
ok: [rtr4]

TASK [RENAME BACKUP] ***********************************************************
changed: [rtr3]
changed: [rtr4]
changed: [rtr1]
changed: [rtr2]

PLAY RECAP *********************************************************************
rtr1                       : ok=2    changed=1    unreachable=0    failed=0   
rtr2                       : ok=2    changed=1    unreachable=0    failed=0   
rtr3                       : ok=2    changed=1    unreachable=0    failed=0   
rtr4                       : ok=2    changed=1    unreachable=0    failed=0   

[student24@ansible networking-workshop]$ 
```


別のバックアップされたコンフィグファイルが保存された事を確認

```
[student24@ansible networking-workshop]$ ls -l backup
合計 72
-rw-rw-r--. 1 student24 student24 8801  5月 14 11:41 rtr1.config
-rw-rw-r--. 1 student24 student24 8801  5月 14 11:41 rtr1_config.2019-05-14@11:41:22
-rw-rw-r--. 1 student24 student24 8083  5月 14 11:41 rtr2.config
-rw-rw-r--. 1 student24 student24 8083  5月 14 11:41 rtr2_config.2019-05-14@11:41:22
-rw-rw-r--. 1 student24 student24 7536  5月 14 11:41 rtr3.config
-rw-rw-r--. 1 student24 student24 7536  5月 14 11:41 rtr3_config.2019-05-14@11:41:22
-rw-rw-r--. 1 student24 student24 7544  5月 14 11:41 rtr4.config
-rw-rw-r--. 1 student24 student24 7544  5月 14 11:41 rtr4_config.2019-05-14@11:41:23
[student24@ansible networking-workshop]$ 
```


▶︎ Exercise 2.2 - バックアップしたコンフィグでRouterをリストアしてみよう
バックアップファイルが、backupディレクトリに格納されている事を確認。

```
[student24@ansible networking-workshop]$ tree backup
backup
├── rtr1.config
├── rtr1_config.2019-05-14@11:45:08
├── rtr2.config
├── rtr2_config.2019-05-14@11:45:08
├── rtr3.config
├── rtr3_config.2019-05-14@11:45:09
├── rtr4.config
└── rtr4_config.2019-05-14@11:45:09

0 directories, 8 files
[student24@ansible networking-workshop]$ 
```


ルータrtr1に、loopback 101を作成

```
rtr1#show running-config interface loopback 101
Building configuration...

Current configuration : 67 bytes
!
interface Loopback101
 ip address 169.1.1.1 255.255.255.255
end

rtr1#
```


Playbook “resore_config.yml”を実行。(一部失敗)

```
student24@ansible networking-workshop]$ ansible-playbook -i lab_inventory/hosts resore_config.yml

PLAY [RESTORE CONFIGURATION] ***************************************************

TASK [COPY RUNNING CONFIG TO ROUTER] *******************************************
changed: [rtr1]

・
・
・
PLAY RECAP *********************************************************************
rtr1                       : ok=1    changed=1    unreachable=0    failed=0   
rtr2                       : ok=0    changed=0    unreachable=0    failed=1   
rtr3                       : ok=0    changed=0    unreachable=0    failed=1   
rtr4                       : ok=0    changed=0    unreachable=0    failed=1   

[student24@ansible networking-workshop]$
```


Router rtr1にてファイルがコピーされた事を確認

```
rtr1#dir 
Directory of bootflash:/

   11  drwx            16384  Jan 31 2019 20:11:12 +00:00  lost+found
   12  -rw-        407131164  Jan 31 2019 20:12:39 +00:00  csr1000v-mono-universalk9.16.10.01b.SPA.pkg
   13  -rw-         41893330  Jan 31 2019 20:12:40 +00:00  csr1000v-rpboot.16.10.01b.SPA.pkg
   14  -rw-             1967  Jan 31 2019 20:12:40 +00:00  packages.conf
105665  drwx             4096  May 13 2019 08:54:12 +00:00  .installer
48769  drwx             4096  May 13 2019 08:54:11 +00:00  core
   15  -rw-              128  May 13 2019 08:54:04 +00:00  iid_check.log
203201  drwx             4096  May 13 2019 08:54:05 +00:00  .prst_sync
32513  drwx             4096  May 13 2019 08:54:11 +00:00  .rollback_timer
40641  drwx             8192  May 14 2019 11:54:32 +00:00  tracelogs
65025  drwx             4096  May 13 2019 08:55:34 +00:00  .dbpersist
138177  drwx             4096  May 13 2019 08:54:20 +00:00  virtual-instance
   16  -rw-               30  May 13 2019 08:55:11 +00:00  throughput_monitor_params
   17  -rw-             6078  May 13 2019 08:55:32 +00:00  cvac.log
   18  -rw-                1  May 13 2019 08:55:21 +00:00  .cvac_version
   19  -rw-               16  May 13 2019 08:55:21 +00:00  ovf-env.xml.md5
   20  -rw-              209  May 13 2019 08:55:21 +00:00  csrlxc-cfg.log
170689  drwx             4096  May 13 2019 08:55:21 +00:00  onep
398273  drwx             4096  May 14 2019 10:58:45 +00:00  syslog
414529  drwx             4096  May 13 2019 08:55:48 +00:00  iox
   21  -rw-             8740  May 14 2019 11:53:53 +00:00  rtr1.config

7897378816 bytes total (7046279168 bytes free)
rtr1# 
rtr1#
rtr1#show clo
*11:57:52.110 UTC Tue May 14 2019
rtr1#
```


Playbook “resore_config.yml”に新しいTaskを追加

```
[student24@ansible networking-workshop]$ vim resore_config.yml
---
- name: RESTORE CONFIGURATION
  hosts: cisco
  connection: network_cli
  gather_facts: no

  tasks:
    - name: COPY RUNNING CONFIG TO ROUTER
      command: scp ./backup/{{inventory_hostname}}.config {{inventory_hostname}}:/{{inventory_hostname}}.config

    - name: CONFIG REPLACE
      ios_command:
        commands:
          - config replace flash:{{inventory_hostname}}.config force
```


Playbook “resore_config.yml”を実行(一部実行失敗)

```
[student24@ansible networking-workshop]$ ansible-playbook -i lab_inventory/hosts resore_config.yml 

PLAY [RESTORE CONFIGURATION] ***************************************************

TASK [COPY RUNNING CONFIG TO ROUTER] *******************************************
changed: [rtr2]
changed: [rtr1]
・
・
・
TASK [CONFIG REPLACE] **********************************************************
ok: [rtr1]
ok: [rtr2]

PLAY RECAP *********************************************************************
rtr1                       : ok=2    changed=1    unreachable=0    failed=0   
rtr2                       : ok=2    changed=1    unreachable=0    failed=0   
rtr3                       : ok=0    changed=0    unreachable=0    failed=1   
rtr4                       : ok=0    changed=0    unreachable=0    failed=1   

[student24@ansible networking-workshop]$ 
```

バックアップファイルを使い、
先ほど、Router rtr1にて作成したloopback 101が削除されている事を確認

```
rtr1#sh ip interface brief 
Interface              IP-Address      OK? Method Status                Protocol
GigabitEthernet1       172.16.172.61   YES DHCP   up                    up      
Loopback0              192.168.1.101   YES manual up                    up      
Loopback1              10.1.1.101      YES manual up                    up      
Tunnel0                10.100.100.1    YES manual up                    up      
Tunnel1                10.200.200.1    YES manual up                    up      
Tunnel2                10.255.0.254    YES manual up                    up      
VirtualPortGroup0      192.168.35.101  YES TFTP   up                    up      
rtr1#
rtr1#
rtr1#
rtr1#show running-config interface loopback 101
                                            ^
% Invalid input detected at '^' marker.

rtr1#
```









#成果共有
####1人目 成果共有
Section1.0-3.1までできた。
最近、Ansibleは業務でも使うようになってきた。
最後は時間が余ったので、QAの方でも質問してみた。
SCPの対応がうまくいかず、最後はNWのトラブルシュートをやっていた感じになってしまった。

####2人目 成果共有
会社でAnsibleを使い始めて4ヶ月。
あんまり普段はNW機器を触る機会はないが、ミドルウェア的な感覚で簡単に操作できた。



#まとめ
・手軽にAnsibleを触れる環境や機会を作っていただき、本当にありがたいです。
・あんまり要領良いやり方ではないが、言われるままに/書かれているままにAnsible触って、見返してを繰り返した感じだったので、正直細かいところまで理解へ結びつける事ができなかった。家に帰ってAnsibleを触ってみる。
また、せっかく現場で質問できる場があるのに、QA対応に参加できなかったので、次回以降はもう少し余裕をもって対応する。

<img width="1050" alt="スクリーンショット 2019-05-16 21.35.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417512/83d39189-f69d-aca8-2e54-70edda3721b5.png">