RedPlug's Tory

mariadb 백업 복원

SQL2023. 12. 9. 11:04

전체 db 백업

mysqldump -uroot --all-databases > backup.sql

전체 나 특정 db 복원

mysql -uaccount -ppassword < backup.sql
mysql -uaccount -ppassword dbname < backup.sql

톰캣 -> bin폴더 -> setenv.bat 파일 생성 -> 하기 입력 -> startup.bat 파일 실행해서 프로파일 확인

set SPRING_PROFILES_ACTIVE=local

 

PS C:\Windows\system32> Install-Module PSSlack -Force
WARNING: Unable to download from URI 'https://go.microsoft.com/fwlink/?LinkID=627338&clcid=0x409' to ''.
WARNING: Unable to download the list of available providers. Check your internet connection.
PackageManagement\Install-PackageProvider : No match was found for the specified search criteria for the provider 'NuGet'. The package provider requires 
'PackageManagement' and 'Provider' tags. Please check if the specified package has the tags.
At C:\Program Files\WindowsPowerShell\Modules\PowerShellGet\1.0.0.1\PSModule.psm1:7405 char:21
+ ...     $null = PackageManagement\Install-PackageProvider -Name $script:N ...
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (Microsoft.Power...PackageProvider:InstallPackageProvider) [Install-PackageProvider], Exception
    + FullyQualifiedErrorId : NoMatchFoundForProvider,Microsoft.PowerShell.PackageManagement.Cmdlets.InstallPackageProvider
 
PackageManagement\Import-PackageProvider : No match was found for the specified search criteria and provider name 'NuGet'. Try 'Get-PackageProvider -ListAvailable' to 
see if the provider exists on the system.
At C:\Program Files\WindowsPowerShell\Modules\PowerShellGet\1.0.0.1\PSModule.psm1:7411 char:21
+ ...     $null = PackageManagement\Import-PackageProvider -Name $script:Nu ...
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidData: (NuGet:String) [Import-PackageProvider], Exception
    + FullyQualifiedErrorId : NoMatchFoundForCriteria,Microsoft.PowerShell.PackageManagement.Cmdlets.ImportPackageProvider
 
WARNING: Unable to download from URI 'https://go.microsoft.com/fwlink/?LinkID=627338&clcid=0x409' to ''.
WARNING: Unable to download the list of available providers. Check your internet connection.
PackageManagement\Get-PackageProvider : Unable to find package provider 'NuGet'. It may not be imported yet. Try 'Get-PackageProvider -ListAvailable'.
At C:\Program Files\WindowsPowerShell\Modules\PowerShellGet\1.0.0.1\PSModule.psm1:7415 char:30
+ ... tProvider = PackageManagement\Get-PackageProvider -Name $script:NuGet ...
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (Microsoft.Power...PackageProvider:GetPackageProvider) [Get-PackageProvider], Exception
    + FullyQualifiedErrorId : UnknownProviderFromActivatedList,Microsoft.PowerShell.PackageManagement.Cmdlets.GetPackageProvider
 
Install-Module : NuGet provider is required to interact with NuGet-based repositories. Please ensure that '2.8.5.201' or newer version of NuGet provider is installed.
At line:1 char:1
+ Install-Module PSSlack -Force
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [Install-Module], InvalidOperationException
    + FullyQualifiedErrorId : CouldNotInstallNuGetProvider,Install-Module
    

