DevOps/Programmability2018.03.30 13:46
 

안녕하세요.

이번 포스팅은 현재 제가 운영진으로 활동 중인 [네트워크 전문가 따라잡기] 커뮤니티의 

'제 24회 네트워크 전문가 따라잡기 "N.EX.T" (정기기술세미나)' 에서 진행한 세션의 발표 자료입니다. 

발표 자료는 첨부하였으며, 슬라이드를 바로 보실 수 있게 사진으로도 첨부합니다.

다만, 첨부 가능한 사진이 한계가 있어서 슬라이드는 2개의 포스팅으로 나눠서 합니다. (2번째 포스팅입니다.)

[첫번째 포스팅]

 

 

Posted by 네떡지기
DevOps/Programmability2018.03.30 13:43

안녕하세요.

이번 포스팅은 현재 제가 운영진으로 활동 중인 [네트워크 전문가 따라잡기] 커뮤니티의 

'제 24회 네트워크 전문가 따라잡기 "N.EX.T" (정기기술세미나)' 에서 진행한 세션의 발표 자료입니다. 

Session2.네트워크엔지니어를위한Python101.pdf

발표 자료는 첨부하였으며, 슬라이드를 바로 보실 수 있게 사진으로도 첨부합니다.

다만, 첨부 가능한 사진이 한계가 있어서 슬라이드는 2개의 포스팅으로 나눠서 합니다.

[두번째 포스팅]

 

Posted by 네떡지기
DevOps/Programmability2018.03.30 13:30

안녕하세요.

이번 포스팅은 현재 제가 운영진으로 활동 중인 [네트워크 전문가 따라잡기] 커뮤니티의 

'제 24회 네트워크 전문가 따라잡기 "N.EX.T" (정기기술세미나)' 에서 제가 진행한 세션과 관련된 내용입니다.

이번 행사에서는  [예제로 보는 '네트워크 엔지니어를 위한 Python 101'] 이라는 주제로 세션을 하였고

세션 시간에 사용된 간단한 예제에 대해서 코드를 공유합니다.

코드에 대한 내용은 세션 시간에 다루었기 때문에 자세한 설명은 생략합니다.

그리고 본 예제에 사용된 코드는 완성형 코드는 아닙니다.

우선 대표적인 예가 예외처리가 전혀 없습니다. (기본 라이브러리에서 제공되는 부분 제외)

아래의 코드들은 처음 접근을 어렵게 생각하시는 분들을 위해서 최대한 쉽게 접근할 수 있을 정도로 짧게 짧게 만들었으며

이후에 아래의 코드들을 조금씩 변형해가면서 본인만의 코드를 만들어보면 좋을 것 같습니다.

 

예제 1) 장비 접속 및 기본 명령어 수행 및 실행

from netmiko import ConnectHandler

arista= {
    'device_type': 'arista_eos',
    'ip':   'device',
    'username': 'admin',
    'password': 'admin',
    'port' : 2222,          # 기본 값이 22포트를 사용할 경우에는 사용하지 않아도 무방


net_connect = ConnectHandler(**arista)

output = net_connect.send_command('show int desc')
print(output)

 ○ 세션 시에 IP를 숨기기 위해서 'device'라는 이름으로 사용을 하였으며, 실제로는 해당 위치에 IP가 들어가면 됩니다

   단,IP 값은 문자열이기 때문에 ' ' 혹은 " "를 사용해야 합니다.

   문자열이기 때문에 도메인 값으로 대체해도 무방합니다

 

예제 2-1) 장비 접속 및 기본 명령어 수행 및 실행

from netmiko import ConnectHandler
import device

print("Connecting....")
nwnode = ConnectHandler(**device.ARI)
shver = nwnode.send_command("show ver")
print(shver)

예제 2-2) 장비 접속 및 기본 명령어 수행 및 실행  (device.py)

ariuser='admin'
aripwd='admin'
dv='arista_eos'

ARI={'device_type':dv,'verbose':False,'username':ariuser,'password':aripwd,'ip':'device','port':2222} 

 ○ 장비 인벤토리 정보를 기능을 수행할 코드와 별도로 분리한 예제입니다.

    예제 1과 동일하지만, 단순히 인벤토리를 분리한 내용입니다

    인벤토리 정보는 py코드를 사용할 수도 있지만, 별도의 파일로 관리해서 관리도 가능할 수 있습니다.

 

예제 3-1) 장비 인터페이스 상태 출력  

