IT 인프라 자동화에 Puppet 모듈을 사용하는 방법은 무엇입니까?



꼭두각시 모듈 작성 및 매니페스트를 사용하여 조직의 IT 인프라를 자동화하고 유지 관리하는 방법에 대해 설명하는 실습 꼭두각시 자습서입니다.

이전에는 시스템 관리자가 셸 스크립트를 사용하여 서버를 실행했지만이 방법은 확장 성이 전혀 없었습니다. 끊임없이 변화하는 수백 또는 수천 개의 서버 및 해당 시스템 구성에 대한 스크립트를 지속적으로 수정하는 것은 어려운 작업입니다.

이 기사에서 꼭두각시 모듈 및 매니페스트 서버 설정, 프로그램 설치 및 시스템 관리를 자동화하기 위해 puppet 모듈을 사용하는 방법을 살펴 보겠습니다.





이 블로그는 다음 주제를 다룹니다.

Puppet 프로그래밍 소개

인형 구성 관리에 널리 사용되는 널리 사용되는 DevOps 도구 중 하나입니다. 그것은 가져 오는 데 사용됩니다 일관성 인프라에서. Puppet은 인프라를 코드로 정의하고, 여러 서버를 관리하고, 시스템 구성을 적용하여 인프라 관리 프로세스를 자동화 할 수 있습니다.



꼭두각시에는자체 구성 언어, 꼭두각시 DSL . 다른 DevOps 프로그램과 마찬가지로 Puppet 변경을 자동화하여 수동 스크립트 기반 변경을 제거합니다.. 그러나 Puppet은 단순한 쉘 언어가 아니며 PHP와 같은 순수한 프로그래밍 언어도 아닙니다. 대신 Puppet은...에 선언적 모델 기반 접근 방식 IT 자동화에. 이를 통해 Puppet은 인프라를 코드로 정의하고 프로그램으로 시스템 구성을 적용 할 수 있습니다.

데모를 시작하기 전에 꼭두각시 프로그래밍의 몇 가지 핵심 측면을 살펴 보겠습니다.

Puppet 프로그래밍의 주요 용어

매니페스트