PS C:\Windows\system32>  [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12


PS C:\Windows\system32>  Install-PackageProvider -Name NuGet

 

하기명령어 실행 후 설치 진행

[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12

Install-PackageProvider -Name NuGet

다른 DB연결을 위한 디비링크 플러그인 Connect Storage Engine

MariaDB에서는 10.2 버젼 이후부터 정식적으로 지원 하기 때문에 10.2 버젼 이상 설치를 권장,

https://mariadb.com/kb/en/connect/

Connect VersionIntroducedMaturity

Connect 1.07.0002 MariaDB 10.5.9, MariaDB 10.4.18, MariaDB 10.3.28, MariaDB 10.2.36 Stable
Connect 1.07.0001 MariaDB 10.4.12, MariaDB 10.3.22, MariaDB 10.2.31, MariaDB 10.1.44 Stable
Connect 1.06.0010 MariaDB 10.4.8, MariaDB 10.3.18, MariaDB 10.2.27 Stable
Connect 1.06.0007 MariaDB 10.3.6, MariaDB 10.2.14, MariaDB 10.1.33 Stable
Connect 1.06.0005 MariaDB 10.3.3, MariaDB 10.2.10, MariaDB 10.1.29 Stable
Connect 1.06.0004 MariaDB 10.3.2, MariaDB 10.2.9, MariaDB 10.1.28 Stable
Connect 1.06.0001 MariaDB 10.3.1, MariaDB 10.2.8, MariaDB 10.1.24 Beta
Connect 1.05.0003 MariaDB 10.3.0, MariaDB 10.2.5, MariaDB 10.1.22 Stable
Connect 1.05.0001 MariaDB 10.2.4, MariaDB 10.1.21 Stable
Connect 1.04.0008 MariaDB 10.2.2, MariaDB 10.1.17 Stable
Connect 1.04.0006 MariaDB 10.2.0, MariaDB 10.1.13, Stable
Connect 1.04.0005 MariaDB 10.1.10 Beta
Connect 1.04.0003 MariaDB 10.1.9 Beta

 

윈도우에서는 별도의 과정없이 플러그인만 설치 하면 설정이 가능하나

리눅스에서는 별도 설치 작업 후 플러그인 인스톨이 필요 함.

https://mariadb.com/kb/en/installing-the-connect-storage-engine/

 

Installing the CONNECT Storage Engine

Installing the CONNECT storage engine.

mariadb.com

 

# CentOS. RHEL
sudo yum install MariaDB-connect-engine

# Debian, Ubuntu
sudo apt-get install mariadb-plugin-connect

# SLES, OpenSUSE
sudo zypper install MariaDB-connect-engine

 

상기과정을 거친 후 DB에 접속하여 플러그인을 설치 진행하면 완료

# DB로그인
mysql -uroot -p

# 플러그인 설치
INSTALL SONAME 'ha_connect';

# 설치 플러그인 확인
SHOW PLUGINS;

 

 

Esxi 상에서 테스트 목적으로 기존에 만들어져 있던 윈도우 VM을 켜서 테스트를 진행하는 도중 일정시간이 지나면 VM이 shutdown 되는 증상이 발견되었으며, 해당 증상에 대해서 확인을 해보니 한가지 특이점이 있었습니다.

한시간 마다 서버가 shutdown 되는 증상이었습니다.(...처음에 시간도 생각못해서 꺼지면 켜고 꺼지면 켜고 몇번 반복 했네요..)

확인 해본 사항으로는

esxi쪽 CPU/메모리 부족 : 특이사항 없음

누군가가 끈 흔적(로그 등) : 특이사항 없음

서버 내 스케쥴 : 특이사항 없음

그러던 와중 shutdown 시점에 eventlog에 뭔가 남아있는게 있나 싶어서 찾아봤는데

The process C:\Windows\system32\wlms\wlms.exe (XXXXX) has initiated the shutdown of computer XXXXX on behalf of user NT AUTHORITY\SYSTEM for the following reason: Other (Planned) Reason Code: 0x80000000

계획된 시스템 OFF...?

관련 해서 구글링을 진행하니 하기와 같은 내용을 찾을 수 있었습니다. (라이선스 만료되면 1시간 마다 꺼짐)

After Windows license expires, you will see a similar message as shown below and then VM will auto shutdown every hour.

...테스트 하고 있던 서버도 license Expired 문구가 떠있던 서버었던 터라 라이선스를 넣거나 막을 방법을 찾아야 했고

WLMS(Windows Licensing Monitoring Service)를 OFF시키면 된다는 내용을 확인 했고

하기와 같이 가이드 대로 진행하였습니다.

1. psExec Tools 다운로드 및 압축 해제 : https://learn.microsoft.com/en-us/sysinternals/downloads/psexec

2. 관리자 모드로 cmd 창오픈

3. psexec폴더로 이동 후 psexec -i -s cmd.exe

4. 새로 뜬 커맨드 창에 whoami로 system 계정 확인( WLSM off권한)

5. services.msc로 서비스 창 띄운 후  WLMS 서비스 disabled

6. 실행된 서비스를 멈출 수 없기 때문에 재부팅을 진행후에 실제로 서비스가 stop 되었는지 확인

7. 정상 작동 확인

실제로 상기 작업 진행 후 서버가 재부팅 되지 않음을 확인하였습니다.

새벽에 일어나서 한 시간마다 서버켜는 요상한 짓은 하지 않아도 되게 되었습니다.

다만 상기 방법은 정상인 방법은 아니기 때문에 실 환경에서는 사용하지 않고 테스트 환경에서 급하게 사용이 필요한 경우에 사용하시면 될 것 같습니다.

 

참고 링크

https://digitalitskills.com/how-to-stop-windows-server-auto-shutdown-every-hour-after-license-expire/

Tools - Sniffnet

Network2023. 5. 21. 20:54

GitHub : https://github.com/GyulyVGC/sniffnet
Link : https://news.hada.io/topic?id=9224&utm\_source=slack&utm\_medium=bot&utm\_campaign=T07SR86Q5

오픈소스 네트워크 트래픽 모니터링 도구로 다양한 플랫폼 지원 (윈도우, 맥, 리눅스)

맥의 경우 Homebrew 지원

brew install sniffnet  

윈도우의 경우 Npcap 설치가 필요

지원되는 기능도 상당히 많음(필터링,통계, 실시간 챠트, 도메인 새부 정보, 국가확인, 즐겨찾기,특정 이벤트 알람...)


그외에도 다양한 어플리케이션 계층을 구분해서 지원이 가능하다

현재 기준 버젼은 1.2.0
실행 첫화면, 한글 지원이 가능하고 어뎁터, IP버젼, 프로토콜, 어플리케이션 프로콜을 선택하게 된다. 다중 선택은 불가한걸로 보이나 프로그램 실행이 여러개 실행되기 때문에 여러개의 어뎁터 확인이 필요한 경우 다중 프로그램 실행이 필요

설정 - 알림
임계 값이 초과하면 알람 소리로 알람 가능

설정 - 스타일
스타일은 총 4가지
기본 다크(Yeti Night)


기본 라이트(Yeti Day)


Deep Sea


Mon Amour

설정 - 언어
한국어를 지원한다 한국어를 전체 지원하지 않는다고 하나 사용하는데는 크게 지장은 없어 보인다.

실제 하기 이미지와 통신을 모니터링 할 수 있다
확인하고자 하는 호스트 혹은 프로토콜을 선택 할 경우 Inspect로 넘어가게 됩니다


Inspect


우측의 버튼을 활용해 리포팅도 가능


설정해둠 알람에 따라 알람이 수신
소리는 짧게 울리기 때문에 거슬릴 정도는 아닌것 같습니다.
계속 보고 있는게 아니면 아마 못듣지 않을까 합니다

네트워크 모니터링용으로 심플하게 사용 가능한 툴로 보여집니다.

#아이피 체크 함수
function AlertIP($server="dns.test.com", $queryaddress="www.google.co.kr", $wrongIP="168.126.63.1"){   
    $result = resolve-dnsname $queryaddress -Type A -Server $server
    if($result.IP4Address -eq $wrongIP){
        $body = ConvertTo-Json @{
            # pretext = "DNS Alert www.google.co.kr"
            text = $queraddress "A Record is return " $wrongIP
            color = "#142954"
        }
 		# 슬랙 웹훅
        try {
            Invoke-RestMethod -uri $uriSlack -Method Post -body $body -ContentType 'application/json' | Out-Null
        } catch {
            Write-Error (Get-Date) ": Update to Slack went wrong..."
        }
        # 팝업 발생
        $msg = New-Object -ComObject WScript.Shell
 
        $msg.POpup("알람", 5, "알람", 48)
    }
    write-host $Server "IP :" $result.IP4Address   
}
 
#슬랙 웹훅 주소 수정 해서 사용
$uriSlack = "https://hooks.slack.com/services/{GUID}"
 
# 실제
for(;;) {
    get-date
    AlertIP "dns1.test.com" "www.google.co.kr" "168.126.63.1"
    AlertIP "dns2.test.com"
    sleep 10
    write-host "===================================="
}

업무상 자격증명을 삭제 해야 하는 경우가 발생합니다.

매번 작업 해주기 귀찮아서 확인해보니 한번에 삭제 하는 방법이 있네요

....저걸 하나하나 모두 삭제

cmdkey로 리스트를 불러올 수 있어서 혹시나 해보았으나...될리가 없죠..

구글링을 해보니 누군가 간단하게 스크립트로 만들어 놓은 것을 확인

$Credentials = (cmdkey /list | Where-Object {$_ -like "*Target=*"})
Foreach ($Target in $Credentials) {
    $Target = ($Target -split (":", 2) | Select-Object -Skip 1).substring(1)
    $Argument = "/delete:" + $Target
    Start-Process Cmdkey -ArgumentList $Argument -NoNewWindow -RedirectStandardOutput $False
    }

cmdkey에서 리스트를 뽑아서 한땀한땀 삭제를 해주는 스크립트 입니다.

찾아서 파괴파괴!

돌리고 나니... 모두 삭제 확인하였습니다.

 

 

출처 : https://gist.github.com/janikvonrotz/7819990

안녕하세요 Redplug입니다.

CKA 자격증 취득하였습니다.

CKA시험의 경우 접수 후 1년간 2번의 시험 기회가 제공됩니다. (노쇼일 경우 2번째 시험 기회 박탈)

공부자체는 약 1년 간 진행 하였으며, 쿠버네티스 관련경험은 크게 많지 않은 상태였습니다.

시험은 실습으로 진행하기 때문에 리눅스에 대한 기본적인 지식(쉘 다루는 방법)가 필요하고

시험 자체는 하기 과정 진행할 경우에 어렵지 않게 취득이 가능한 수준으로 판단됩니다.

2022년 6월부터 시험환경이 바뀌었습니다.

PSI 에서 제공되는 시큐어 브라우저를 통해서 제공되는 환경에서 시험을 보게 됩니다.

6월에 비해 많이 개선됬다고는 하나 시험보는데 상당히 불편한 점이 여러가지 있었습니다.

(속도라던가... 복붙이라던가..북마크 사용 불가라던가 등등등)

제가 못찾은 건지 모르겠으나, 노트패드를 못찾아서 vim을 하나 더 띄워서 노트패드로 사용하였습니다.(tmux사용 가능함)

공부 순서는 하기와 같습니다.

1. 인프런 데브옵스(DevOps)를 위한 쿠버네티스 마스터

도커 및 쿠버네티스에 대한 전반적인 개념을 잡기 좋은 강의라고 생각 됩니다.

자격증 취득보단 실제 쿠버네티스의 각 기능별 이해도를 높이기 좋습니다. 전 쿠버네티스에 대한 전반적인 지식을 쌓기 위해 수강하였습니다.

수강료가 꽤 비싼 편이어서, 꼭 이 강의를 듣는다기 보다는 전반적인 쿠버네티스를 이해할 수 있는 강의 혹은 책을 보시면 될 것 같습니다. 

https://inf.run/2xLe

 

데브옵스(DevOps)를 위한 쿠버네티스 마스터 - 인프런 | 강의

컨테이너 기반 오픈 소스 가상화 프로젝트인 "쿠버네티스"를 이용한 컨테이너 환경의 분산 시스템을 탄력적으로 실행하기 위한 프레임 워크를 활용하는 방법을 입문부터 활용까지 다룹니다., -

www.inflearn.com

 

2. Certified Kubernetes Administrator (CKA) with Practice Tests

CKA 자격증 취득관련해서 검색하면 나오는 가장 유명한 뭄샤드의 Udemy강의 입니다.

강의는 할인을 자주하며 약 1~2만원대로 구매가 가능하니 할인 할때 구매 하시면 됩니다.

1번에서 이야기한 전체적인 이론에 대한 부분이 전체적인 수강의 대부분을 차지하고 있으며, 

실제 시험을 위한 부분은 Mock Exam 부분이라고 생각됩니다.

영어에 어려움이 없으시면 이 강의만 들어도 크게 무리는 없을 것으로 예상되며,
Mock Exam은 익숙해질때까지 꼭 풀어보시길 권장 드립니다.

강의는 지속적으로 업데이트 되는 것으로 알고 있습니다.

https://www.udemy.com/course/certified-kubernetes-administrator-with-practice-tests/

3. 따베런(따배씨 CKA시리즈)

CKA 준비하면서 알게된 유투브 입니다.

현재는 유료화 컨텐츠로 전환되어서 4편 이후로는 별도의 비용이 발생합니다. (1만원 미만)

CKA 취득관련하여 시험문제에 대한 30가지 유형별로 설명 및 풀이영상이며, 시험전에 최종적으로 보시면 좋을 걸로 생각됩니다.

실제로 제가 푼 Mock Exam 에 없는 유형도 있어서 도움을 받았습니다.

시간이 된다면 가급적이면 쿠버네티스 강의시리즈(기본, 심화)도 보시면 좋습니다.

https://youtu.be/KdATmTulf7s

 

 

 

 

현재 실 업무에서 직접 담당하는 상태는 아니기 때문에 CKAD취득까지는 바로 이어지지 않을 것 같습니다.

다만 시험 자체가 실습 형태로 이우어지다보니 쿠버네티스를 이해하는데 도움이 많이 되는 시험이라고 생각되어, 관련 업무를 하실 경우 취득하시기를 권장 드립니다.

 

 

 

 

 

플레이북의 동적인 사용을 테스트 하기 위해

CentOS * 5, Ubuntu * 5 환경으로 구성

Vagrantfile

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|

  #==============#
  # CentOS nodes #
  #==============#
  
  #Ansible-Node101
  config.vm.define "ansible-node101" do |cfg|
     cfg.vm.box = "centos/7"
	 cfg.vm.provider "virtualbox" do |vb|
	   vb.name = "Ansible-Node101(github_SysNet4Admin)"
	 end
	 cfg.vm.host_name = "ansible-node101"
	 cfg.vm.network "public_network", ip: "192.168.0.101"
	 cfg.vm.network "forwarded_port", guest: 22, host: 60101, auto_correct: true, id: "ssh"
	 cfg.vm.synced_folder "../data", "/vagrant", disabled: true 
	 cfg.vm.provision "shell", path: "bash_ssh_conf_4_CentOS.sh"
  end
  
  #Ansible-Node102	 
  config.vm.define "ansible-node102" do |cfg|
     cfg.vm.box = "centos/7"
	 cfg.vm.provider "virtualbox" do |vb|
	   vb.name = "Ansible-Node102(github_SysNet4Admin)"
	 end
	 cfg.vm.host_name = "ansible-node102"
	 cfg.vm.network "public_network", ip: "192.168.0.102"
	 cfg.vm.network "forwarded_port", guest: 22, host: 60102, auto_correct: true, id: "ssh"
	 cfg.vm.synced_folder "../data", "/vagrant", disabled: true
	 cfg.vm.provision "shell", path: "bash_ssh_conf_4_CentOS.sh"
  end

  #Ansible-Node103	 
  config.vm.define "ansible-node103" do |cfg|
     cfg.vm.box = "centos/7"
	 cfg.vm.provider "virtualbox" do |vb|
	   vb.name = "Ansible-Node103(github_SysNet4Admin)"
	 end
	 cfg.vm.host_name = "ansible-node103"
	 cfg.vm.network "public_network", ip: "192.168.0.103"
	 cfg.vm.network "forwarded_port", guest: 22, host: 60103, auto_correct: true, id: "ssh"
	 cfg.vm.synced_folder "../data", "/vagrant", disabled: true 
	 cfg.vm.provision "shell", path: "bash_ssh_conf_4_CentOS.sh"
  end

  #Ansible-Node104	 
  config.vm.define "ansible-node104" do |cfg|
     cfg.vm.box = "centos/7"
	 cfg.vm.provider "virtualbox" do |vb|
	   vb.name = "Ansible-Node104(github_SysNet4Admin)"
	 end
	 cfg.vm.host_name = "ansible-node104"
	 cfg.vm.network "public_network", ip: "192.168.0.104"
	 cfg.vm.network "forwarded_port", guest: 22, host: 60104, auto_correct: true, id: "ssh"
	 cfg.vm.synced_folder "../data", "/vagrant", disabled: true 
	 cfg.vm.provision "shell", path: "bash_ssh_conf_4_CentOS.sh"
  end

  #Ansible-Node105	 
  config.vm.define "ansible-node105" do |cfg|
     cfg.vm.box = "centos/7"
	 cfg.vm.provider "virtualbox" do |vb|
	   vb.name = "Ansible-Node105(github_SysNet4Admin)"
	 end
	 cfg.vm.host_name = "ansible-node105"
	 cfg.vm.network "public_network", ip: "192.168.0.105"
	 cfg.vm.network "forwarded_port", guest: 22, host: 60105, auto_correct: true, id: "ssh"
	 cfg.vm.synced_folder "../data", "/vagrant", disabled: true 
	 cfg.vm.provision "shell", path: "bash_ssh_conf_4_CentOS.sh"
  end

  
  #==============#
  # Ubuntu nodes #
  #==============#
  
  #Ansible-Node201
  config.vm.define "ansible-node201" do |cfg|
     cfg.vm.box = "ubuntu/trusty64"
	 cfg.vm.provider "virtualbox" do |vb|
	   vb.name = "Ansible-Node201(github_SysNet4Admin)"
	 end
	 cfg.vm.host_name = "ansible-node201"
	 cfg.vm.network "public_network", ip: "192.168.0.201"
	 cfg.vm.network "forwarded_port", guest: 22, host: 60201, auto_correct: true, id: "ssh"
	 cfg.vm.synced_folder "../data", "/vagrant", disabled: true 
  end
  
  #Ansible-Node202	 
  config.vm.define "ansible-node202" do |cfg|
     cfg.vm.box = "ubuntu/trusty64"
	 cfg.vm.provider "virtualbox" do |vb|
	   vb.name = "Ansible-Node202(github_SysNet4Admin)"
	 end
	 cfg.vm.host_name = "ansible-node202"
	 cfg.vm.network "public_network", ip: "192.168.0.202"
	 cfg.vm.network "forwarded_port", guest: 22, host: 60202, auto_correct: true, id: "ssh"
	 cfg.vm.synced_folder "../data", "/vagrant", disabled: true
  end

  #Ansible-Node203	 
  config.vm.define "ansible-node203" do |cfg|
     cfg.vm.box = "ubuntu/trusty64"
	 cfg.vm.provider "virtualbox" do |vb|
	   vb.name = "Ansible-Node203(github_SysNet4Admin)"
	 end
	 cfg.vm.host_name = "ansible-node203"
	 cfg.vm.network "public_network", ip: "192.168.0.203"
	 cfg.vm.network "forwarded_port", guest: 22, host: 60203, auto_correct: true, id: "ssh"
	 cfg.vm.synced_folder "../data", "/vagrant", disabled: true 
  end

  #Ansible-Node204	 
  config.vm.define "ansible-node204" do |cfg|
     cfg.vm.box = "ubuntu/trusty64"
	 cfg.vm.provider "virtualbox" do |vb|
	   vb.name = "Ansible-Node204(github_SysNet4Admin)"
	 end
	 cfg.vm.host_name = "ansible-node204"
	 cfg.vm.network "public_network", ip: "192.168.0.204"
	 cfg.vm.network "forwarded_port", guest: 22, host: 60204, auto_correct: true, id: "ssh"
	 cfg.vm.synced_folder "../data", "/vagrant", disabled: true 
  end

  #Ansible-Node205	 
  config.vm.define "ansible-node205" do |cfg|
     cfg.vm.box = "ubuntu/trusty64"
	 cfg.vm.provider "virtualbox" do |vb|
	   vb.name = "Ansible-Node205(github_SysNet4Admin)"
	 end
	 cfg.vm.host_name = "ansible-node205"
	 cfg.vm.network "public_network", ip: "192.168.0.205"
	 cfg.vm.network "forwarded_port", guest: 22, host: 60205, auto_correct: true, id: "ssh"
	 cfg.vm.synced_folder "../data", "/vagrant", disabled: true 
  end
  
  
  #================#
  # Ansible Server #
  #================#
  
  config.vm.define "ansible-server" do |cfg|
    cfg.vm.box = "centos/7"
 	cfg.vm.provider "virtualbox" do |vb|
	  vb.name = "Ansible-Server(github_SysNet4Admin)"
	end
	cfg.vm.host_name = "ansible-server"
	cfg.vm.network "public_network", ip: "192.168.0.10"
	cfg.vm.network "forwarded_port", guest: 22, host: 60010, auto_correct: true, id: "ssh"
	cfg.vm.synced_folder "../data", "/vagrant", disabled: true
	cfg.vm.provision "shell", inline: "yum install epel-release -y"
	cfg.vm.provision "shell", inline: "yum install ansible -y"
	cfg.vm.provision "file", source: "ansible_env_ready.yml", 
	  destination: "ansible_env_ready.yml"
	cfg.vm.provision "shell", inline: "ansible-playbook ansible_env_ready.yml"
  end
end

앤서블 환경 구성 파일

ansible_env_ready.yml

---
- name: Setup for the Ansible's Environment
  hosts: localhost
  gather_facts: no
  
  tasks:
    - name: Add "/etc/ansible/hosts"
      blockinfile: 
        path: /etc/ansible/hosts
        block: |
          [nodes]
          192.168.0.[101:105]
          192.168.0.[201:205]

    - name: Generate sshkey
      become: yes
      become_user: vagrant
      shell: "{{ item }}"
      with_items:
        - "ssh-keyscan 192.168.0.101 >> ~/.ssh/known_hosts"
        - "ssh-keyscan 192.168.0.102 >> ~/.ssh/known_hosts"
        - "ssh-keyscan 192.168.0.103 >> ~/.ssh/known_hosts"
        - "ssh-keyscan 192.168.0.104 >> ~/.ssh/known_hosts"
        - "ssh-keyscan 192.168.0.105 >> ~/.ssh/known_hosts"
        - "ssh-keyscan 192.168.0.201 >> ~/.ssh/known_hosts"
        - "ssh-keyscan 192.168.0.202 >> ~/.ssh/known_hosts"
        - "ssh-keyscan 192.168.0.203 >> ~/.ssh/known_hosts"
        - "ssh-keyscan 192.168.0.204 >> ~/.ssh/known_hosts"
        - "ssh-keyscan 192.168.0.205 >> ~/.ssh/known_hosts"
          
    - name: Create vim env's directories & files
      shell: "{{ item }}"
      with_items:
        - "mkdir -p /home/vagrant/.vim/autoload /home/vagrant/.vim/bundle"
        - "touch /home/vagrant/.vimrc"
        - "touch /home/vagrant/.bashrc"
      
    - name: Install vim-enhanced
      yum: 
        name: vim-enhanced
        state: present
        
    - name: Install git
      yum: 
        name: git
        state: present
        
    - name: Download pathogen.vim
      shell: "curl -fLo /home/vagrant/.vim/autoload/pathogen.vim
              https://tpo.pe/pathogen.vim"
      
    - name: Git clone vim-ansible-yaml
      git:
        repo: https://github.com/chase/vim-ansible-yaml.git
        dest: /home/vagrant/.vim/bundle/vim-ansible-yaml
        
    - name: Configure vimrc
      lineinfile: 
        path: /home/vagrant/.vimrc
        line: "{{ item }}"
      with_items:
        - "set number"
        - "execute pathogen#infect()"
        - "syntax on"

    - name: Configure Bashrc
      lineinfile:   
        path: /home/vagrant/.bashrc
        line: "{{ item }}"
      with_items:
        - "alias ans='ansible'"
        - "alias anp='ansible-playbook'"

기존 노드 모두 삭제 진행

vagrant up

핑체크

vagrant ssh ansible-server
ans nodes -m ping -k

known_hosts를 자동으로 등록하기

Vagrantfile

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|

  #==============#
  # CentOS nodes #
  #==============#
  
  #Ansible-Node101
  config.vm.define "ansible-node101" do |cfg|
     cfg.vm.box = "centos/7"
	 cfg.vm.provider "virtualbox" do |vb|
	   vb.name = "Ansible-Node101(github_SysNet4Admin)"
	 end
	 cfg.vm.host_name = "ansible-node101"
	 cfg.vm.network "public_network", ip: "192.168.0.101"
	 cfg.vm.network "forwarded_port", guest: 22, host: 60101, auto_correct: true, id: "ssh"
	 cfg.vm.synced_folder "../data", "/vagrant", disabled: true 
	 cfg.vm.provision "shell", path: "bash_ssh_conf_4_CentOS.sh"
  end
  
  #Ansible-Node102	 
  config.vm.define "ansible-node102" do |cfg|
     cfg.vm.box = "centos/7"
	 cfg.vm.provider "virtualbox" do |vb|
	   vb.name = "Ansible-Node102(github_SysNet4Admin)"
	 end
	 cfg.vm.host_name = "ansible-node102"
	 cfg.vm.network "public_network", ip: "192.168.0.102"
	 cfg.vm.network "forwarded_port", guest: 22, host: 60102, auto_correct: true, id: "ssh"
	 cfg.vm.synced_folder "../data", "/vagrant", disabled: true
	 cfg.vm.provision "shell", path: "bash_ssh_conf_4_CentOS.sh"
  end

  #Ansible-Node103	 
  config.vm.define "ansible-node103" do |cfg|
     cfg.vm.box = "centos/7"
	 cfg.vm.provider "virtualbox" do |vb|
	   vb.name = "Ansible-Node103(github_SysNet4Admin)"
	 end
	 cfg.vm.host_name = "ansible-node103"
	 cfg.vm.network "public_network", ip: "192.168.0.103"
	 cfg.vm.network "forwarded_port", guest: 22, host: 60103, auto_correct: true, id: "ssh"
	 cfg.vm.synced_folder "../data", "/vagrant", disabled: true 
	 cfg.vm.provision "shell", path: "bash_ssh_conf_4_CentOS.sh"
  end

  #Ansible-Node104	 
  config.vm.define "ansible-node104" do |cfg|
     cfg.vm.box = "centos/7"
	 cfg.vm.provider "virtualbox" do |vb|
	   vb.name = "Ansible-Node104(github_SysNet4Admin)"
	 end
	 cfg.vm.host_name = "ansible-node104"
	 cfg.vm.network "public_network", ip: "192.168.0.104"
	 cfg.vm.network "forwarded_port", guest: 22, host: 60104, auto_correct: true, id: "ssh"
	 cfg.vm.synced_folder "../data", "/vagrant", disabled: true 
	 cfg.vm.provision "shell", path: "bash_ssh_conf_4_CentOS.sh"
  end

  #Ansible-Node105	 
  config.vm.define "ansible-node105" do |cfg|
     cfg.vm.box = "centos/7"
	 cfg.vm.provider "virtualbox" do |vb|
	   vb.name = "Ansible-Node105(github_SysNet4Admin)"
	 end
	 cfg.vm.host_name = "ansible-node105"
	 cfg.vm.network "public_network", ip: "192.168.0.105"
	 cfg.vm.network "forwarded_port", guest: 22, host: 60105, auto_correct: true, id: "ssh"
	 cfg.vm.synced_folder "../data", "/vagrant", disabled: true 
	 cfg.vm.provision "shell", path: "bash_ssh_conf_4_CentOS.sh"
  end

  
  #==============#
  # Ubuntu nodes #
  #==============#
  
  #Ansible-Node201
  config.vm.define "ansible-node201" do |cfg|
     cfg.vm.box = "ubuntu/trusty64"
	 cfg.vm.provider "virtualbox" do |vb|
	   vb.name = "Ansible-Node201(github_SysNet4Admin)"
	 end
	 cfg.vm.host_name = "ansible-node201"
	 cfg.vm.network "public_network", ip: "192.168.0.201"
	 cfg.vm.network "forwarded_port", guest: 22, host: 60201, auto_correct: true, id: "ssh"
	 cfg.vm.synced_folder "../data", "/vagrant", disabled: true 
  end
  
  #Ansible-Node202	 
  config.vm.define "ansible-node202" do |cfg|
     cfg.vm.box = "ubuntu/trusty64"
	 cfg.vm.provider "virtualbox" do |vb|
	   vb.name = "Ansible-Node202(github_SysNet4Admin)"
	 end
	 cfg.vm.host_name = "ansible-node202"
	 cfg.vm.network "public_network", ip: "192.168.0.202"
	 cfg.vm.network "forwarded_port", guest: 22, host: 60202, auto_correct: true, id: "ssh"
	 cfg.vm.synced_folder "../data", "/vagrant", disabled: true
  end

  #Ansible-Node203	 
  config.vm.define "ansible-node203" do |cfg|
     cfg.vm.box = "ubuntu/trusty64"
	 cfg.vm.provider "virtualbox" do |vb|
	   vb.name = "Ansible-Node203(github_SysNet4Admin)"
	 end
	 cfg.vm.host_name = "ansible-node203"
	 cfg.vm.network "public_network", ip: "192.168.0.203"
	 cfg.vm.network "forwarded_port", guest: 22, host: 60203, auto_correct: true, id: "ssh"
	 cfg.vm.synced_folder "../data", "/vagrant", disabled: true 
  end

  #Ansible-Node204	 
  config.vm.define "ansible-node204" do |cfg|
     cfg.vm.box = "ubuntu/trusty64"
	 cfg.vm.provider "virtualbox" do |vb|
	   vb.name = "Ansible-Node204(github_SysNet4Admin)"
	 end
	 cfg.vm.host_name = "ansible-node204"
	 cfg.vm.network "public_network", ip: "192.168.0.204"
	 cfg.vm.network "forwarded_port", guest: 22, host: 60204, auto_correct: true, id: "ssh"
	 cfg.vm.synced_folder "../data", "/vagrant", disabled: true 
  end

  #Ansible-Node205	 
  config.vm.define "ansible-node205" do |cfg|
     cfg.vm.box = "ubuntu/trusty64"
	 cfg.vm.provider "virtualbox" do |vb|
	   vb.name = "Ansible-Node205(github_SysNet4Admin)"
	 end
	 cfg.vm.host_name = "ansible-node205"
	 cfg.vm.network "public_network", ip: "192.168.0.205"
	 cfg.vm.network "forwarded_port", guest: 22, host: 60205, auto_correct: true, id: "ssh"
	 cfg.vm.synced_folder "../data", "/vagrant", disabled: true 
  end
  
  
  #================#
  # Ansible Server #
  #================#
  
  config.vm.define "ansible-server" do |cfg|
    cfg.vm.box = "centos/7"
 	cfg.vm.provider "virtualbox" do |vb|
	  vb.name = "Ansible-Server(github_SysNet4Admin)"
	end
	cfg.vm.host_name = "ansible-server"
	cfg.vm.network "public_network", ip: "192.168.0.10"
	cfg.vm.network "forwarded_port", guest: 22, host: 60010, auto_correct: true, id: "ssh"
	cfg.vm.synced_folder "../data", "/vagrant", disabled: true
	cfg.vm.provision "shell", inline: "yum install epel-release -y"
	cfg.vm.provision "shell", inline: "yum install ansible -y"
	cfg.vm.provision "file", source: "ansible_env_ready.yml", 
	  destination: "ansible_env_ready.yml"
	cfg.vm.provision "shell", inline: "ansible-playbook ansible_env_ready.yml"
	cfg.vm.provision "file", source: "auto_pass.yml", destination: "auto_pass.yml"
	cfg.vm.provision "shell", inline: "ansible-playbook auto_pass.yml", privileged: false
  end
end

ansible_env_ready.yml

---
- name: Setup for the Ansible's Environment
  hosts: localhost
  gather_facts: no
  
  tasks:
    - name: Add "/etc/ansible/hosts"
      blockinfile: 
        path: /etc/ansible/hosts
        block: |
          [nodes]
          192.168.0.[101:105]
          192.168.0.[201:205]

          
    - name: Create vim env's directories & files
      shell: "{{ item }}"
      with_items:
        - "mkdir -p /home/vagrant/.vim/autoload /home/vagrant/.vim/bundle"
        - "touch /home/vagrant/.vimrc"
        - "touch /home/vagrant/.bashrc"
      
    - name: Install vim-enhanced
      yum: 
        name: vim-enhanced
        state: present
        
    - name: Install git
      yum: 
        name: git
        state: present
        
    - name: Download pathogen.vim
      shell: "curl -fLo /home/vagrant/.vim/autoload/pathogen.vim
              https://tpo.pe/pathogen.vim"
      
    - name: Git clone vim-ansible-yaml
      git:
        repo: https://github.com/chase/vim-ansible-yaml.git
        dest: /home/vagrant/.vim/bundle/vim-ansible-yaml
        
    - name: Configure vimrc
      lineinfile: 
        path: /home/vagrant/.vimrc
        line: "{{ item }}"
      with_items:
        - "set number"
        - "execute pathogen#infect()"
        - "syntax on"

    - name: Configure Bashrc
      lineinfile:   
        path: /home/vagrant/.bashrc
        line: "{{ item }}"
      with_items:
        - "alias ans='ansible'"
        - "alias anp='ansible-playbook'"

auto_pass.yml

---
- name: Create authority between server and nodes
  hosts: nodes
  connection: local
  serial: 1
  gather_facts: no

  tasks:
    - name: ssh-keyscan for known_hosts file
      command: /usr/bin/ssh-keyscan -t ecdsa {{ ansible_host }}
      register: keyscan

    - name: input key
      lineinfile:      
        path: ~/.ssh/known_hosts
        line: "{{ item }}"
        create: yes     
      with_items:
        - "{{ keyscan.stdout_lines }}"

삭제 후 재생성

vag_reconf.bat

재 생성 후

vagrant ssh ansible-server
ans nodes -m ping -k

authorizeD_keys 등록

auto_pass.yml

---
- name: Create authority between server and nodes
  hosts: nodes
  connection: local
  serial: 1
  gather_facts: no
  vars:
    ansible_password: vagrant

  tasks:
    - name: ssh-keyscan for known_hosts file
      command: /usr/bin/ssh-keyscan -t ecdsa {{ ansible_host }}
      register: keyscan

    - name: input key
      lineinfile:      
        path: ~/.ssh/known_hosts
        line: "{{ item }}"
        create: yes     
      with_items:
        - "{{ keyscan.stdout_lines }}"

    - name: sshkeygen for authorized_keys file
      command: "ssh-keygen -b 2048 -t rsa -f ~/.ssh/id_rsa -q -N ''"
      ignore_errors: yes
      run_once: true

    - name: input key for each node
      connection: ssh
      authorized_key:
        user: vagrant
        state: present
        key: "{{ lookup('file', '~/.ssh/id_rsa.pub') }}"

변경 후 ansible 서버 프로비져닝

vagrant provision ansible-server

암호 없이 핑체크

vagrant ssh ansible-server
ans -m ping

플레이북 동적으로 구성하기

gather_facts: no 

-> facts를 수집하지 않음. 앤서블 노드들의 다양한 정보를 미리 정의해둔 변수

facts.yml

---
- name: print ipv4.address for nodes
  hosts: nodes
  #gather_facts: no

  tasks:
    - name: debug by msg
      debug:
        msg:
          - "eth0's ip {{ ansible_eth0.ipv4.address }}"
          - "eth1's ip {{ ansible_eth1.ipv4.address }}"

    - name: debug by var
      debug:
        var: "{{ item }}"
      with_items:
        - hostvars[inventory_hostname]['ansible_eth0']['ipv4']['address']
        - hostvars[inventory_hostname]['ansible_eth1']['ipv4']['address']
anp facts.yml

facts확인

ans nodes -m setup > facts.txt

추출한 정보로 특정정보 확인

cat facts.txt | grep SSH_CONNECTION

각 노드별로 출력해주는 --tree명령어

--tree명령을 토앻서 저장된 facts 한줄로 표기(JSON형태)

ans nodes -m setup --tree /tmp/facts > /dev/null
ls /tmp/fats
cat /tmp/facts/192.168.0.101

 

facts_collector.yml

---
- name: Collect facts for each node
  hosts: nodes

  tasks:
    - name: generate facts
      setup:
      register: facts

    - name: save facts
      local_action:
        module: copy
        content: "{{ facts | to_nice_json }}"
        dest: ./{{ ansible_hostname }}_facts_by_collector.txt
anp facts_collector.yml

ls -lh ansible*

 

파일 확인

cat ansible-node101_facts_by_collector.txt | grep SSH

 

when 조건

nginx_install_w_when.yml

우분투에서 nginx 사이트 오류 발생해서 apache.com으로 변경

---
- name: Install nginx on the nodes
  hosts: nodes
  become: yes

  tasks:  
    - name: install epel-release for CentOS
      action: "{{ ansible_pkg_mgr }} name=epel-release state=latest"
      when: ansible_distribution == 'CentOS'
	  
    - name: install nginx web server for CentOS
      action: "{{ ansible_pkg_mgr }} name=nginx state=present"
      when: ansible_distribution == 'CentOS'

    - name: upload default index.html for web server
      get_url: url=https://www.nginx.com dest=/usr/share/nginx/html/ mode=0644
      when: ansible_distribution == 'CentOS'
	  
    - name: start nginx web server
      service: name=nginx state=started
      when: ansible_distribution == 'CentOS'
	  
    - name: install nginx web server for Ubuntu
      action: "{{ ansible_pkg_mgr }} name=nginx state=present update_cache=yes"
      when: ansible_distribution == 'Ubuntu'

    - name: upload default index.html for web server
      get_url: url=https://www.apache.com dest=/usr/share/nginx/html/ 
               mode=0644 validate_certs=no
      when: ansible_distribution == 'Ubuntu'

nginx_remove_w_when.yml

---
- name: Remove nginx on the nodes
  hosts: nodes
  become: yes

  tasks:
    - name: remove epel-release for CentOS
      action: "{{ ansible_pkg_mgr }} name=epel-release state=absent"
      when: ansible_distribution == 'CentOS'
	  
    - name: remove nginx web server for CentOS
      action: "{{ ansible_pkg_mgr }} name=nginx state=absent"
      when: ansible_distribution == 'CentOS'
  
    - name: remove nginx web server
      action: "{{ ansible_pkg_mgr }} name=nginx state=absent autoremove=yes"
      when: ansible_distribution == 'Ubuntu'

설치 실행 (OS 체크해서 진행)

anp nginx_install_w_when.yml

nginx 삭제 진행

anp nginx_remove_w_when.yml

include_tasks

낭비를 줄이기 위한 코드 개선

nginx_install_w_include_tasks.yml

---
- name: Install nginx on the nodes
  hosts: nodes
  become: yes

  tasks:
    - name: nginx for CentOS
      include_tasks: CentOS.yml
      when: ansible_distribution == 'CentOS'
    
    - name: nginx for Ubuntu
      include_tasks: Ubuntu.yml
      when: ansible_distribution == 'Ubuntu'

CentOS.yml

- name: install epel-release
  action: "{{ ansible_pkg_mgr }} name=epel-release state=latest"
- name: install nginx web server
  action: "{{ ansible_pkg_mgr }} name=nginx state=present"
- name: upload default index.html for web server
  get_url: url=https://www.nginx.com dest=/usr/share/nginx/html/ mode=0644
- name: start nginx web server
  service: name=nginx state=started

Ubuntu.yml

- name: install nginx web server
  action: "{{ ansible_pkg_mgr }} name=nginx state=present update_cache=yes"
- name: upload default index.html for web server
  get_url: url=https://www.apache.com dest=/usr/share/nginx/html/ 
           mode=0644 validate_certs=no

nginx_remove_w_include_tasks.yml

---
- name: Remove nginx on the nodes
  hosts: nodes
  become: yes

  tasks:
    - name: nginx for CentOS
      include_tasks: CentOS_remo.yml
      when: ansible_distribution == 'CentOS'
    
    - name: nginx for Ubuntu
      include_tasks: Ubuntu_remo.yml
      when: ansible_distribution == 'Ubuntu'

CentOS_remo.yml

- name: remove epel-release
  action: "{{ ansible_pkg_mgr }} name=epel-release state=absent"
- name: remove nginx web server
  action: "{{ ansible_pkg_mgr }} name=nginx state=absent"

Ubuntu_remo.yml

- name: remove nginx web server
  action: "{{ ansible_pkg_mgr }} name=nginx state=absent autoremove=yes"

 

실행

anp nginx_install_w_include_tasks.yml

설치확인

삭제

anp nginx_remove_w_include_task.yml

if 구문 활용

nginx_install_w_if.yml

---
- name: Install nginx on the nodes
  hosts: nodes
  become: yes
  vars:
    lnx_name: "{{ 'CentOS' if ansible_distribution == 'CentOS'
                   else 'Ubuntu' if ansible_distribution == 'Ubuntu'
                   else 'Just Linux' }}"

  tasks:
    - name: nginx for any linux
      include_tasks: "{{ lnx_name }}.yml"
