Rollback in Cisco IOS XR

image alt

image alt

Все, кто хоть раз сталкивался с необходимостью внести изменения в конфигурацию оборудования Cisco под управлением IOS XR, знают, что в отличии от обычного IOS, IOS-XR требует производить коммит для применения конфигурации. Но как закоммитить конфиг, думаю, что знают все, кто хоть раз в жизни щупал IOS XR. А вот как откатить конфиг назад? На JunOS все легко и понятно, чего не скажешь об IOS XR. До определенного времени и я этого не знал, но в одну из ночей у меня было всего 5 минут, чтобы этому научиться, откатить конфиг и не получить аварию. В сети ничего, кроме мануала самой Циски на английском я не нашел, поэтому решил написать небольшой ликбез по данной теме, авось кому то пригодится.

Итак, поехали…

Примечание: хоть статья и рассчитана на начинающих инженеров, но может быть полезна и инженерам, не понаслышке знакомых с IOS XR. Как говорится, век живи-век учись.

Для начала — в качестве введения — кратко опишу процесс применения конфигурации на IOS XR для тех, кто с ним (IOS XR) еще не знаком. Предположим, что мы хотим добавить в конфиг например дескрипшн:
RP/0/0/CPU0:RZN-PE4(config)#interface gigabitEthernet 0/0/0/5 description "link to RZN-CE4-SW5"
RP/0/0/CPU0:RZN-PE4(config)#show                                    
Sun Dec 11 17:11:11.950 UTC
Building configuration...
!! IOS XR Configuration 5.3.3
interface GigabitEthernet0/0/0/5
 description "link to RZN-CE4-SW5"
!
end

На обычном IOS все просто — добавили что то в конфиг — изменения сразу применялись. На IOS XR пока мы не сделаем коммит, изменения не применятся:
RP/0/0/CPU0:RZN-PE4(config)#do sh run int gi0/0/0/5 description 
Sun Dec 11 17:12:09.346 UTC
% No such configuration item(s)

Делаем коммит:
RP/0/0/CPU0:RZN-PE4(config)#commit comment add desc int ge0/0/0/5
Sun Dec 11 17:12:43.443 UTC

Теперь все в порядке, конфигурационные изменения применились:
RP/0/0/CPU0:RZN-PE4(config)#do sh run int gi0/0/0/5 description  
Sun Dec 11 17:12:48.353 UTC
interface GigabitEthernet0/0/0/5
 description "link to RZN-CE4-SW5"
!
end

Как видно из представленных выше выводов я сделал комментарий к коммиту. Это очень помогает при поиске конфигурации на которую надо откатиться.

Теперь перейдем непосредственно к самим ролбэкам. Чтобы выполнить откат конфигурации, можно использовать следующую команду:

RP/0/0/CPU0:RZN-PE4#rollback configuration ? 
  last        Rollback last  commits made
  to          Rollback up to (and including) a specific commit
  to-exclude  Rollback up to (and excluding) a specific commit
  1000000037  Commit ID
  1000000036  Commit ID
  1000000035  Commit ID
  1000000034  Commit ID
  1000000033  Commit ID
  1000000032  Commit ID
  1000000031  Commit ID
  1000000030  Commit ID
  1000000029  Commit ID
  1000000028  Commit ID
  1000000027  Commit ID
  1000000026  Commit ID
  1000000025  Commit ID
  1000000024  Commit ID
  1000000023  Commit ID
  1000000022  Commit ID
  1000000021  Commit ID
  1000000020  Commit ID
  1000000019  Commit ID
  1000000018  Commit ID

Как видите, маршрутизатор вывалил нам кучу Commit ID. В отличии от Juniper, в котором список коммитов начинается с 0 и нулевой коммит — это текущий конфиг, на IOS XR ID коммита увеличивается при каждом коммите, и текущий коммит — тот который имеет наибольший ID из представленного списка. В нашем случае 1000000037 — это текущая конфигурация. Если сравнивать с JunOS — то это коммит с ID 0.

Если нам надо откатиться всего на один коммит — то есть на конфигурацию с ID 1000000036, то тут все просто, можно сделать так:

RP/0/0/CPU0:RZN-PE4#rollback configuration last 1

И в итоге мы откатимся на конфигурацию с ID 1000000036.