shstatus ='''
Port    Name               Status       Vlan       Duplex Speed Type
Fa1/0   ZIGI-SVR0          notconnect   1            auto    auto 10/100BaseTX
Fa1/1   ZIGI-SVR1          notconnect   1            auto    auto 10/100BaseTX
Fa1/2   ZIGI-SVR2          notconnect   1            auto    auto 10/100BaseTX
Fa1/3   ZIGI-SVR3          connected   1            auto    auto 10/100BaseTX
Fa1/4   ZIGI-SVR4          notconnect   1            auto    auto 10/100BaseTX
Fa1/5   ZIGI-SVR5          notconnect   1            auto    auto 10/100BaseTX
Fa1/6   ZIGI-SVR6          connected   1            auto    auto 10/100BaseTX
Fa1/7   ZIGI-SVR7          notconnect   1            auto    auto 10/100BaseTX
Fa1/8   ZIGI-SVR8          notconnect   1            auto    auto 10/100BaseTX
Fa1/9   ZIGI-SVR9          notconnect   1            auto    auto 10/100BaseTX
Fa1/10  ZIGI-SVR10         connected   1            auto    auto 10/100BaseTX
Fa1/11  ZIGI-SVR11         notconnect   1            auto    auto 10/100BaseTX
Fa1/12  ZIGI-SVR12         notconnect   1            auto    auto 10/100BaseTX
Fa1/13  ZIGI-SVR13         notconnect   1            auto    auto 10/100BaseTX
Fa1/14  ZIGI-SVR14         notconnect   1            auto    auto 10/100BaseTX
Fa1/15  ZIGI-SVR15         notconnect   1            auto    auto 10/100BaseTX

'''

status = shstatus.split('\n')

for op in status:
    print(op)
 

○ 장비 인터페이스 정보를 출력하는 예제입니다.  

   이번 예제는 실제 장비를 접속한 것이 아니라, 장비에 접속하여 인터페이스 정보 가져온 내용을 출력하는 부분입니다.

   장비 정보를 가져오게 되면, 하나의 길 문자열로 되어 있는 데 이를 가공하는 방법에 대한 예제이며

   이 예제에서는 결과 값을 각 Line 단위로 쪼개는 함수(split)를 사용하여 정보 Line 단위로 저장하고

   저장된 값을 하나씩 가져와서 출력합니다.

 

예제 3-2) 장비 인터페이스 상태 출력 

shstatus ='''
Port    Name               Status       Vlan       Duplex Speed Type
Fa1/0   ZIGI-SVR0          notconnect   1            auto    auto 10/100BaseTX
Fa1/1   ZIGI-SVR1          notconnect   1            auto    auto 10/100BaseTX
Fa1/2   ZIGI-SVR2          notconnect   1            auto    auto 10/100BaseTX
Fa1/3   ZIGI-SVR3          connected   1            auto    auto 10/100BaseTX
Fa1/4   ZIGI-SVR4          notconnect   1            auto    auto 10/100BaseTX
Fa1/5   ZIGI-SVR5          notconnect   1            auto    auto 10/100BaseTX
Fa1/6   ZIGI-SVR6          connected   1            auto    auto 10/100BaseTX
Fa1/7   ZIGI-SVR7          notconnect   1            auto    auto 10/100BaseTX
Fa1/8   ZIGI-SVR8          notconnect   1            auto    auto 10/100BaseTX
Fa1/9   ZIGI-SVR9          notconnect   1            auto    auto 10/100BaseTX
Fa1/10  ZIGI-SVR10         connected   1            auto    auto 10/100BaseTX
Fa1/11  ZIGI-SVR11         notconnect   1            auto    auto 10/100BaseTX
Fa1/12  ZIGI-SVR12         notconnect   1            auto    auto 10/100BaseTX
Fa1/13  ZIGI-SVR13         notconnect   1            auto    auto 10/100BaseTX
Fa1/14  ZIGI-SVR14         notconnect   1            auto    auto 10/100BaseTX
Fa1/15  ZIGI-SVR15         notconnect   1            auto    auto 10/100BaseTX

'''

status = shstatus.split('\n')

for op in status:
    if(op.find('connected') > 0):
        print(op.split()[0]) 

○ 장비 인터페이스 정보를 출력하는 예제의 변형입니다.

    각 Line별로 가져온 값에서 현재 연결된 인터페이스 정보만을 출력하기 위해서 'connected'라는 값을 찾아서

    'connected'된 인터페이스만을 출력합니다.

 

 

 

예제 4-1) 장비 Uptime 출력 