anp nginx_instal_w_if.yml

nginx_remove_w_if.yml

---
- name: Remove nginx on the nodes
  hosts: nodes
  become: yes
  vars:
    lnx_name: "{{ 'CentOS' if ansible_distribution == 'CentOS'
                   else 'Ubuntu' if ansible_distribution == 'Ubuntu'
                   else 'Just Linux' }}"

  tasks:
    - name: nginx for any linux
      include_tasks: "{{ lnx_name }}_remo.yml"
anp nginx_remove_w_if.yml

NFS 구성을 효율적으로 하기

nfs_adv.yml

---
- name: Setup for nfs server
  hosts: localhost
  tasks:
    - include_tasks: nfs_server.yml

- name: Setup for nfs clients
  hosts: nodes
  tasks:
    - include_tasks: nfs_clients.yml

nfs_server.yml

- name: make nfs_shared directory
  file:
    path: "{{ ansible_user_dir }}/nfs_shared"
    state: directory
    mode: 0777

- name: configure /etc/exports
  become: yes
  lineinfile:
    path: /etc/exports
    line: "{{ ansible_user_dir }}/nfs_shared 192.168.0.0/24(rw,sync)"

- name: nfs service restart
  become: yes
  service:
    name: nfs
    state: restarted

nfs_client.yml