Но если вы сделали не один коммит, или вам в ходе работ надо откатиться на определенную конфигурацию. Как быть тут? Для этого нужно посмотреть кто и когда делал коммиты и найти нужный:

RP/0/0/CPU0:RZN-PE4#sh configuration commit list 10
Sun Dec 11 17:17:39.113 UTC
SNo. Label/ID              User      Line                Client      Time Stamp
~~~~ ~~~~~~~~              ~~~~      ~~~~                ~~~~~~      ~~~~~~~~~~
1    1000000037            bormoglot con0_0_CPU0         CLI         Sun Dec 11 17:12:43 2016
2    1000000036            bormoglot con0_0_CPU0         CLI         Sun Dec 11 16:55:22 2016
3    1000000035            bormoglot con0_0_CPU0         CLI         Sun Dec 11 16:55:07 2016
4    1000000034            bormoglot con0_0_CPU0         CLI         Sun Dec 11 16:54:56 2016
5    1000000033            bormoglot con0_0_CPU0         Rollback    Sun Dec 11 16:34:08 2016
6    1000000032            bormoglot con0_0_CPU0         CLI         Sun Dec 11 16:23:18 2016
7    1000000031            bormoglot con0_0_CPU0         Rollback    Sun Dec 11 15:48:11 2016
8    1000000030            bormoglot con0_0_CPU0         CLI         Sun Dec 11 15:43:43 2016
9    1000000029            bormoglot con0_0_CPU0         CLI         Sun Dec 11 15:32:44 2016
10   1000000028            bormoglot con0_0_CPU0         CLI         Sun Dec 11 09:26:59 2016

Примечание: цифра 10 означает сколько коммитов выводить, в противном случае Циска вывалит вам все коммиты, что будет являться избыточной информацией (вряд ли вы сделали 40–50 коммитов за раз, хотя кто знает…). В отличии от JunOS, IOS XR сохраняет 100 последних коммитов.

Но в моем случае представленный выше вывод не особо помог в поиске нужного коммита. Мало того что коммиты делал только я, так еще невозможно сориентироваться по времени на какой коммит мне надо вернуться. А вот тут нам помогут комментарии к коммитам:
RP/0/0/CPU0:RZN-PE4#sh configuration commit list 5 detail  
Sun Dec 11 17:20:19.682 UTC

   1) CommitId: 1000000037                 Label: NONE
      UserId:   bormoglotx                 Line:  con0_0_CPU0
      Client:   CLI                        Time:  Sun Dec 11 17:12:43 2016
      Comment:   add desc int ge0/0/0/5 

   2) CommitId: 1000000036                 Label: NONE
      UserId:   bormoglotx                 Line:  con0_0_CPU0
      Client:   CLI                        Time:  Sun Dec 11 16:55:22 2016
      Comment:   "descr gi0/0/0/4" 

   3) CommitId: 1000000035                 Label: NONE
      UserId:   bormoglotx                 Line:  con0_0_CPU0
      Client:   CLI                        Time:  Sun Dec 11 16:55:07 2016
      Comment:   "descr gi0/0/0/3" 

   4) CommitId: 1000000034                 Label: NONE
      UserId:   bormoglotx                 Line:  con0_0_CPU0
      Client:   CLI                        Time:  Sun Dec 11 16:54:56 2016
      Comment:   "descr gi0/0/0/2" 

   5) CommitId: 1000000033                 Label: NONE
      UserId:   bormoglotx                 Line:  con0_0_CPU0
      Client:   Rollback                   Time:  Sun Dec 11 16:34:08 2016
      Comment:  no evi2

Теперь проще, я вижу свои комментарии к коммитам и примерно могу понять, что я добавлял в каждом из коммитов. Но не всегда комментарий отражает все изменения в конфигурации. А уж если он написан не вами, то тогда вообще непонятно, что скрывается под описанным дескрипшеном. Чтобы понять, что именно менялось в конфиге, нужно воспользоваться следующей командой:
RP/0/0/CPU0:RZN-PE4#show configuration commit changes 1000000037
Sun Dec 11 17:22:05.485 UTC
Building configuration...
!! IOS XR Configuration 5.3.3
interface GigabitEthernet0/0/0/5
 description "link to RZN-CE4-SW5"
!
end