shverinc = "zigi-r1 uptime is 2 hours, 27 minutes"
uptime = shverinc.split(" uptime is ")
print(uptime)

 

예제 4-2) 장비 Uptime 출력 

shverinc = "zigi-r1 uptime is 2 hours, 27 minutes"

uptime = shverinc.split(" uptime is ")
print("Device Host : {0}\t\tUptime : {1}".format(uptime[0],uptime[1]))

 ○ 장비 Uptime을 출력하는 예제입니다.

    출력된 값은 기본적으로 가져온 값을 어느 정도 수준까지 가공해서 사용할 것인지에 대한 부분입니다.

 

예제 5) 장비 Mac-address 정보 출력

shmac = '''VDX# show mac-address-table
VlanId   Mac-address       Type     State        Ports
41       0000.0000.fe00    Dynamic  Active       Te 1/5/1
41       0000.0000.fe01    Dynamic  Remote       Te 2/5/1
41       001c.7f63.950f    Dynamic  Active       Te 1/5/1
41       02e0.52b2.f50d    System   Active       XX 1/X/X
41       c4f5.7c18.3962    System   Remote       XX 2/X/X
43       0000.0000.fe00    Dynamic  Active       Po 3
43       0000.0000.fe01    Dynamic  Active       Po 4
43       001c.7f63.7efc    Dynamic  Active       Po 4
43       001c.7f69.7b76    Dynamic  Active       Po 3
43       02e0.52c3.940e    System   Active       XX 1/X/X
43       c4f5.7c18.3962    System   Remote       XX 2/X/X
701      0050.5686.049e    Dynamic  Remote       Te 15/0/14
701      0050.5686.09d9    Dynamic  Remote       Te 15/0/19
701      0050.5686.123f    Dynamic  Remote       Te 15/0/4
701      0050.5686.1384    Dynamic  Remote       Te 15/0/15
701      0050.5686.1647    Dynamic  Remote       Te 15/0/18
701      0050.5686.44ff    Dynamic  Remote       Te 15/0/6
701      0050.5686.4614    Dynamic  Remote       Te 15/0/9
701      0050.5686.6265    Dynamic  Remote       Te 15/0/8
701      0050.5686.7078    Dynamic  Remote       Te 15/0/3'''

mactables = shmac.split('\n')
macinfos = []
for mactb in mactables:
    if((mactb.lower().find(' te'))>0):
        macinfos.append(mactb)

for macinfo in macinfos:
    macinfo=macinfo.split()
    print("MAC : {0} \t Interface : Te {1}".format(macinfo[1],macinfo[5]))

○ 장비의 Local Mac Address 정보를 출력하는 내용입니다.

   

 

예제 6) 파일 입출력해보기 

zigifile = open("zigi.txt",'w')
zigifile.write("zigispace.net")
zigifile.close()

zigifile2 = open('zigi.txt','r')
zigi = zigifile2.read()
zigifile2.close()
print (zigi)

○ 초간단 파일 입출력 예제입니다.

예제 7) 장비 정보 가져온 후, 파일로 만들기

from netmiko import ConnectHandler
import device

print("Connecting....")
nwnode = ConnectHandler(**device.ARI)
shver = nwnode.send_command("show ver")

zigifile = open('zigi.txt','w')
zigifile.write(shver)
zigifile.close() 

○ 장비의 정보를 가져와서, 해당 값을 파일로 만드는 예제입니다.

Posted by 네떡지기
분류없음2018.03.21 17:39

정규 표현식

정규 표현식(正規表現式, 영어: regular expression, 간단히 regexp[1] 또는 regex, rational expression)[2][3] 또는 정규식(正規式) 특정한 규칙을 가진 문자열의 집합을 표현하는 사용하는 형식 언어이다. 정규 표현식은 많은 텍스트 편집기프로그래밍 언어에서 문자열의 검색과 치환을 위해 지원. [wiki]

 

 

패턴

정규 표현식이라는 문구는 일치하는 텍스트가 준수해야 하는 "패턴"을 표현하기 위해 특정한 표준의 텍스트 신택스를 의미하기 위해 사용된다. 정규 표현식의 각 문자(즉, 패턴을 기술하는 문자열 안의 각 문자)는 메타문자(특별한 의미로)로 이해되거나 정규 문자('문자 그대로', 즉 '리터럴'의 의미로)로 이해된다. [wiki]

  

. ^ $ * + ? { } [ ] \ | ( )


 

 

'|' (or)

패턴으로 등록된 항목에 대해서 or 조건을 적용

    - ) zigi|space 'zigi' 혹은 'space' 조건에 대해서 매치

 