꼭두각시 프로그램이 호출됩니다. 명백한 및 파일 이름이 .pp 신장. Puppet의 기본 기본 매니페스트는 /etc/puppet/manifests/site.pp . (이것은LDAP 구성, DNS 서버 또는 모든 노드에 적용되는 기타 구성과 같은 글로벌 시스템 구성.



클래스

이러한 매니페스트 내에는 클래스 다른 모듈이 호출 할 수 있습니다. 클래스는 애플리케이션을 실행하는 데 필요한 모든 패키지, 구성 파일 및 서비스와 같은 대규모 또는 중간 크기의 기능 청크를 구성합니다. 클래스를 사용하면 Puppet 코드를 더 쉽게 재사용하고 가독성을 높일 수 있습니다.

자원

Puppet 코드는 대부분 리소스 선언으로 구성됩니다. ㅏ 자원 시스템의 원하는 상태에 대한 특정 요소를 설명합니다. 예를 들어, 특정 파일이 존재하거나 패키지가 설치되어야 함을 포함 할 수 있습니다.

인스턴스 자바는 무엇입니까

Puppet 모듈

메인을 제외하고site.pp명백한,그것은 매니페스트를 저장합니다모듈 .

모든 Puppet 코드는 재사용 및 공유 할 수있는 꼭두각시의 기본 구성 요소 인 모듈로 구성됩니다. 각 모듈은 소프트웨어 설치 및 구성과 같은 인프라의 특정 작업을 관리합니다.

모듈에는 Puppet 클래스, 정의 된 유형, 작업, 작업 계획, 용량, 리소스 유형 및 플러그인 (예 : 사용자 정의 유형 또는 팩트)이 포함됩니다. Puppet에 모듈 설치모듈 경로. Puppet은 모듈 경로의 모든 모듈에서 모든 콘텐츠를로드하여이 코드를 사용할 수 있도록합니다.

모듈-인형 프로그래밍-EdurekaPuppetlabs에는 다음에서 다운로드하여 즉시 사용할 수있는 사전 정의 된 모듈이 있습니다. 퍼펫 포지 . 요구 사항에 맞게 사용자 지정 퍼펫 모듈을 만들 수도 있습니다.

퍼펫 프로그램 워크 플로우

Puppet의 선언적 언어를 사용하여 매니페스트라는 파일에서 원하는 시스템 상태를 설명합니다. 매니페스트는 파일, 패키지 및 서비스와 같은 네트워크 및 운영 체제 리소스를 구성하는 방법을 설명합니다.

Puppet은 매니페스트를 다음으로 컴파일합니다. 카탈로그 각 카탈로그를 해당 노드에 적용하여 t의 구성이그는 노드가 정확합니다인프라 전반에 걸쳐.

데모: Apache 및 MySQL 설치 자동화

꼭두각시 모듈에 대한이 기사는 꼭두각시 모듈을 사용하는 두 가지 방법을 보여주고 방법을 가르쳐주는 실습입니다. 자동화하다 이 두 모듈로 구성된 서버의 설치.

우선, puppet 마스터 서버와 2 개의 puppet 에이전트를 포함하는 Puppet 인프라가 준비되어 있는지 확인하십시오.

  • Puppet Master : Ubuntu 18.04
  • 에이전트 1 : Ubuntu 18.04
  • 에이전트 2 :CentOS7

이 실습에서 얻을 수있는 작업의 개요는 다음과 같습니다.


실습부터 시작하겠습니다.

처음부터 모듈 만들기

이 puppet 모듈에서는 Apache 패키지 다운로드, 파일 구성 및 가상 호스트 설정과 같은 작업을 다룹니다.

  • Puppet Master에서 Puppet의 모듈 디렉토리로 이동하여 Apache 디렉토리를 만듭니다.
    cd / etc / puppet / modules sudo mkdir 아파치
  • apache 디렉터리 내부에서 매니페스트, 템플릿, 파일 및 예제와 같은 하위 디렉터리를 만듭니다.
    cd apache sudo mkdir {manifests, templates, files, examples}
  • 매니페스트 디렉터리로 이동합니다.
    cd 매니페스트
  • 여기에서 해당 코드 섹션의 목표에 따라 모듈을 클래스로 분리합니다.

init.pp -> Apache 패키지 다운로드

params.pp -> 변수 및 매개 변수 정의

config.pp -> Apache 서비스에 대한 구성 파일을 관리합니다.

vhosts.pp -> 가상 호스트를 정의합니다.

이 모듈은 또한 히 에라 (Puppet 코드) 데이터에서 데이터를 분리하는 데 사용되는 기본 제공 키-값 구성 데이터 조회 시스템 각 노드에 대한 변수를 저장합니다.

1 단계 : Apache 패키지 다운로드

init.pp 클래스 만들기

이제 우리는init.pp아파치 패키지를 보관할 매니페스트 디렉토리 아래의 파일.
Apache에 서로 다른 패키지 이름을 사용하는 두 가지 OS (ubuntu 및 CentOS7)가 있으므로 변수를 사용해야합니다.$ apachename.

/etc/puppetlabs/code/environments/production/modules/apache/manifests/init.pp

class apache {package { 'apache': name => $ apachename, ensure => present,}}

꾸러미 리소스는 패키지 관리를 허용합니다. 패키지를 추가, 제거 또는 확인하는 데 사용됩니다.

대부분의 경우 이름 자원 (아파치, 위)는 관리되는 패키지의 이름이어야합니다. 이름 지정 규칙이 다르기 때문에패키지의 실제 이름을와 함께 이름 참고. 그래서 이름 , 아직 정의되지 않은 변수를 호출합니다.$ apachename.

안전하게 하다 참조는 패키지가선물.

params.pp 파일 만들기

그만큼params.pp파일은 필요한 변수를 정의합니다. 이러한 변수를init.pp더 많은 변수를 리소스 유형 자체 외부에서 사용해야하므로params.pp파일에서 변수를 정의 할 수 있습니다.만약여러 클래스에서 사용됩니다.

만들기params.pp파일과 다음 코드.

/etc/puppetlabs/code/environments/production/modules/apache/manifests/params.pp

class apache :: params {if $ :: osfamily == 'RedHat'{$ apachename = 'httpd'} elsif $ :: osfamily == 'Debian'{$ apachename = 'apache2'} else {fail ( '아닙니다. 지원되는 배포판. ')}}

원본 외부 init.pp클래스, 각 클래스 이름은아파치. 이 클래스를 apache :: params . 이중 콜론 뒤의 이름은 파일과 이름을 공유해야합니다. 안만약문은 매개 변수를 정의하는 데 사용되며 인자 , Puppet에는 설치 자체의 일부로 팩터 설치가 있습니다. 여기서 Facter는 운영 체제 제품군 (Osfamily), 그것이 있는지 식별하기 위해빨간 모자또는데비안 기반.

마지막으로 정의 된 매개 변수를 사용하여 params.pp 파일과 매개 변수를init.pp. 이렇게하려면 클래스 이름 뒤, 여는 중괄호 앞에 매개 변수를 추가해야합니다.({).

그래서init.pp이전에 생성 한 내용은 다음과 같습니다.

class apache ($ apachename = $ :: apache :: params :: apachename,) 상속 :: apache :: params {package { 'apache': name => $ apachename, ensure => present,}}

값 문자열 $ :: apache :: params :: value Puppet에게 아파치 모듈, 매개 변수 클래스 뒤에 매개 변수 이름이옵니다. 조각 상속 :: apache :: params 허용init.pp이러한 값을 상속합니다.

2 단계 : 구성 파일 관리

Apache 구성 파일은 Red Hat 기반 시스템에서 작업하는지 Debian 기반 시스템에서 작업하는지에 따라 다릅니다.

이 데모의 끝에서 다음 종속성 파일을 찾을 수 있습니다.httpd.conf(빨간 모자),apache2.conf(데비안).

  • 내용 복사 httpd.conf apache2.conf별도의 파일로 저장하고 파일 예배 규칙서...에서 / etc / puppetlabs / code / environments / production / modules / apache / files .
  • 두 파일을 모두 편집 비활성화 살아 유지. 줄을 추가해야합니다. KeepAlive 끄기 httpd.conf파일. 이 설정을 변경하지 않으려면 각 상단에 주석을 추가해야합니다.파일:
    /etc/puppetlabs/code/environments/production/modules/apache/files/httpd.conf
#이 파일은 꼭두각시로 관리됩니다.

이 파일을init.pp따라서 Puppet은 마스터 서버 및 에이전트 노드 모두에서 이러한 파일의 위치를 ​​인식합니다. 이를 위해 우리는 파일 자원.

/etc/puppetlabs/code/environments/production/modules/apache/manifests/init.pp

file { 'configuration-file': path => $ conffile, ensure => file, source => $ confsource,}

두 개의 다른 위치에 구성 파일이 있으므로 리소스에 일반 이름을 지정합니다. 구성 파일 파일과 함께 통로 매개 변수로 정의통로속성.

안전하게 하다 파일인지 확인합니다.

출처 위에서 만든 파일의 Puppet 마스터 위치를 제공합니다.

열기params.pp파일.

우리는 $ conffile $ confsource내 변수만약성명서:

/etc/puppetlabs/code/environments/production/modules/apache/manifests/params.pp

if $ :: osfamily == 'RedHat'{... $ conffile = '/etc/httpd/conf/httpd.conf'$ confsource = 'puppet : ///modules/apache/httpd.conf'} elsif $ : : osfamily == '데비안'{... $ conffile = '/etc/apache2/apache2.conf'$ confsource = 'puppet : ///modules/apache/apache2.conf'} else {...

시작 부분에 매개 변수를 추가해야합니다.아파치클래스 선언init.pp이전 예제와 유사합니다.

구성 파일이 변경되면 Apache를 다시 시작해야합니다. 이를 자동화하기 위해 서비스 리소스를 사용할 수 있습니다.와 함께 알리다 속성, 구성 파일이 변경 될 때마다 실행할 리소스를 호출합니다.

/etc/puppetlabs/code/environments/production/modules/apache/manifests/init.pp

file { 'configuration-file': path => $ conffile, ensure => file, source => $ confsource, notify => Service [ 'apache-service'],} service { 'apache-service': name => $ 아파치 이름, hasrestart => true,}

서비스 리소스는 Red Hat 및 Debian 시스템에서 Apache 이름을 정의한 이미 생성 된 매개 변수를 사용합니다.
hasrestart 속성은 정의 된 서비스의 재시작을 트리거하는 데 사용됩니다.

3 단계 : 가상 호스트 파일 만들기

시스템 배포에 따라 가상 호스트의 파일이 다르게 관리됩니다. 이 때문에 가상 호스트에 대한 코드를만약문에서 사용 된 것과 유사한params.pp클래스이지만 실제 Puppet 리소스를 포함합니다.

자바 스크립트를 사용하여 HTML의 진행률 표시 줄
  • 내부에서아파치 / 매니페스트 /디렉토리, 생성 및 열기vhosts.pp파일. 뼈대를 추가하십시오만약성명서:

/etc/puppetlabs/code/environments/production/modules/apache/manifests/vhosts.pp

class apache :: vhosts {if $ :: osfamily == 'RedHat'{} elsif $ :: osfamily == 'Debian'{} else {}}

CentOS 7 서버에서 가상 호스트 파일의 위치는 다음과 같습니다./etc/httpd/conf.d/vhost.conf . Puppet 마스터에서 파일을 템플릿으로 만들어야합니다. Ubuntu 가상 호스트 파일에 대해 동일한 작업을 수행하십시오./etc/apache2/sites-available/example.com.conf, 교체example.com서버의 FQDN으로

  • 다음으로 이동 템플릿 내 파일 아파치 모듈을 선택한 다음 가상 호스트에 대한 두 개의 파일을 만듭니다.

Red Hat 시스템의 경우 :
/etc/puppetlabs/code/environments/production/modules/apache/templates/vhosts-rh.conf.erb

ServerAdmin ServerName ServerAlias ​​www. DocumentRoot / var / www // public_html / ErrorLog /var/www//logs/error.log CustomLog /var/www//logs/access.log 결합

Debian 시스템의 경우 :
/etc/puppet/modules/apache/templates/vhosts-deb.conf.erb

ServerAdmin ServerName ServerAlias ​​www. DocumentRoot / var / www / html // public_html / ErrorLog /var/www/html//logs/error.log CustomLog /var/www/html//logs/access.log 결합모두 허가 필요

이 파일에서는 두 개의 변수 만 사용합니다. 관리자 서버 이름 . 우리는 이것들을 노드 단위로 정의 할 것입니다.site.pp파일.

  • 돌아 가기vhosts.pp파일. 이제 생성 된 템플릿을 코드에서 참조 할 수 있습니다.

/etc/puppetlabs/code/environments/production/modules/apache/manifests/vhosts.pp

class apache :: vhosts {if $ :: osfamily == 'RedHat'{file { '/etc/httpd/conf.d/vhost.conf': ensure => file, content => template ( 'apache / vhosts-rh .conf.erb '),}} elsif $ :: osfamily =='Debian '{file {'/etc/apache2/sites-available/$servername.conf ': ensure => file, content => template ('apache /vhosts-deb.conf.erb '),}} else {fail ('지원되는 배포판이 아닙니다. ')}}

두 배급 가족 모두파일각 배포에서 가상 호스트 위치의 제목을 가져옵니다. 데비안의 경우 다시 한 번$ servername값. 그만큼함유량속성은 각 템플릿을 호출합니다..

  • 두 가상 호스트 파일 모두 두 개의 디렉토리를 참조합니다. 기본적으로 시스템에 없습니다. 우리는파일리소스, 각각만약성명서. 완전한vhosts.conf파일은 다음과 유사해야합니다.

/etc/puppetlabs/code/environments/production/modules/apache/manifests/vhosts.pp

class apache :: vhosts {if $ :: osfamily == 'RedHat'{file { '/etc/httpd/conf.d/vhost.conf': ensure => file, content => template ( 'apache / vhosts-rh .conf.erb '),} file {['/ var / www / $ servername ','/ var / www / $ servername / public_html ','/ var / www / $ servername / log ',] : ensure => directory,}} elsif $ :: osfamily == 'Debian'{file { '/etc/apache2/sites-available/$servername.conf': ensure => file, content => template ( 'apache / vhosts-deb. conf.erb '),} file {['/ var / www / $ servername ','/ var / www / $ servername / public_html ','/ var / www / $ servername / logs ',] : ensure => 디렉토리 ,}} else {fail ( '지원되는 배포판이 아닙니다.')}}

4 단계 : 모듈 테스트

  • 다음으로 이동아파치 / 매니페스트 /디렉토리에서 꼭두각시 파서 모든 파일에서 Puppet 코딩에 오류가 없는지 확인합니다.

sudo / opt / puppetlabs / bin / puppet parser validate init.pp params.pp vhosts.pp

아무 문제없이 비어 있어야합니다.

  • 다음으로 이동 내 디렉토리아파치기준 치수. 만들기init.pp파일을 만들고 생성 된 클래스를 포함합니다. 값 바꾸기$ servername$ adminemail자신과 함께 :

/etc/puppetlabs/code/environments/production/modules/apache/examples/init.pp

serveremail = 'webmaster@example.com'$ servername = 'puppet.example.com'include apache include apache :: vhosts
  • 실행하여 모듈 테스트 꼭두각시 적용 와 더불어 – 아니 꼬리표:
    sudo / opt / puppetlabs / bin / puppet apply --noop init.pp

이벤트에서 새로 고침을 트리거하는 오류 및 출력을 반환하지 않아야합니다. Puppet 마스터에 Apache를 설치하고 구성하려면– 아니, 원하는 경우.

  • 기본 Puppet 디렉토리로 다시 이동 한 다음매니페스트폴더 (아니Apache 모듈에있는 것).

cd / etc / puppetlabs / code / environments / production / manifests

만들기site.pp파일,각 에이전트 노드에 대한 Apache 모듈을 포함합니다. 또한 변수를 입력하십시오.관리자 서버 이름매개 변수. 너의site.pp다음과 유사해야합니다.

/etc/puppetlabs/code/environments/production/manifests/site.pp

node 'puppet-agent-ubuntu.example.com'{$ adminemail = 'webmaster@example.com'$ servername = 'puppet.example.com'include apache include apache :: vhosts} node 'puppet-agent-centos.example .com '{$ adminemail ='webmaster@example.com '$ servername ='puppet.example.com 'include apache include apache :: vhosts}

기본적으로 관리 노드의 Puppet 에이전트 서비스는 30 분마다 마스터를 자동으로 확인하고 마스터의 새 구성을 적용합니다. 또한 자동 에이전트 실행 사이에 Puppet 에이전트 프로세스를 수동으로 호출 할 수도 있습니다. 에이전트 노드에서 새 모듈을 수동으로 실행하려면 노드에 로그인하고 다음을 실행하십시오.

sudo / opt / puppetlabs / bin / puppet 에이전트 -t

모듈을 처음부터 만드는 방법을 배웠으므로 이제 puppetlabs의 puppet forge에서 기존 모듈을 사용하는 방법을 알아 보겠습니다.

PuppetForge의 모듈 사용

퍼펫 포지 서버에서 실행할 모듈이 이미 많이 있습니다. 생성 한 모듈만큼 광범위하게 구성 할 수 있으며 처음부터 모듈을 생성 할 필요가 없기 때문에 시간을 절약 할 수 있습니다.

당신이에 있는지 확인하십시오 / etc / puppetlabs / code / environments / production / modules 디렉토리 및 설치 Puppet Forge의 MySQL 모듈 PuppetLabs에 의해. 이것은 또한 모든 전제 조건 모듈을 설치합니다.

cd / etc / puppetlabs / code / environments / production / modules

sudo / opt / puppetlabs / bin / puppet module install puppetlabs-mysql

Hiera를 사용하여 데이터베이스 생성

MySQL 모듈에 대한 구성 파일을 생성하기 전에 모든 에이전트 노드에서 동일한 값을 사용하지 않을 수 있다는 점을 고려하십시오. Puppet에 노드 당 올바른 데이터를 제공하기 위해 Hiera를 사용합니다. 노드마다 다른 루트 암호를 사용하여 다른 MySQL 데이터베이스를 만듭니다.

  • 로 이동/ etc / puppetHiera의 구성 파일 생성hiera.yaml메인에인형예배 규칙서. Hiera의 기본값을 사용합니다.

/etc/puppetlabs/code/environments/production/hiera.yaml

--- 버전 : 5 계층 :-이름 : 공통 경로 : common.yaml 기본값 : data_hash : yaml_data datadir : data
  • 파일 생성common.yaml. 기본값을 정의합니다. 뿌리 MySQL의 비밀번호 :

/etc/puppetlabs/code/environments/production/common.yaml

mysql :: server :: root_password : '비밀번호'

우리는common.yaml파일변수가 다른 곳에서 정의되지 않은 경우. 이는 모든 서버가 동일한 MySQL 루트 암호를 공유한다는 것을 의미합니다. 이러한 암호는 보안을 강화하기 위해 해시 될 수도 있습니다.

  • MySQL 모듈의 기본값을 사용하려면 ‘:: mysql :: server’포함 라인site.pp파일. 그러나이 예에서는 모듈의 일부 기본값을 재정 의하여 각 노드에 대한 데이터베이스를 만듭니다.

편집site.pp다음 값을 가진 파일 :

node 'Puppetagent-ubuntu.example.com'{$ adminemail = 'webmaster@example.com'$ servername = 'hostname.example.com'include apache include apache :: vhosts include mysql :: server mysql :: db { 'mydb_ $ {fqdn} ': 사용자 =>'myuser ', 암호 =>'mypass ', dbname =>'mydb ', 호스트 => $ :: fqdn, grant => ['SELECT ','UPDATE '], 태그 = > $ domain,}} node 'Puppetagent-centos.example.com'{$ adminemail = 'webmaster@example.com'$ servername = 'hostname.example.com'include apache include apache :: vhosts include mysql :: server mysql :: db { 'mydb _ $ {fqdn}': user => 'myuser', password => 'mypass', dbname => 'mydb', host => $ :: fqdn, grant => [ 'SELECT', ' UPDATE '], 태그 => $ domain,}}

Puppet 마스터에서 Puppet 에이전트로 Puppet 모듈 설치 자동화

  • 각 노드에 SSH로 연결하고 다음 명령을 실행하여 각 노드에서 이러한 업데이트를 수동으로 실행할 수 있습니다.

sudo / opt / puppetlabs / bin / puppet 에이전트 -t

  • 그렇지 않으면 관리 노드의 Puppet 에이전트 서비스가 30 분마다 한 번씩 마스터를 자동으로 확인하고 마스터의 새 구성을 적용합니다.

Ubuntu 에이전트에 카탈로그가 성공적으로 적용되었습니다.

CentOS 에이전트에 카탈로그가 성공적으로 적용되었습니다.

따라서 전체 설치는 자동화 카탈로그를 적용하여 에이전트 노드에서.이 데모에 사용 된 코드 파일 및 종속성을 찾을 수 있습니다. 여기 .

Java 용 Eclipse 설정 방법

이 데모가 꼭두각시 모듈 및 매니페스트와 IT 인프라 자동화를위한 사용법에 대한 명확한 아이디어를 얻는 데 도움이 되었기를 바랍니다.이 경우 작업이 매우 쉬워집니다. Puppet Master에서 구성을 지정하면 Puppet 에이전트가 자동으로 기본 매니페스트를 평가하고 Apache 및 MySQL 설정을 지정하는 모듈을 적용합니다. 궁금한 점이 있으면 언제든지 게시 해주세요. .

이걸 찾았다면 퍼펫 튜토리얼 관련된, 체크 아웃 전 세계에 250,000 명 이상의 만족 한 학습자 네트워크를 보유한 신뢰할 수있는 온라인 학습 회사 인 Edureka에서 Edureka DevOps 인증 교육 과정은 학습자가 SDLC의 여러 단계를 자동화하기 위해 Puppet, Jenkins, Nagios 및 GIT와 같은 다양한 DevOps 프로세스 및 도구에 대한 전문 지식을 습득하는 데 도움이됩니다.