Данная команда выводит, что именно было добавлено или удалено в конфигурацию в указанном коммите.
Примечание: помимо ID коммита, есть и номер коммита по порядку, который указан в детальном выводе:
 1) CommitId: 1000000037                 Label: NONE
      UserId:   bormoglotx                 Line:  con0_0_CPU0
      Client:   CLI                        Time:  Sun Dec 11 17:12:43 2016
      Comment:   add desc int ge0/0/0/5

1- это номер коммита, а 1000000037 — его ID. Смотреть конфигурационные изменения или откатываться можно и по номеру коммита, например:
RP/0/0/CPU0:RZN-PE4#show configuration commit changes last 1    
Sun Dec 11 17:24:19.616 UTC
Building configuration...
!! IOS XR Configuration 5.3.3
interface GigabitEthernet0/0/0/5
 description "link to RZN-CE4-SW5"
!
end

После last указываете число коммитов до нужного (число равно номеру коммита). В отличии от ID, номер коммита постоянно меняется (думаю что ясно, что номер коммита инкрементируется с каждым выполнением коммита)

Но особенность данной команды в том, что она показывает нам именно те изменения, который были применены в указанном коммите. Для примера посмотрим что менялось в конфигурации при произведении коммита 1000000036:
RP/0/0/CPU0:RZN-PE4#
RP/0/0/CPU0:RZN-PE4#show configuration commit changes 1000000036
Sun Dec 11 17:25:21.772 UTC
Building configuration...
!! IOS XR Configuration 5.3.3
interface GigabitEthernet0/0/0/4
 description "link to RZN-CE4-SW4"
!
end

По сути этот вывод показывает нам, что изменилось в коммите 1000000036 по сравнению с предыдущим коммитом 1000000035. То есть в мире JunOS аналог данной команды show system rollback 2 compare 3 (первая цифра — это конфигурация, которая будет выводится, вторая цифра, это конфигурация, с которой будет производится сравнение). Точно так же работает и следующая команда, но выводит информацию так сказать «со своей колокольни»:
RP/0/0/CPU0:RZN-PE4#show configuration rollback changes 1000000036
Sun Dec 11 17:27:34.912 UTC
Building configuration...
!! IOS XR Configuration 5.3.3
interface GigabitEthernet0/0/0/4
 no description "link to RZN-CE4-SW4"
!
end

Команда показывает, что мы отменим, если сделаем роллбэк на данный коммит, но показывает изменения в рамках только указанного коммита, а не всей конфигурации в целом. Например мы сделали 5 коммитов и теперь откатываемся на все 5 коммитов. Данная команда нам покажет не результирующие изменения при ролбэке на 5 коммитов, то только те изменения, которые будут отменены в рамках указанного commit ID, не принимая во внимание все промежуточные коммиты. Но ведь результатом применения ролбэка будет отмена не только указанного коммита, но и всех промежуточных изменений, то есть нам нужно видеть сравнение текущей конфигурации с конфигурацией, которая была на момент выполнения коммита, указанного в команде. То есть, если снова провести аналогию с миром JunOS, то нужен вывод команды show system rollback 5 compare 0. Для этого необходимо использовать команду show configuration commit changes, но с ключевым словом to или to-exclude:
RP/0/0/CPU0:RZN-PE4#show configuration rollback changes ?
  last        Changes for rolling back last  commits
  to          Changes up to (and including) a specific commit
  to-exclude  Changes up to (and excluding) a specific commit

Примечание: ключевое слово to-exclude появилось в 5-ой ветке IOS XR, и то не на всех версиях. Во всяком случае на версии 5.1.3 такой команды еще нет, а в 5.3.3 уже есть.

С ключевым словом to команда выведет вам все изменения, которые будут внесены в конфиг в результате применения ролбэка, включая указанный в команде коммит и все промежуточные изменения конфигурации. Смотрим как это работает:
RP/0/0/CPU0:RZN-PE4#show configuration rollback changes to 1000000035
Sun Dec 11 17:32:21.933 UTC
Building configuration...
!! IOS XR Configuration 5.3.3
interface GigabitEthernet0/0/0/3
 no description "link to RZN-CE4-SW3"
!
interface GigabitEthernet0/0/0/4
 no description "link to RZN-CE4-SW4"
!
interface GigabitEthernet0/0/0/5
 no description "link to RZN-CE4-SW5"
!
end