'( )' (scope, priority)

 ㆍ여러 개의 정규 표현식을 하나의 표현식으로 구성

 패턴의 적용 범위와 패턴에서 사용되는 연산자의 우선순위

    - ) AB(C|D)EF ABCEF ABDEF 대해서 매치

 

'?'  (0 or 1)

  1 매치가 되거나 매치되지 않는 경우

    - zig?i zigi (1 매치) 혹은 zig (0 매치) zigii(2 매치로 false)

 

'*'

0 이상의 매치

    - zig*i zig 부터 zigi , zigii, zigiiii, zigiiiiii 모두 매치

 

'+'

 1 이상의 매치

    - zig+i zigi , zigii, zigiiii, zigiiiiii 모두 매치되지만, zig 매치되지 않음

 

'{n}'

  n 만큼 매치. 정확하게 n번만큼만 매치.

 

'{min,}'

  min 이상만큼 매치

 

'{min,max}'

  min ~ max만큼 매치

 

문자 클래스 [ ]

  [ ] 사이의 문자들과 매치

 ㆍ [ ] 사이의 '-' 사용하면 해당 문자의 범위 지점

    - ) [ a1A ] 선언 시에, 'a', '1', 'A' 중의 한 개의 문자와 매치

    - ) [ a-c ] 선언 시에, 'a', 'b', 'c' 중의 개의 문자와 매치

 ㆍ [ ] 사이의 ^ 메타 문자는 not 의미를 갖음.

    - ) [^a-z] 소문자는 제외하고 매치

 

 

주요 문자 클래스 [ ]

  자주 사용되는 문자 클래스는 사전 정의된 별도 표기법으로 대체 가능

   - \d : 숫자 [0-9]

   - \D : 숫자가 아닌 [^0-9]

   - \s : 공백문자(whitespace) 문자 [ \t\r\n\v\f]

   - \S : 공백문자(whitespace) 문자가 아닌

   - \w : 영숫자 [a-zA-Z0-9]

   - \W : 영수자가 아닌    ※ 대문자는 소문자에 '^' 사용하여 not 의미로 사용하는 것과 동일




.

메타문자 기능 설명
. 문자 1개의 문자와 일치한다. 단일행 모드에서는 새줄 문자를 제외한다.
[ ] 문자 클래스 "["과 "]" 사이의 문자 중 하나를 선택한다. "¦"를 여러 개 쓴 것과 같은 의미이다. 예를 들면 [abc]d는 ad, bd, cd를 뜻한다. 또한, "-" 기호와 함께 쓰면 범위를 지정할 수 있다. "[a-z]"는 a부터 z까지 중 하나, "[1-9]"는 1부터 9까지 중의 하나를 의미한다.
[^ ] 부정 문자 클래스 안의 문자를 제외한 나머지를 선택한다. 예를 들면 [^abc]d는 ad, bd, cd는 포함하지 않고 ed, fd 등을 포함한다. [^a-z]는 알파벳 소문자로 시작하지 않는 모든 문자를 의미한다.
^ 처음 문자열이나 행의 처음을 의미한다.
$ 문자열이나 행의 끝을 의미한다.
( ) 하위식 여러 식을 하나로 묶을 수 있다. "abc¦adc"와 "a(b¦d)c"는 같은 의미를 가진다.
\n 일치하는 n번째 패턴 일치하는 패턴들 중 n번째를 선택하며, 여기에서 n은 1에서 9 중 하나가 올 수 있다.
* 0회 이상 0개 이상의 문자를 포함한다. "a*b"는 "b", "ab", "aab", "aaab"를 포함한다.
{m, n} m회 이상 n회 이하 "a{1,3}b"는 "ab", "aab", "aaab"를 포함하지만, "b"나 "aaaab"는 포함하지 않는다. 