- name: make nfs_client directory
  file:
    path: "{{ ansible_user_dir }}/nfs"
    state: directory

- name: mount point directory as client
  become: yes
  mount:
    name: "{{ ansible_user_dir }}/nfs"
    src: "{{ ansible_env.SSH_CLIENT.split()[0] }}:/home/vagrant/nfs_shared"
    fstype: nfs
    opts: nfsvers=3
    state: mounted

실행

anp nfs_adv.uml

ans nodes -m shell -a "cat /etc/hostname | xargs -i touch ./nfs/{}"
ls ./nfs_shared

넥서스 스위치의 구성 파일을 효율적으로 백업하기 -> 장비 없어서 패스

Cumulus로 접속하기 위한 인증을 자동화 하기

Vagrantfile

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|

  #===============#
  # Cumulus nodes #
  #===============#
  
  #Ansible-Cumulus01
  config.vm.define "ansible-cl01" do |cl|
     cl.vm.box = "CumulusCommunity/cumulus-vx"
	 cl.vm.box_version = "3.6.0"
	 cl.vm.box_check_update = false
	 cl.vm.provider "virtualbox" do |vb|
	   vb.name = "Ansible-Cumulus01(github_SysNet4Admin)"
	   vb.customize ['modifyvm', :id, '--macaddress1', '080027000061']
	   vb.customize ['modifyvm', :id, '--natnet1', '10.0.61.0/24']
	 end
	 cl.vm.host_name = "ansible-cl01"
     cl.vm.network "public_network", ip: "192.168.0.61"
	 cl.vm.network "private_network", virtualbox__intnet: "swp2", auto_config: false
	 cl.vm.network "private_network", virtualbox__intnet: "swp3", auto_config: false
	 cl.vm.network "private_network", virtualbox__intnet: "swp4", auto_config: false
	 cl.vm.network "forwarded_port", guest: 22, host: 60061, auto_correct: true, id: "ssh"
	 cl.vm.synced_folder "../data", "/vagrant", disabled: true 
  end

  #Ansible-Cumulus02
  config.vm.define "ansible-cl02" do |cl|
     cl.vm.box = "CumulusCommunity/cumulus-vx"
	 cl.vm.box_version = "3.6.0"
	 cl.vm.box_check_update = false
	 cl.vm.provider "virtualbox" do |vb|
	   vb.name = "Ansible-Cumulus02(github_SysNet4Admin)"
	   vb.customize ['modifyvm', :id, '--macaddress1', '080027000062']
	   vb.customize ['modifyvm', :id, '--natnet1', '10.0.62.0/24']
	 end
	 cl.vm.host_name = "ansible-cl02"
	 cl.vm.network "public_network", ip: "192.168.0.62"
	 cl.vm.network "private_network", virtualbox__intnet: "swp2", auto_config: false
	 cl.vm.network "private_network", virtualbox__intnet: "swp3", auto_config: false
	 cl.vm.network "private_network", virtualbox__intnet: "swp4", auto_config: false
	 cl.vm.network "forwarded_port", guest: 22, host: 60062, auto_correct: true, id: "ssh"
	 cl.vm.synced_folder "../data", "/vagrant", disabled: true 
  end  
 
 #Ansible-Cumulus03
  config.vm.define "ansible-cl03" do |cl|
     cl.vm.box = "CumulusCommunity/cumulus-vx"
	 cl.vm.box_version = "3.6.0"
	 cl.vm.box_check_update = false
	 cl.vm.provider "virtualbox" do |vb|
	   vb.name = "Ansible-Cumulus03(github_SysNet4Admin)"
	   vb.customize ['modifyvm', :id, '--macaddress1', '080027000063']
	   vb.customize ['modifyvm', :id, '--natnet1', '10.0.63.0/24']
	 end
	 cl.vm.host_name = "ansible-cl03"
	 cl.vm.network "public_network", ip: "192.168.0.63"
	 cl.vm.network "private_network", virtualbox__intnet: "swp2", auto_config: false
	 cl.vm.network "private_network", virtualbox__intnet: "swp3", auto_config: false
	 cl.vm.network "private_network", virtualbox__intnet: "swp4", auto_config: false
	 cl.vm.network "forwarded_port", guest: 22, host: 60063, auto_correct: true, id: "ssh"
	 cl.vm.synced_folder "../data", "/vagrant", disabled: true 
  end  
  
  #Ansible-Cumulus04
  config.vm.define "ansible-cl04" do |cl|
     cl.vm.box = "CumulusCommunity/cumulus-vx"
	 cl.vm.box_version = "3.6.0"
	 cl.vm.box_check_update = false
	 cl.vm.provider "virtualbox" do |vb|
	   vb.name = "Ansible-Cumulus04(github_SysNet4Admin)"
	   vb.customize ['modifyvm', :id, '--macaddress1', '080027000064']
	   vb.customize ['modifyvm', :id, '--natnet1', '10.0.64.0/24']
	 end
	 cl.vm.host_name = "ansible-cl04"
	 cl.vm.network "public_network", ip: "192.168.0.64"
	 cl.vm.network "private_network", virtualbox__intnet: "swp2", auto_config: false
	 cl.vm.network "private_network", virtualbox__intnet: "swp3", auto_config: false
	 cl.vm.network "private_network", virtualbox__intnet: "swp4", auto_config: false
	 cl.vm.network "forwarded_port", guest: 22, host: 60064, auto_correct: true, id: "ssh"
	 cl.vm.synced_folder "../data", "/vagrant", disabled: true 
  end  
 
  #================#
  # Ansible Server #
  #================#
  
  config.vm.define "ansible-server" do |cfg|
    cfg.vm.box = "centos/7"
 	cfg.vm.provider "virtualbox" do |vb|
	  vb.name = "Ansible-Server(github_SysNet4Admin)"
	end
	cfg.vm.host_name = "ansible-server"
	cfg.vm.network "public_network", ip: "192.168.0.10"
	cfg.vm.network "forwarded_port", guest: 22, host: 60010, auto_correct: true, id: "ssh"
	cfg.vm.synced_folder "../data", "/vagrant", disabled: true
	cfg.vm.provision "shell", inline: "yum install epel-release -y"
	cfg.vm.provision "shell", inline: "yum install ansible -y"
	cfg.vm.provision "file", source: "ansible_env_ready.yml", 
	  destination: "ansible_env_ready.yml"
	cfg.vm.provision "shell", inline: "ansible-playbook ansible_env_ready.yml"
	cfg.vm.provision "file", source: "cl_auto_pass.yml", destination: "cl_auto_pass.yml"
	cfg.vm.provision "shell", inline: "ansible-playbook cl_auto_pass.yml", 
	  privileged: false
  end