То есть, если мы применим этот ролбэк, то отменяются все изменения включая и изменения, примененные в коммите 1000000035. По сути мы откатимся на конфигурацию, которая была до применения 1000000035 коммита, то есть на конфигурацию с commit ID 1000000034. Это становится понятно после просмотра внесенных в коммите 1000000035 изменений в конфигурацию:
RP/0/0/CPU0:RZN-PE4#show configuration commit changes 1000000035  
Sun Dec 11 17:34:23.184 UTC
Building configuration...
!! IOS XR Configuration 5.3.3
interface GigabitEthernet0/0/0/3
 description "link to RZN-CE4-SW3"
!
end

В данном коммите был добавлен дескрипшен на интерфейс GigabitEthernet0/0/0/3. В выводе команды show configuration rollback changes to 1000000035 показано, что этот дескрипшен будет удален и мы откатимся на конфигурацию, которая была добавлена коммитом 1000000034. Да, это немного отличается от JunOS-кого коммита. В JunOS мы прыгаем на указанную нами конфигурацию, а вот на IOS XR при использовании указанной команды мы прыгаем на конфигурацию, который была до применения указанного коммита, отменяя и изменения указанного в команде коммита. Обращаю внимание, что в версиях до 5.3.Х присутствует только такая команда.

При использовании команды с ключевым словом to-exclude, работы команды будет похожа на ролбэк в JunOS — будет выполнен откат на конфигурацию, которая была применена в указанном коммите:

RP/0/0/CPU0:RZN-PE4#show configuration rollback changes to-exclude 1000000035
Sun Dec 11 17:37:17.183 UTC
Building configuration...
!! IOS XR Configuration 5.3.3
interface GigabitEthernet0/0/0/4
 no description "link to RZN-CE4-SW4"
!
interface GigabitEthernet0/0/0/5
 no description "link to RZN-CE4-SW5"
!
end

Если сравнить с выводом, который был представлен при разборе команды с ключевым словом to, вы увидите различия — те изменения, которые были внесены при выполнении коммита 1000000035 не отменяются. Лично мне этот способ больше по душе, но, как я написал ранее, доступна данная команда только с версии 5.3.х.
Примечание: команда show configuration commit changes тоже может показать все изменения, которые вносились начиная от текущей конфигурации до указанного коммита (беря во внимание все промежуточные изменения конфигураций). Для этого надо использовать ключевое слово since и указать ID коммита или ключевым словом last и указать порядковый номер коммита:
RP/0/0/CPU0:RZN-PE4#sh configuration commit changes 1000000035
Sun Dec 11 18:01:33.533 UTC
Building configuration...
!! IOS XR Configuration 5.3.3
interface GigabitEthernet0/0/0/3
 description "link to RZN-CE4-SW3"
!
end

RP/0/0/CPU0:RZN-PE4#sh configuration commit changes since 1000000035
Sun Dec 11 18:01:38.212 UTC
Building configuration...
!! IOS XR Configuration 5.3.3
interface GigabitEthernet0/0/0/3
 description "link to RZN-CE4-SW3"
!
interface GigabitEthernet0/0/0/4
 description "link to RZN-CE4-SW4"
!
interface GigabitEthernet0/0/0/5
 description "link to RZN-CE4-SW5"
!
end

Но повторюсь, не забывайте, что данная команда показывает все, что добавлено в конфигурацию начиная от указанного коммита и заканчивая текущим, и своим ролбэком вы все эти изменения откатите!

После JunOS немного сложно понять первый вариант ролбэка. Но двигаемся дальше.

В отличии от JunOS, Cisco при ролбэке не просто загружает конфигурацию, а сразу ее применяет, даже не спрашивая администратора. Это очень существенное отличие, особенно после JunOS, который загружает конфигурацию, дает ее отредактировать (если надо), проверить и закоммитить. Но не все так плохо, IOS XR тоже умеет загружать конфиг без автоматического коммита, но об этом чуть позже.

Посмотреть, что будет менять в конфигурации при ролбэке помимо указанных выше команд можно и другим способом, который придется по душе любителям JunOS. Надо воспользоваться указанными ранее командами, но с ключевым словом diff. Вот пример вывода конфигурационных изменений в обычной форме:

RP/0/0/CPU0:RZN-PE4#show configuration rollback changes to 1000000025 
Sun Dec 11 17:42:44.450 UTC
Building configuration...
!! IOS XR Configuration 5.3.3
interface GigabitEthernet0/0/0/1
 shutdown