※ 참고

 - 위키피디아 (https://ko.wikipedia.org/wiki/%EC%A0%95%EA%B7%9C_%ED%91%9C%ED%98%84%EC%8B%9D)

 - 점프투파이썬 (https://wikidocs.net/4308)

Posted by 네떡지기
분류없음2018.03.20 05:47

HAProxy  설치하기

 

이번 포스팅은 HAProxy을 설치에 대해서 알아봅니다.

설치 환경은 Cent OS 7.3이며, HAProxy는 Stable 최신 버전인 1.8.4 입니다.

HAProxy를 설치하는 방법은 Yum Repo를 통한 설치와 직접 최신 소스를 이용한 설치 방법으로 가능합니다.

 

HAProxy 설치 : yum

yum install haproxy

yum을 이용하여 설치하는 경우에는 최신 버전이 적용되지 않음.

현재(2018년 3월 20일)기준 Yum Repo의 haproxy는 1.5.18 제공.

yum repo version 확인

[root@zigi-cent ~]# yum info haproxy
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * epel: ftp.riken.jp
Available Packages
Name        : haproxy
Arch        : x86_64
Version     : 1.5.18
Release     : 6.el7
Size        : 834 k
Repo        : base/7/x86_64

 

최신 버전의 HAProxy를 사용하고자 할 때에는  yum을 이용하지 않고 직접 최신 소스를 다운받아서 컴파일을 해서 설치 필요

이 경우에는 직접 컴파일을 통해서 설치하기 위한 필수 패키지가 사전에 설치되어 있어야 함.

사전 패키지 설치

yum install gcc pcre-static pre-devel

 

HAProxy 사이트에서 현재 최신 Stable 버전이 1.8.4를 다운로드

HAProxy 파일 받기

[root@zigi-cent ~]# wget https://www.haproxy.org/download/1.8/src/haproxy-1.8.4.tar.gz
--2018-03-19 20:05:17--  https://www.haproxy.org/download/1.8/src/haproxy-1.8.4.tar.gz
Resolving www.haproxy.org (www.haproxy.org)... 51.15.8.218
Connecting to www.haproxy.org (www.haproxy.org)|51.15.8.218|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 2049789 (2.0M) [application/x-tar]
Saving to: ‘haproxy-1.8.4.tar.gz’

100%[===========================================================================>] 2,049,789   1.03MB/s   in 1.9s

2018-03-19 20:05:21 (1.03 MB/s) - ‘haproxy-1.8.4.tar.gz’ saved [2049789/2049789]

 

다운로드 받은 haproxy 파일의 압축 해제

HAProxy 압축 풀기

tar xzvf haproxy.tar.gz

 

압축을 풀고 HAProxy를 수동으로 진행

HAProxy 설치

[root@zigi-cent haproxy-1.8.4]# make TARGET=linux2628
gcc -Iinclude -Iebtree -Wall  -O2 -g -fno-strict-aliasing -Wdeclaration-after-statement -fwrapv    -Wno-unused-label       -DCONFIG_HAP_LINUX_SPLICE -DTPROXY -DCONFIG_HAP_LINUX_TPROXY -DCONFIG_HAP_CRYPT -DENABLE_POLL -DENABLE_EPOLL -DUSE_CPU_AFFINITY -DASSUME_SPLICE_WORKS -DUSE_ACCEPT4 -DNETFILTER -DUSE_THREAD -DUSE_SYSCALL_FUTEX  -DCONFIG_HAPROXY_VERSION=\"1.8.4-1deb90d\" -DCONFIG_HAPROXY_DATE=\"2018/02/08\" -c -o src/ev_poll.o src/ev_poll.c
gcc -Iinclude -Iebtree -Wall  -O2 -g -fno-strict-aliasing -Wdeclaration-after-statement -fwrapv    -Wno-unused-label       -DCONFIG_HAP_LINUX_SPLICE -DTPROXY -DCONFIG_HAP_LINUX_TPROXY -DCONFIG_HAP_CRYPT -DENABLE_POLL -DENABLE_EPOLL -DUSE_CPU_AFFINITY -DASSUME_SPLICE_WORKS -DUSE_ACCEPT4 -DNETFILTER -DUSE_THREAD -DUSE_SYSCALL_FUTEX  -DCONFIG_HAPROXY_VERSION=\"1.8.4-1deb90d\" -DCONFIG_HAPROXY_DATE=\"2018/02/08\" -c -o src/ev_epoll.o src/ev_epoll.c
..후략..

 

[root@zigi-cent haproxy-1.8.4]# make install
install -d "/usr/local/sbin"
install haproxy  "/usr/local/sbin"
install -d "/usr/local/share/man"/man1
install -m 644 doc/haproxy.1 "/usr/local/share/man"/man1
install -d "/usr/local/doc/haproxy"
for x in configuration management architecture peers-v2.0 cookie-options lua WURFL-device-detection proxy-protocol linux-syn-cookies network-namespaces DeviceAtlas-device-detection 51Degrees-device-detection netscaler-client-ip-insertion-protocol peers close-options SPOE intro; do \
        install -m 644 doc/$x.txt "/usr/local/doc/haproxy" ; \
done

Target의 경우에는 설치하고자 하는 운영체제에 따라서 다르지만, 일반적으로 2628 옵션을 사용

2628 linux 커널 2.6.28 혹은 3.x, 그 이상의 버전에서 사용하는 옵션.

설치가 끝난 후, 설치된 haproxy 버전을 다음과 같이 확인하며 최신 1.8.4이 설치된 것을 확인 가능

HAProxy 버전 확인

[root@zigi-cent haproxy-1.8.4]# haproxy -v
HA-Proxy version 1.8.4-1deb90d 2018/02/08
Copyright 2000-2018 Willy Tarreau <willy@haproxy.org>

 

컴파일해서 설치한 경우에는 추가적으로 필요한 디렉토리와 통계 파일을 생성하는 다음의 작업 필요

필요 디렉토리 및 파일 생성

[root@zigi-cent haproxy-1.8.4]# mkdir -p /etc/haproxy
[root@zigi-cent haproxy-1.8.4]# mkdir -p /var/lib/haproxy
[root@zigi-cent haproxy-1.8.4]# touch /var/lib/haproxy/stats

HAProxy 명령 수행을 위한 심볼릭 링크 생성

필요 디렉토리 및 파일 생성

[root@zigi-cent sbin]# ln -s /usr/local/sbin/haproxy /usr/sbin/haproxy

HAProxy를 서비스로 등록

서비스 등록(권한 변경 포함)

[root@zigi-cent haproxy-1.8.4]# cp ~/haproxy-1.8.4/examples/haproxy.init /etc/init.d/haproxy
[root@zigi-cent haproxy-1.8.4]# chmod 755 /etc/init.d/haproxy
[root@zigi-cent haproxy-1.8.4]# systemctl daemon-reload

HAProxy 서비스 시작

HAProxy 서비스 기동

[root@zigi-cent sbin]# systemctl start haproxy

 

[root@zigi-cent sbin]# systemctl status haproxy.service
● haproxy.service - SYSV: HA-Proxy is a TCP/HTTP reverse proxy which is particularly suited for high availability environments.
   Loaded: loaded (/etc/rc.d/init.d/haproxy; bad; vendor preset: disabled)
   Active: active (running) since Mon 2018-03-19 20:42:49 UTC; 3min 38s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 8211 ExecStart=/etc/rc.d/init.d/haproxy start (code=exited, status=0/SUCCESS)
 Main PID: 8216 (haproxy)
   CGroup: /system.slice/haproxy.service
           └─8216 /usr/sbin/haproxy -D -f /etc/haproxy/haproxy.cfg -p /var/run/haproxy.pid

Mar 19 20:42:49 zigi-cent systemd[1]: Starting SYSV: HA-Proxy is a TCP/HTTP reverse proxy which is particularly suited for high availability environments....
Mar 19 20:42:49 zigi-cent haproxy[8215]: Proxy stats started.
Mar 19 20:42:49 zigi-cent haproxy[8211]: Starting haproxy: [WARNING] 077/204249 (8215) : parsing [/etc/haproxy/haproxy.cfg:28] : the 'clitimeout' direc... versions.
Mar 19 20:42:49 zigi-cent haproxy[8211]: [WARNING] 077/204249 (8215) : parsing [/etc/haproxy/haproxy.cfg:29] : the 'srvtimeout' directive is now deprec... versions.
Mar 19 20:42:49 zigi-cent haproxy[8211]: [WARNING] 077/204249 (8215) : parsing [/etc/haproxy/haproxy.cfg:30] : the 'contimeout' directive is now deprec... versions.
Mar 19 20:42:49 zigi-cent haproxy[8211]: [  OK  ]
Mar 19 20:42:49 zigi-cent systemd[1]: Started SYSV: HA-Proxy is a TCP/HTTP reverse proxy which is particularly suited for high availability environments..
Hint: Some lines were ellipsized, use -l to show in full.

 

Posted by 네떡지기
네트워크/L4 Swtich2018.03.13 16:25

F5 장비에서 CLI로 설정 확인 시에 화면에 표기해야 하는 Item이 많은 경우에는 다음과 같이 화면에 뜹니다.

 

  zigi@(zigi)(cfg-sync In Sync)(Active)(/Common)(tmos)# show running-config

  Display all 216 items? (y/n) 

item 수와 상관없이 전체 내용을 화면에 모두 표기하고 싶은 경우에는 다음과 같은 설정을 하면 됩니다.

  zigi@(zigi)(cfg-sync In Sync)(Active)(/Common)(tmos)# modify cli preference pager disabled display-threshold 0

  zigi@(zigi)(cfg-sync In Sync)(Active)(/Common)(tmos)# list cli preference
   cli preference {
      alias-path { /Common }
      display-threshold 0
      pager disabled
      prompt { host user status current-folder config-sync-status }
   }

이제 CLI에서 확인 시에 별도의 확인 과정 없이 전체 내용을 바로 확인할 수 있습니다.

 

 

Posted by 네떡지기

이번 포스팅은 ACI Bug Report 관련 내용입니다.

 

지난 포스팅(http://zigispace.net/957) 에 이어서, ACI OS Upgrade 중에 발생할 수 있는 Bug Report(CSCvb94260)입니다.

2.1미만의 버전에서 발생할 수 있다고 하기 때문에 2.1이상의 버전에서 더 상위 버전으로의 Upgrade에는 발생하지 않을 수 있습니다.

 

이 버그에 대한 증상은

 1. APIC 업그레이드 중에 먼저 진행된 APIC은 정상적으로 Upgrade가 완료되었으나, 이후에 업그레이드 되는 APIC의 상태가 75%에서 멈춰있게 됩니다.  이 경우 75%에서 멈춰있는 APIC에서 확인 할 때, 정상적으로 완료된 APIC의 정보가 기존 버전으로 표기

 

 2. 모든 APIC이 정상적으로 업그레이드가 되고, fully fit 상태까지 되었으나 각 장비에서 acidiag로 확인 시에는 local APIC에 대한 버전만 최신 버전이고 다른 APIC은 기존 버전으로 표기

 

상태를 확인해보면, APIC 2번기가 정상적으로 Upgrade된 상태에서 APIC 3번기가 Stuck이 걸려있을 때,

APIC 2번에서는 2번기 상태를 보면 정상적으로 Upgrade가 되어 있고

APIC 3번기에서 2번기를 상태를 보면, 기존 OS이고 time stamp도 정상적으로 업그레이드 된 시간보다 더 이후 시간으로 체크되어 있음.

 

apic2# acidiag avread | egrep "id=2.*version" | cut -d ' ' -f 7-10,20-21
appliance id=2 version=2.2(2k) lm(t):2(2017-07-25T11:24:01.244+10:00)

apic3# acidiag avread | egrep "id=2.*version" | cut -d ' ' -f 7-10,20-21
appliance id=2 version=2.0(2f) lm(t):2(2017-07-25T11:40:02.248+10:00)

 

2.1 이상에서는 해당 버그가 없기 때문에 2.1 미만의 버전에서만 발생합니다.

 

해당 버그가 발현될 경우에는

위의 예의 APIC 3에서 APIC 2의 정보를 정상적으로 가져오지 못한 상태가 되는 데,

APIC 2에서 "acidiag restart mgmt"를 통해서 APIC에 서비스를 재기동하면

APIC 3에서 APIC 2에 대한 정보가 업데이트 되면서, 정상적으로 Upgrade를 진행 할 수 있습니다.

 

 

 

Posted by 네떡지기

이번 포스팅은 ACI Bug Report 관련 내용입니다.

 

ACI OS Upgrade를 위해서 관리서버인 APIC을 먼저 OS Upgrade를 진행을 합니다.

APIC OS 업그레이드 과정 시, APIC의 재부팅을 하는 도중에 정상적으로 부팅을 하지 못하는 문제가 발생할 수 있습니다.

이 경우 장비에 Console을 붙여서 확인을 하면 다음과 같이 표기됨을 확인할 수 있습니다.

 

APIC 1 Console shows:
do_boot_cpu failed(-1) to wakeup CPU#2
do_boot_cpu failed(-1) to wakeup CPU#3
do_boot_cpu failed(-1) to wakeup CPU#4
do_boot_cpu failed(-1) to wakeup CPU#5
.
.
.
.
do_boot_cpu failed(-1) to wakeup CPU#23

 

 

관련하여 Bug Report(CSCvd84590:scale1-apic1: do_boot_cpu() failed at GRUB starting to boot the Kernel)가 있습니다.

 

해당 버그에 대해서 알려진 버전은 2.2(1.210a), 2.2(2i)이며,

fixed 버전은 3.1(1i), 3.1(0.154), 2.2(3.13)입니다.

 

실제 영향 받는 버전은 더 있을 것으로 보입니다.

 

해당 버그에 대한 조치 방법은 APIC 자체를 실제 전원까지 제거하여 Cold Reboot를 진행하시면 됩니다.

Posted by 네떡지기
네트워크/L4 Swtich2018.02.22 00:07

downStateFlush

서비스 또는 가상 서버가 Down 경우 기존 연결을 즉시 종료하도록 설정 (RST 발생)

  - downStateFlush (Default : Enabled)

  - Virtual Server 혹은 Service 설정

 

Down State Flush 활성화된 경우에 다음의 Connection 상태를 모두 정리(Session Table 삭제)

Connection Pending 서비스 (TCP handshake 정상적으로 완료되지 않은 상태)

ㆍ기존에 연결된 Connection (TCP handshake 완료된 상태)

Pending 요청 (HTTP 요청을 수신했으나 응답하지 않은 상태)

ㆍ진행 중인 요청(HTTP 요청을 수신하고 일정 응답을 받았지만, 전체 응답이 완료되지 않은 상태)

Surge Queue

 

서비스는 해당 서비스 Health 실패하게 되면 Down으로 되고, 가상 서버의 경우에는 가상 서버에 연결된 모든 서비스가 Down 되면 Down으로 됩니다.

 

가상 서버는 Down으로 체크 될때, 즉시 혹은 기존 서비스가 안전하게 종료될 있도록 허용하고 연결을 종료.

 

다음은 가상서버와 가상 서비스에서 downStateFlush 설정에 따른 연결 상태를 나타내는 표입니다.

 

가상서버

가상서비스

State of Connection

Enabled

Enabled

ㆍClient / Server Connection 모두 종료

Enabled

Disabled

ㆍTCP 같은 서비스는 Connection reuse 허용 안함

   - Client / Server Connection 모두 종료

ㆍHTTP 같은 서비스는 Connection reuse 허용

   - 트랜잭션이 활성화 상태 : Client / Server Connection 모두 종료

   - 트랜잭션이 비활성화 상태 : Client Connection 종료

Disabled

Enabled

ㆍTCP 같은 서비스는 Connection reuse 허용 안함

   - Client / Server Connection 모두 종료

ㆍHTTP 같은 서비스는 Connection reuse 허용

   - 트랜잭션이 활성화 상태 : Client / Server Connection 모두 종료

   - 트랜잭션이 비활성화 상태 : Server Connection 종료

 

Disabled

Disabled

ㆍClient / Server Connection 모두 종료 시키지 않음

 

서버나 클라이언트로 연결된 Connection 닫고자 때에는 서비스를 Disable .

 

Command line에서 설정 하는 방법

 set lb vserver <name> -downStateFlush <Value>

  Example

set lb vserver Vserver-LB-1 -downStateFlush enabled

 

GUI 설정 방법

1 Traffic Management > Load Balancing > Virtual Servers

2. Advanced Settings

3. Traffic Settings / Down State Flush.

Posted by 네떡지기
TAG Citrix, L4
분류없음2018.02.21 23:52

ACI 대한 접근 방법

GUI / API / CLI

 

fabric Node CLI 모드

CLI

      - NX-OS, Bash Shell 명령으로 스위치의 정보를 확인(Bash, iBash, iShell이라고 )

vsh_lc

      - Line card Shell.

      - ALE(Application Leaf Engine) ASIC Linecard Process, forwarding table 확인하는 사용

Broadcom Shell

      - Broadcom ASIC 대한 정보를 확인하는 Shell.

      - TAC에서 다루는 범위

VSH

      - NX-OS CLI Shell.

      - ACI 모드에서는 정확 있으며, 사용을 권고하지는 않음.

 

일반 Bash 명령

  CLI 모드를 사용하는 경우에 다음의 일반적인 Linux 명령을 사용 가능

     - man, what, ls, cd, cat, grep, ps, netstat, ip route show, pwd

 

일반 CLI 명령

Fabric Node에는 일반 NX-OS 명령어 외에 ACI 관련된 명령어가 추가로 있음

   - acidiag : controller fabric node 상태를 확인하기 위한 명령

                 acidiag avread(controller정보), acidiag fnvread(fabric node정보) 일반적으로 많이 사용 .

 

   - techsupport : CLI 통해서 장비의 techsupport 파일을 수집

   - attach : APIC에서 Leaf ssh 접근하기 위해서 사용

   - iping/itraceroute  : ping traceroute 대신해서 사용

 

기타

  CLI창에서 <ESC> 키를 두번 누르면, 기존 NX-OS 에서 '?' 처럼, 사용 가능한 키워드가 화면에 표기

    - VSH에서는 NX-OS Shell이기 때문에 동일하게 '?' 사용

 

Posted by 네떡지기

티스토리 툴바