end

ansible_env_ready.yml

---
- name: Setup for the Ansible's Environment
  hosts: localhost
  gather_facts: no
  
  tasks:
    - name: Add "/etc/ansible/hosts"
      blockinfile: 
        path: /etc/ansible/hosts
        block: |
          [spine]
          192.168.0.61  
          192.168.0.62 
          
          [leaf]
          192.168.0.63 
          192.168.0.64 
          
          [cl:children]
          spine  
          leaf  
    
    - name: Create vim env's directories & files
      shell: "{{ item }}"
      with_items:
        - "mkdir -p /home/vagrant/.vim/autoload /home/vagrant/.vim/bundle"
        - "touch /home/vagrant/.vimrc"
        - "touch /home/vagrant/.bashrc"
      
    - name: Install vim-enhanced
      yum: 
        name: vim-enhanced
        state: present
        
    - name: Install git
      yum: 
        name: git
        state: present
        
    - name: Download pathogen.vim
      shell: "curl -fLo /home/vagrant/.vim/autoload/pathogen.vim
              https://tpo.pe/pathogen.vim"
      
    - name: Git clone vim-ansible-yaml
      git:
        repo: https://github.com/chase/vim-ansible-yaml.git
        dest: /home/vagrant/.vim/bundle/vim-ansible-yaml
        
    - name: Configure vimrc
      lineinfile: 
        path: /home/vagrant/.vimrc
        line: "{{ item }}"
      with_items:
        - "set number"
        - "execute pathogen#infect()"
        - "syntax on"

    - name: Configure Bashrc
      lineinfile:   
        path: /home/vagrant/.bashrc
        line: "{{ item }}"
      with_items:
        - "alias ans='ansible'"
        - "alias anp='ansible-playbook'"