!
interface GigabitEthernet0/0/0/1.777 l2transport
!
interface GigabitEthernet0/0/0/2
 no description "link to RZN-CE4-SW2"
!
interface GigabitEthernet0/0/0/3
 no description "link to RZN-CE4-SW3"
!
interface GigabitEthernet0/0/0/4
 no description "link to RZN-CE4-SW4"
!
interface GigabitEthernet0/0/0/5
 no description "link to RZN-CE4-SW5"
!
no interface BVI777
interface BVI777
 ipv4 address 10.0.0.254 255.255.255.0
 no mac-address 200.0.4777
 mac-address 200.0.4777
!
router bgp 6262
 vrf VRF_EVPN
  no address-family ipv4 unicast
 !
!
evpn
!
end

А вот с использованием ключевого слова diff. Думаю, что вывод ниже читается проще, так как указано что добавляется, а что удаляется из конфигурации:
RP/0/0/CPU0:RZN-PE4#show configuration rollback changes to 1000000025 diff 
Sun Dec 11 17:42:50.580 UTC
Building configuration...
!! IOS XR Configuration 5.3.3
#  interface GigabitEthernet0/0/0/1
+   shutdown
+  !
#  interface GigabitEthernet0/0/0/1.777 l2transport
#  !
-  interface GigabitEthernet0/0/0/2
-   description "link to RZN-CE4-SW2"
-  !
-  interface GigabitEthernet0/0/0/3
-   description "link to RZN-CE4-SW3"
-  !
-  interface GigabitEthernet0/0/0/4
-   description "link to RZN-CE4-SW4"
-  !
-  interface GigabitEthernet0/0/0/5
-   description "link to RZN-CE4-SW5"
-  !
-  interface BVI777
+  interface BVI777
-   vrf VRF_EVPN
-   ipv4 address 10.0.0.254 255.255.255.0
+   ipv4 address 10.0.0.254 255.255.255.0
-   mac-address 200.0.4777
+   mac-address 200.0.4777
+  !
#  router bgp 6262
#   vrf VRF_EVPN
-    address-family ipv4 unicast
-     label mode per-vrf
-     redistribute connected
-     redistribute static
-    !
-   !
-  !
#  evpn
#  !
end

Правда выводятся конфигурационные изменения несколько странно, к примеру вот эти строки ни к чему:
-   ipv4 address 10.0.0.254 255.255.255.0
+   ipv4 address 10.0.0.254 255.255.255.0
-   mac-address 200.0.4777
+   mac-address 200.0.4777

Зачем это сделано — мне не ясно. Но приходится с этим мириться.

Теперь рассмотрим еще одну очень полезную функцию — это загрузка конфигурации без ее автоматического коммита. Это делается уже из конфигурационного режима. Тут все действия такие же как и описано выше и действуют те же правила (to и to-exclude), но конфигурация не коммитится автоматом. Рассмотрим пример:

Если мы сделаем ролбэк, то удалится вот такая часть конфигурации:

RP/0/0/CPU0:RZN-PE4#show configuration rollback changes to 1000000035
Sun Dec 11 17:50:53.187 UTC
Building configuration...
!! IOS XR Configuration 5.3.3
interface GigabitEthernet0/0/0/3
 no description "link to RZN-CE4-SW3"
!
interface GigabitEthernet0/0/0/4
 no description "link to RZN-CE4-SW4"
!
interface GigabitEthernet0/0/0/5
 no description "link to RZN-CE4-SW5"
!
end

Заходим в режим конфигурации и загружаем изменения:
RP/0/0/CPU0:RZN-PE4(config)#load rollback changes to 1000000035
Building configuration...
Loading.
254 bytes parsed in 1 sec (249)bytes/sec

Примечание: в выводе указано ключевое слово to, поэтому загружаются не только изменения, примененные в указанном коммите, но и все промежуточные коммиты. Если бы команда была бы без to: load rollback changes 1000000035, то загрузились бы только изменения, которые были сделаны при данном коммите, а с ключевым словом to-exclude загрузятся все изменения до коммита 1000000035, не включая изменения, примененные в самом коммите 1000000035.

При простом ролбэке конфигурация автоматически бы закоммитилась и у нас бы были удалены дескрипшены с трех интерфейсов. В нашем случае все дескрипшены на месте:
RP/0/0/CPU0:RZN-PE4(config)#do show int description | i 0/0/0/[3-5]
Sun Dec 11 17:49:31.632 UTC
Gi0/0/0/3          admin-down  admin-down  "link to RZN-CE4-SW3"
Gi0/0/0/4          admin-down  admin-down  "link to RZN-CE4-SW4"
Gi0/0/0/5          admin-down  admin-down  "link to RZN-CE4-SW5"

А вот если посмотреть конфигурацию, то мы видим, что изменения загружены, но не применены — можете их изменять (хотя это не так уж и просто, ибо часть конфига будет удалена — как видите вместо дескрипшена указана команда no description) и коммитить:
RP/0/0/CPU0:RZN-PE4(config)#show 
Sun Dec 11 17:49:33.962 UTC
Building configuration...
!! IOS XR Configuration 5.3.3
interface GigabitEthernet0/0/0/3
 no description
!
interface GigabitEthernet0/0/0/4
 no description
!
interface GigabitEthernet0/0/0/5
 no description
!
end

Если передумали коммитить, то проще всего использовать следующую команду:
RP/0/0/CPU0:RZN-PE4(config)#abort 
RP/0/0/CPU0:RZN-PE4#

Вас просто выкинет из режима конфигурации и все незакоммиченные изменения будут удалены. Если ввести end или exit, то Cisco спросит, что вы хотите сделать с незакомиченной конфигурацией:
RP/0/0/CPU0:RZN-PE-4(config)#end                                 
Uncommitted changes found, commit them before exiting(yes/no/cancel)? [cancel]:n
RP/0/0/CPU0:RZN-PE-4#

RP/0/0/CPU0:RZN-PE-4(config)#exit  
Uncommitted changes found, commit them before exiting(yes/no/cancel)? [cancel]:n
RP/0/0/CPU0:RZN-PE-4#

К одной из очень полезных функций можно причислить добавление метки к коммиту или ролбэку:
RP/0/0/CPU0:RZN-PE-4#rollback configuration to 1000000003 label bormoglotx

RP/0/0/CPU0:RZN-PE-4#show configuration commit list 
Sun Dec 11 18:42:50.333 UTC
SNo. Label/ID              User      Line                Client      Time Stamp
~~~~ ~~~~~~~~              ~~~~      ~~~~                ~~~~~~      ~~~~~~~~~~
1    bormoglotx            bormoglot con0_0_CPU0         Rollback    Sun Dec 11 18:42:40 2016
2    1000000004            bormoglot con0_0_CPU0         Rollback    Sun Dec 11 18:33:34 2016
3    1000000003            bormoglot con0_0_CPU0         CLI         Sun Dec 11 18:31:38 2016
4    1000000002            bormoglot con0_0_CPU0         CLI         Sun Dec 11 18:31:25 2016
5    1000000001            bormoglot con0_0_CPU0         CLI         Sun Dec 11 18:30:57 2016

Теперь вместо ID указано то, что вы напишите.
Примечание: сам же ID все равно назначается и указывается или в детальном выводе или при выборе ID коммита:
RP/0/0/CPU0:RZN-PE-4#show configuration rollback changes ?
  bormoglotx    1000000005
  bormoglotx-1  1000000006

На мой взгляд удобно. Две одинаковых метки указать не получится, получите вот такую ошибку:
RP/0/0/CPU0:RZN-PE-4#rollback configuration to 1000000004 label bormoglotx
Sun Dec 11 18:47:24.214 UTC

Loading Rollback Changes.
Loaded Rollback Changes in 1 sec 
Committing.
Rollback operation failed due to -
'CfgMgr' detected the 'warning' condition 'The specified label already exists in commit database.'
Running configuration has not been modified.

Еще одной полезной командой будет commit show-error, которая сразу указывает на ошибку (как это делает JunOS). Например коммит, который приведет к ошибке:
RP/0/0/CPU0:RZN-PE-4(config)#commit 
Sun Dec 11 18:58:40.048 UTC

% Failed to commit one or more configuration items during a pseudo-atomic operation. All changes made have been reverted. Please issue 'show configuration failed [inheritance]' from this session to view the errors

Теперь нам надо дать команду show configuration failed что бы увидеть проблему в конфиге. Но можно сразу дать команду commit show-error и если конфиг Циске не понравится, то в консоль сразу вывалится указание на ошибку:
RP/0/0/CPU0:RZN-PE-4(config)#commit show-error 
Sun Dec 11 18:59:44.254 UTC