cl_auto_pass.yml

---
- name: Create authority between ansible-server and cumulus-nodes
  hosts: cl
  connection: local
  vars:
    ansible_password: vagrant
    ansible_become_pass: CumulusLinux!

  tasks:
    - name: ssh-keyscan for known_hosts file
      command: /usr/bin/ssh-keyscan -t ecdsa {{ ansible_host }}
      register: keyscan
    
    - name: input key    
      lineinfile:
        path: ~/.ssh/known_hosts
        line: "{{ item }}"
        create: yes       
      with_items:
        - "{{ keyscan.stdout_lines }}"
          
    - name: ssh-keygen for authorized_keys file
      command: |
        ssh-keygen -C cumulus@{{ ansible_hostname }} \ 
                   -b 2048 -t rsa -f ~/.ssh/id_rsa -q -N ''
      ignore_errors: yes
      run_once: true

    - name: input key for each node
      connection: ssh
      become: yes
      authorized_key:
        user: cumulus
        state: present
        key: "{{ lookup('file', '~/.ssh/id_rsa.pub') }}"

vm 전체 삭제 후 재생성

vagrant up

인증 확인

cumulus에 대한 인증 추가이므로 유저를 추가해주어야 함

anp cl -m ping
anp cl -m ping --user cumulus

무한재부팅....증상으로 우선 마무리..ㅠㅠ