% Failed to commit one or more configuration  items during a pseudo-atomic operation. All changes made have been reverted.
 !! SEMANTIC ERRORS: This configuration was rejected by 
!! the system due to semantic errors. The individual 
!! errors with each failed configuration command can be 
!! found below.


interface BVI777
 vrf VRF-TEST
!!% 'RSI' detected the 'fatal' condition 'The interface's numbered and unnumbered IPv4/IPv6 addresses must be removed prior to changing or deleting the VRF'
!
end

RP/0/0/CPU0:RZN-PE-4(config)#

В выводе сразу показан кусок конфига с ошибкой.

Так же хотел обратить внимание на функцию commit commit best-effort. Данное ключевое слово при коммите применит все строки, которые верны, а неверные будут проигнорированы. Возможно кому то данная функция будет нужна. Лично я ни разу ей не пользовался.

При необходимости весь коммит лист можно очистить (например при свопе или переиспользовании оборудования в качестве нового узла). Для этого нужно воспользоваться следующей командой:

RP/0/0/CPU0:RZN-PE-4#clear configuration commits oldest 43
Sun Dec 11 18:26:58.078 UTC
Deleting 43 rollback points '1000000001' to '1000000043'
48 KB of disk space will be freed. Continue with deletion?[confirm]
RP/0/0/CPU0:RZN-PE-4#show configuration commit list 
Sun Dec 11 18:27:18.977 UTC
The commit database is empty.

Правда информация о всех коммитах все равно сохранится, правда в другом месте:
RP/0/0/CPU0:RZN-PE-4#show configuration history        
Sun Dec 11 22:15:04.042 UTC
Sno.  Event      Info                           Time Stamp
~~~~  ~~~~~      ~~~~                           ~~~~~~~~~~
1     startup    configuration applied          Sun Dec 11 07:00:27 2016
2     commit     id 1000000001                  Sun Dec 11 07:01:28 2016
3     commit     id 1000000002                  Sun Dec 11 07:07:19 2016
4     commit     id 1000000003                  Sun Dec 11 07:17:26 2016

Но на указанные в данном выводе ID нельзя ориентироваться, так как при сбросе нумерация начинается сначала, для примера, после 43 идет снова 1:
RP/0/0/CPU0:RZN-PE-4#show configuration history | b ^52
Sun Dec 11 22:16:57.924 UTC
52    commit     id 1000000043                  Sun Dec 11 18:24:28 2016
53    commit     id 1000000001                  Sun Dec 11 18:28:53 2016
54    commit     id 1000000001                  Sun Dec 11 18:30:57 2016

Ну и не стоит забывать о такой важной и полезной команде, как commit confirmed, может существенно упростить жизнь и сберечь кучу нервов. Думаю, что представлять ее нет смысла.

В заключении хотел описать грабли, на которые я однажды наступил. Надо быть внимательным с командой rollback, если вы вместо rollback configuration to 1000000020 укажите rollback configuration 1000000020, то изменения в текущей конфигурации ограничатся теми изменениями, которые были произведены в указанном вами commit ID. Продемонстрирую это на примере.

Я делаю последовательно три коммита, добавляя по одному дескрипшену. Первый коммит:

RP/0/0/CPU0:RZN-PE-4(config)#interface gigabitEthernet 0/0/0/3 description 111111
RP/0/0/CPU0:RZN-PE-4(config)#commit comment add 11111
Tue Dec 13 08:21:15.328 UTC
RP/0/0/CPU0:RZN-PE-4(config)#

Второй коммит:
RP/0/0/CPU0:RZN-PE-4(config)#interface gigabitEthernet 0/0/0/4 description 22222
RP/0/0/CPU0:RZN-PE-4(config)#commit comment add 22222
Tue Dec 13 08:21:33.627 UTC
RP/0/0/CPU0:RZN-PE-4(config)#

Третий коммит:
RP/0/0/CPU0:RZN-PE-4(config)#interface gigabitEthernet 0/0/0/5 description 33333
RP/0/0/CPU0:RZN-PE-4(config)#commit comment add 33333
Tue Dec 13 08:21:54.856 UTC
RP/0/0/CPU0:RZN-PE-4(config)#

Смотрим ID наших коммитов:
RP/0/0/CPU0:RZN-PE-4#show configuration commit list 5
Tue Dec 13 08:22:04.915 UTC
SNo. Label/ID              User      Line                Client      Time Stamp
~~~~ ~~~~~~~~              ~~~~      ~~~~                ~~~~~~      ~~~~~~~~~~
1    1000000022            bormoglot con0_0_CPU0         CLI         Tue Dec 13 08:21:54 2016
2    1000000021            bormoglot con0_0_CPU0         CLI         Tue Dec 13 08:21:33 2016
3    1000000020            bormoglot con0_0_CPU0         CLI         Tue Dec 13 08:21:15 2016
4    1000000019            bormoglot con0_0_CPU0         Rollback    Tue Dec 13 08:20:20 2016
5    1000000018            bormoglot con0_0_CPU0         CLI         Tue Dec 13 08:16:26 2016

Теперь посмотрим, какие изменения вносились в коммиты (действительно ли это наши коммиты). Первый ролбэк:
RP/0/0/CPU0:RZN-PE-4#show configuration rollback changes 1000000022
Tue Dec 13 08:22:23.474 UTC
Building configuration...
!! IOS XR Configuration 5.3.3
interface GigabitEthernet0/0/0/5
 no description 33333
!
end

Второй ролбэк:
RP/0/0/CPU0:RZN-PE-4#show configuration rollback changes 1000000021
Tue Dec 13 08:22:27.184 UTC
Building configuration...
!! IOS XR Configuration 5.3.3
interface GigabitEthernet0/0/0/4
 no description 22222
!
end

И третий ролбэк:
RP/0/0/CPU0:RZN-PE-4#show configuration rollback changes 1000000020
Tue Dec 13 08:22:30.373 UTC
Building configuration...
!! IOS XR Configuration 5.3.3
interface GigabitEthernet0/0/0/3
 no description 111111
!
end

Предположим, что мне надо откатить все изменения и вернуться на конфигурацию, которая была при коммите 1000000019. Смотрим, что изменится при ролбэке:
RP/0/0/CPU0:RZN-PE-4#show configuration rollback changes to 1000000020
Tue Dec 13 08:22:34.553 UTC
Building configuration...
!! IOS XR Configuration 5.3.3
interface GigabitEthernet0/0/0/3
 no description 111111
!
interface GigabitEthernet0/0/0/4
 no description 22222
!
interface GigabitEthernet0/0/0/5
 no description 33333
!
end

А теперь делая ролбэк, допускаем ошибку, пропуская ключевое слово to:
RP/0/0/CPU0:RZN-PE-4#rollback configuration 1000000020
Tue Dec 13 08:22:49.342 UTC

Loading Rollback Changes.
Loaded Rollback Changes in 1 sec
Committing.
2 items committed in 1 sec (1)items/sec
Updating.
Updated Commit database in 1 sec
Configuration successfully rolled back commit '1000000020'.

Конфиг откатился, вроде все отлично. Но результат не тот, который мы ожидали. Смотрим конфиг:
RP/0/0/CPU0:RZN-PE-4#show running-config
Tue Dec 13 08:22:56.432 UTC
Building configuration...
!! IOS XR Configuration 5.3.3
!! Last configuration change at Tue Dec 13 08:22:50 2016 by bormoglotx
!
hostname RZN-PE-4
interface MgmtEth0/0/CPU0/0
 shutdown
!
interface GigabitEthernet0/0/0/0
 description link to core
!
interface GigabitEthernet0/0/0/1
 description link to SW1
!
interface GigabitEthernet0/0/0/2
 shutdown
!
interface GigabitEthernet0/0/0/3
 shutdown
!
interface GigabitEthernet0/0/0/4
 description 22222
 shutdown
!
interface GigabitEthernet0/0/0/5
 description 33333
 shutdown
!
#остальная часть конфига удалена для сокращения статьи

Удалился только дескрипшен с интерфейса interface GigabitEthernet0/0/0/3, который я навесил, делая коммит 1000000020, а изменения, которые были в коммитах 1000000021 и 1000000022 не отменились. Так что не пропускайте to или to-exclude при откате конфига, больше чем на 1 коммит.

Надеюсь описанное выше будет кому то полезно. Спасибо за внимание.

Комментарии (0)

© Habrahabr.ru