Master of Puppets: Puppet 원격 구성 관리 시스템을 설치 및 구성합니다. Puppet의 달인: Puppet 원격 구성 관리 시스템 설치 및 구성 Puppet 설치

Puppet을 보다 효과적으로 사용하려면 모듈과 매니페스트가 구축되는 방식을 이해해야 합니다. 이 튜토리얼에서는 Ubuntu 14.04 서버에서 LAMP 스택을 설정하여 이러한 Puppet 구성 요소가 작동하는 방식을 안내합니다.

요구사항

  • Puppet 설치(마스터 및 에이전트) 이에 대해 더 자세히 -.
  • Puppet 에이전트 노드를 제공하기 위해 하나 이상의 Ubuntu 14.04 가상 서버를 생성하는 기능.

꼭두각시 코드 기본 사항

자원

퍼펫 코드는 주로 리소스로 구성됩니다. 리소스는 시스템 상태를 설명하고 필요한 변경 사항을 결정하는 코드 조각입니다. 예를 들어:

user("미첼":
보장하다 => 현재,
uid => "1000",
gid => "1000",
쉘 => "/bin/bash",
집 => "/집/미첼"
}

리소스 선언의 형식은 다음과 같습니다.

resources_type("자원_이름"
속성 => 값
...
}

모든 Puppet 리소스 유형을 보려면 다음 명령을 실행하십시오.

꼭두각시 자원 --유형

이 가이드에서는 리소스 유형에 대해 자세히 알아봅니다.

선언문

매니페스트는 오케스트레이션 스크립트입니다. .pp 확장자를 가진 Puppet 프로그램을 매니페스트라고 합니다. 기본 Puppet 매니페스트는 /etc/puppet/manifests/site.pp입니다.

클래스

일반 프로그래밍 언어와 마찬가지로 클래스는 오케스트레이션의 일부를 구성하고 재사용하는 일을 담당합니다.

클래스 정의 내에는 클래스 작동 방식을 설명하는 코드 블록이 있습니다. 클래스를 정의하면 이를 매니페스트에서 사용할 수 있습니다.

클래스 정의의 형식은 다음과 같습니다.

클래스 예제_클래스(
...
암호
...
}

이 코드는 example_class 클래스를 정의합니다. Puppet 코드는 중괄호 안에 표시됩니다.

클래스 선언은 코드에서 특정 클래스가 호출되는 위치입니다. 클래스 선언을 통해 Puppet은 코드를 처리합니다.

클래스 선언은 일반적일 수 있으며 리소스 유형에 따라 달라질 수 있습니다.

정규 클래스 선언은 include 키워드를 사용하여 코드에 추가됩니다.

example_class 포함

리소스 유형으로 선언되면 클래스는 리소스 형식으로 선언됩니다.

클래스("예제_클래스":)

이 선언을 사용하면 클래스 속성의 기본값을 재정의하는 클래스 매개변수를 코드에 추가할 수 있습니다. 예를 들어:

노드 "host2"(
class ("apache": ) # 아파치 모듈을 사용합니다
apache::vhost ( "example.com": # 가상 호스트 리소스 정의
포트 => "80",
docroot => "/var/www/html"
}
}

모듈

모듈은 오케스트레이션의 개별 부분을 쉽게 공유하고 재사용할 수 있도록 사전 정의된 방식으로 구성된 매니페스트 및 기타 파일의 그룹입니다. 모듈은 코드를 여러 매니페스트로 분리하는 데 사용할 수 있으므로 Puppet 코드를 구성하는 데 도움이 됩니다.

Puppet 모듈은 /etc/puppet/modules 디렉터리에 저장됩니다.

선언문 작성

Ubuntu 서버에 LAMP 스택을 설치하는 예제를 사용하여 Puppet 매니페스트, 모듈 및 클래스 작성을 연습할 수 있습니다(결과는 ).

따라서 Ubuntu 14.04 서버를 조정하고 여기에 LAMP 스택을 설치하려면 다음 작업을 위한 리소스가 필요합니다.

  • apache2 패키지를 설치합니다.
  • apache2 서비스를 시작합니다.
  • 패키지 설치 MySQL 서버, mysql-서버.
  • mysql 서비스를 시작합니다.
  • php5 패키지 설치
  • PHP 테스트 스크립트 info.php를 생성합니다.
  • 각 패키지를 설치하기 전에 적절한 색인을 업데이트하십시오.

아래에는 이러한 LAMP 스택 설정을 달성하는 데 사용할 수 있는 Puppet 코드의 세 가지 예가 나와 있습니다.

첫 번째 예에서는 하나의 파일에 기본 매니페스트를 작성하는 방법을 설명합니다. 두 번째 예는 이전에 작성된 매니페스트를 기반으로 클래스와 모듈을 어셈블하고 사용하는 데 도움이 됩니다. 세 번째 예에서는 사전 구축된 공개 모듈을 사용하여 LAMP 스택을 설치하는 방법을 보여줍니다.

메모: 테스트를 위해서는 새로운 가상 서버를 사용하는 것이 좋습니다.

예 1: 하나의 매니페스트로 LAMP 설치

Puppet 매니페스트는 에이전트 노드에 작성된 다음 puppet Apply 명령을 사용하여 실행할 수 있습니다(이 작업을 수행하기 위해 마스터 및 에이전트 설정이 필요하지 않음).

이 섹션에서는 다음 유형의 리소스 선언을 사용하는 매니페스트를 작성하는 방법을 배웁니다.

  • exec: 명령을 실행합니다.
  • 패키지: 패키지를 설치합니다.
  • 서비스: 서비스 관리.
  • 파일: 파일 관리.

매니페스트 만들기

새 매니페스트를 만듭니다.

sudo vi /etc/puppet/manifests/lamp.pp

필요한 리소스를 선언하려면 다음 코드를 추가하세요.

# "apt-get update" 명령을 실행합니다
exec("apt-update": # 리소스 exec "apt-update"
command => "/usr/bin/apt-get update" # 이 리소스가 실행할 명령
}
# apache2 패키지 설치
package("아파치2":
require => Exec["apt-update"], # 패키지를 설치하기 전에 "apt-update"를 요청합니다.
=> 설치되었는지 확인하세요.
}
# apache2 서비스를 시작합니다
서비스("아파치2":
보장 => 실행 중,
}
# mysql-서버를 설치한다
package("mysql-서버":
require => Exec["apt-update"], # 재설치하여 "apt-update" 요청
=> 설치되었는지 확인하세요.
}
# mysql 서비스를 시작한다
서비스("mysql":
보장 => 실행 중,
}
# php5 패키지 설치
패키지("php5":
require => Exec["apt-update"], # 설치 전에 "apt-update"를 요청합니다
=> 설치되었는지 확인하세요.
}
# info.php 서비스를 시작합니다
파일("/var/www/html/info.php":
보장 => 파일,
내용 => "", # phpinfo 코드
require => Package["apache2"], # "apache2" 패키지 요청
}

매니페스트 적용

새 매니페스트를 사용하려면 다음 명령을 입력하세요.

sudo puppet 적용 --테스트

환경 상태의 모든 변화를 표시하는 방대한 결과가 표시됩니다. 출력에 오류가 없으면 브라우저에서 외부 IP 주소 또는 도메인 이름을 열 수 있어야 합니다. 테스트 테스트가 화면에 나타납니다. PHP 페이지스택에 대한 정보가 있습니다. 이는 Apache와 PHP가 작동하고 있음을 의미합니다.

이제 Puppet을 사용하여 LAMP 스택이 서버에 설치되었습니다.

이는 에이전트에서 실행될 수 있으므로 매우 간단한 매니페스트입니다. Puppet 마스터가 없으면 다른 에이전트 노드는 이 매니페스트를 사용할 수 없습니다.

Puppet 마스터 서버는 30분마다 서버 상태 변경을 확인합니다.

예시 2: 모듈을 사용하여 LAMP 스택 설치

이제 이전 섹션에서 작성한 LAMP 매니페스트를 기반으로 간단한 모듈을 만들어 보십시오.

모듈을 만들려면 모듈 디렉터리에 새 디렉터리를 만듭니다(이름은 모듈 이름과 일치해야 합니다). 이 디렉터리에는 매니페스트 디렉터리와 init.pp 파일이 포함되어야 합니다. init.pp 파일은 Puppet 클래스를 지정합니다(해당 이름은 모듈 이름과도 일치해야 함).

모듈 생성

Puppet 마스터 서버로 이동하여 모듈에 대한 디렉터리 구조를 만듭니다.

CD /etc/puppet/모듈
sudo mkdir -p 램프/매니페스트

편집기에서 init.pp 파일을 만들고 엽니다.

sudo vi 램프/manifests/init.pp

램프 클래스를 파일에 삽입합니다.

수업 램프 (
}

섹션 1의 매니페스트 내용을 복사하여 램프 클래스 블록에 붙여넣습니다. 이제 램프 클래스 정의가 생겼습니다. 다른 매니페스트는 이 클래스를 모듈로 사용할 수 있습니다.

파일을 저장하고 닫습니다.

기본 매니페스트에서 모듈 사용

이제 기본 매니페스트를 구성하고 램프 모듈을 사용하여 서버에 LAMP 스택을 설치할 수 있습니다.

Puppet 마스터 서버에서 다음 파일을 편집합니다.

sudo vi /etc/puppet/manifests/site.pp

아마도 이 순간파일이 비어 있습니다. 다음 줄을 추가합니다.

노드 기본값( )
노드 "램프-1"(
}

메모: lamp-1을 스택을 설치할 Puppet 에이전트의 호스트 이름으로 바꿉니다.

노드 블록을 사용하면 일부 노드에만 적용되는 Puppet 코드를 지정할 수 있습니다.

기본 블록은 개별 블록이 없는 모든 에이전트 노드에 적용됩니다(비워두기). lamp-1 블록은 lamp-1 에이전트 노드에 적용됩니다.

램프 모듈을 사용하는 이 블록에 다음 줄을 추가합니다.

파일을 저장하고 닫습니다.

이제 Puppet 에이전트 노드는 마스터 서버에서 설정을 다운로드하고 LAMP 스택을 설치할 수 있습니다. 지금 바로 변경하려면 에이전트에서 다음 명령을 실행하세요.

sudo puppet 에이전트 --테스트

모듈은 Puppet 코드를 재사용하는 가장 편리한 방법입니다. 또한 모듈은 코드를 논리적으로 구성하는 데 도움이 됩니다.

예 3: 공용 모듈을 사용하여 LAMP 설치

MySQL 모듈도 비슷한 방식으로 사용됩니다. 노드 블록에 다음 줄을 추가합니다.

class("mysql::서버":
root_password => "비밀번호",
}

MySQL 모듈 매개변수를 전달할 수도 있습니다.

info.php를 원하는 위치에 복사할 리소스를 추가합니다. 소스 매개변수를 사용하세요. 노드 블록에 다음 줄을 추가합니다.

file("info.php": # 리소스 파일 이름
path => "/var/www/html/info.php", # 대상 경로
보장 => 파일,
require => Class["apache"], # 사용할 아파치 클래스
source => "puppet:///modules/apache/info.php", # 파일을 복사할 위치
}

이 클래스 선언은 콘텐츠 대신 source 매개변수를 사용합니다. 이 옵션은 파일의 내용을 사용할 뿐만 아니라 복사도 합니다.

Puppet은 puppet:///modules/apache/info.php 파일을 /etc/puppet/modules/apache/files/info.php에 복사합니다.

파일을 저장하고 닫습니다.

info.php 파일을 생성합니다.

sudo sh -c "에코""> /etc/puppet/modules/apache/files/info.php"

이제 Puppet 에이전트 노드는 마스터 서버에서 설정을 다운로드하고 LAMP 스택을 설치할 수 있습니다. 지금 에이전트 환경을 변경하려면 이 노드에서 명령을 실행하세요.

sudo puppet 에이전트 --테스트

이 명령은 현재 노드에 대한 모든 업데이트를 다운로드하고 해당 노드에 스택을 설치합니다. Apache와 PHP가 작동하는지 확인하려면 브라우저에서 노드의 IP 주소 또는 도메인을 엽니다.

http://lamp_1_public_IP/info.php

결론

이제 Puppet 모듈 및 매니페스트 작업에 대한 기본 지식을 갖추었습니다. 간단한 매니페스트와 모듈을 직접 만들어 보세요.

Puppet은 애플리케이션 구성 파일을 관리하는 데 적합합니다.

태그: ,
약간의 시.이 기사가 전체 시리즈의 출발점이 되어야 할 것처럼 보이지만 대상 독자는 Puppet Forge와 제대로 통합되지 않은 개별 모듈에 만족하지 않는 Open Source Puppet Labs 제품의 경험이 더 많은 사용자입니다. 모든 "라이브러리 대 프레임워크" 사례와 마찬가지로 지불해야 할 대가는 통합 솔루션 작성자의 세계관을 따르는 것입니다.

Puppet의 작동 방식에 대해 조금

Puppet은 주로 시스템의 최종 상태를 선언적으로 지정하기 위한 특정 언어입니다. 비교하자면 GNU Makefile은 종속성에 대한 직접적인 설명 외에도 최대한 이상해질 수 있는 경우에 매우 적합합니다.

Puppet의 추상화는 다음과 같습니다( 패턴 깨기 - 프로그래밍 용어에 대해 알고 있던 모든 것을 잊어버리세요!).

  • 마디특정 대상 시스템에 대한 구성 집합입니다. 사실 이것은 클래스의 특별한 경우입니다.
  • 수업노드 구성이나 다른 클래스에 포함된 선언적 논리 집합입니다. 클래스에는 인스턴스나 메서드가 없지만 논리 내에 정의된 매개변수와 변수가 있습니다. 실제로 이는 단순히 코드를 추가하고 평범하지 않은 변수 범위를 가짐으로써 다른 프로시저를 상속할 수 있는 프로시저입니다.
  • 유형- 하지만 이것은 클래식 클래스에 더 가깝습니다. 이름이 있는 인스턴스를 가정하고 확실히 주어진 매개변수, 그러나 그 이상은 아닙니다. 유형의 특정 구현은 다른 유형의 인스턴스를 생성하는 정의를 통해 Puppet 스크립트로 작성되거나 멋진 Ruby 확장으로 작성될 수 있습니다.
  • 자원- 실제로는 Type의 명명된 인스턴스입니다. 각 리소스 이름은 노드(디렉토리) 구성 내의 특정 유형 내에서 고유합니다.
  • 변수- 간단히 말해서 이것들은 상수입니다... Puppet 4 이전에는 범위가 훨씬 더 나빴습니다. 이제는 적절합니다. 정의 위치 외부에서 사용하려면 클래스 상속의 경우를 제외하고 정규화된 식별자를 지정해야 합니다.
Puppet은 네트워크나 관련 인프라 없이 로컬 배포에 사용할 수 있습니다. 이는 컨테이너 이미지를 만드는 데 사용할 수 있습니다. 중앙 집중식 서버의 포기를 옹호하는 전체적인 움직임도 있습니다.

이념적으로 올바른 방식으로 Puppet 인프라는 에이전트(대상 시스템의 권한 있는 서비스)와 에이전트의 요청에 따라 선언적 리소스 디렉터리 형태로 중요한 지침을 배포하는 서버로 구성됩니다. 보안은 개인 공개 키 인프라(X.509) 수준에서 구현됩니다. 간단히 말해서 HTTPS와 동일한 메커니즘이지만 자체 CA 및 필수 확인이 있습니다. 클라이언트 인증서.

단순화된 형태의 배포 절차는 다음과 같습니다.

  1. TLS 및 X.509를 통한 처리(연결 설정, CRL 업데이트, 인증서 제한 사항 확인 등)
  2. 에이전트는 서버로부터 캐싱 및 모든 항목(보다 정확하게는 모듈의 lib/ 폴더에서 모든 항목을 가져옴)과 함께 팩트 생성기를 받습니다. 관심 있는 정보를 수집하기 위해 자신만의 Ruby 스크립트를 추가하는 것은 어렵지 않습니다.
  3. 에이전트는 대상 시스템에 대한 정보를 수집하여 서버로 보냅니다. 모든 사실은 꼭두각시 사실 호출을 통해 수동으로 쉽게 볼 수 있습니다. 이러한 사실은 전역 변수로 사용 가능합니다.
  4. 서버는 리소스 카탈로그를 컴파일하여 에이전트에 보냅니다. 그 아래에는 다양한 개념의 전체 레이어가 있습니다.
  5. 에이전트는 서버에서 필요한 모든 것을 가져와 시스템을 지정된 형식으로 가져옵니다. 에이전트 자체는 리소스로 무엇을 해야할지 모릅니다. 특정 유형의 리소스에 대한 공급자 구현(의미론적 번역은 공급자가 아닌 "구현자"임)에 의존합니다. 일부 공급자는 표준이며 Puppet 패키지에 포함되어 있지만 나머지는 모듈에서 가져옵니다.
모든 즐거움을 즐기기 위해 다음과 같은 형태의 추가 빵이 있습니다.
  • 기준 치수- 선언적 Puppet 스크립트, Puppet용 Ruby 확장, 파일, 파일 템플릿, Hiera 데이터 등의 컬렉션입니다. 더 정확한 용어는 "패키지"입니다.
  • 환경- 스크립트, 모듈 및 Hiera 데이터 세트. 인프라가 복잡해지면서 표준 분할보다 노드별로 구성을 더 분할할 필요가 불가피해졌습니다. 기본적으로 이는 파일럿 혁신과 일반적인 액세스 제어(모든 관리자가 IT 인프라의 모든 노드에 액세스할 수 없는 경우)에 필요합니다.
  • 히에라- 계층적 데이터베이스. 이 공식은 매우 위협적일 수 있습니다. 이것이 아마도 이후 버전의 문서에서 변경된 이유일 것입니다. 실제로 이는 YAML 또는 JSON 파일에서 구성을 추출하는 매우 간단하고 편리한 메커니즘입니다. 계층 구조는 여러 구성 파일의 읽기 순서를 지정하는 기능입니다. 이러한 파일의 계층 구조/우선 순위.
    • Puppet은 함수 호출을 통해 데이터를 가져오는 것 외에도 기본 클래스 매개변수를 가져오는 것이 주요 특징입니다.
    • 물론 Hiera는 사실 보간과 특수 함수 호출도 지원합니다.
    • Puppet 4.3에서는 글로벌 데이터베이스뿐만 아니라 환경 및 모듈에 대한 로컬 데이터베이스도 지원하기 위해 동일한 기능을 다시 구현했습니다. 하지만 작성자는 이미 구현에서 몇 가지 문제를 발견했습니다(PUP-5983, PUP-5952 및 PUP). -5899), 이 문제는 Puppet Labs에서 즉시 수정되었습니다.
    • 계층 구조의 모든 파일에서 값을 추출하기 위해 여러 가지 전략이 지원됩니다.
      • first - 우선순위로 찾은 첫 번째 값이 반환됩니다.
      • 고유 - 모든 값을 1차원 배열로 수집하고 중복 항목을 제거합니다.
      • 해시 - 발견된 모든 YAML 해시를 결합합니다. 중복 키는 우선순위에 따라 선택됩니다.
      • deep은 본질적으로 해시의 재귀 버전입니다.
    • 장점은 lookup() 함수를 호출할 때 샘플링 전략을 지정할 수 있다는 것입니다. cfnetwork 모듈에서 적극적으로 사용되는 특수 lookup_options 키를 통해 모든 계층 파일에 적용됩니다.
  • 퍼핏DB- 기본적으로 관계형 데이터베이스(PostgreSQL)를 중심으로 한 비즈니스 로직 계층으로, 완료된 사실과 배포에 대한 보고서를 저장하고 나중에 다른 노드의 디렉터리로 가져오거나 다음을 통해 선택 항목으로 리소스를 내보낼 수 있습니다. 특수 기능. Puppet Dashboard 형태의 웹 인터페이스도 있습니다.
  • X.509 PKI- 이미 언급한 인증서 인프라로, 별도의 인프라를 관리할 필요 없이 다른 서비스에 사용하기 매우 편리합니다.
  • MCollective- 서버 팜에서 이벤트 기반 작업 시작에 유용한 것으로 보이지만 작성자는 특정 솔루션의 보안에 대해 어느 정도 불신을 갖고 있습니다.
  • 꼭두각시 대장간- 모듈 게시 및 다운로드를 위한 개방형 플랫폼입니다.
  • 컨트롤 형태의 다른 기능 외부 장치 Cisco 장비 유형과 베어메탈 배포에 대해 알아보겠습니다. 그러나 이는 다른 이야기입니다.

보안 및 접근성에 대한 참고 사항

Puppet Server가 전체 IT 인프라의 취약 지점이 된다는 점을 이해해야 합니다. 왜냐하면... 모든 시스템의 최종 구성을 결정합니다. 특별한 경우에는 매우 중요한 인프라 요소를 위한 별도의 서버를 분리하는 것이 합리적입니다. 제한된 액세스수동 업데이트와 그 밖의 모든 업데이트는 두 번째입니다.

Puppet Server의 가용성은 전체 인프라를 관리하는 능력을 결정합니다. 자신의 능력보다 더 안정적이고 빠르게 복구 가능한 타사 클라우드의 가상 머신에서 Puppet Server를 호스팅하는 것이 합리적입니다. 아니면 여러 대의 서버를 설치해야 합니다.

어떤 경우에도 종소리와 휘파람 기능이 있는 Puppet 서버가 배포될 시스템에 다른 서비스를 설치해서는 안 됩니다. 가상화와 컨테이너화가 도움이 될 수 있습니다.

다중 마스터(여러 개의 개별 Puppet 서버)

  • 이 경우 서버 하나만 CA(인증 기관) 역할을 합니다. 서버를 사용할 수 없으면 새 노드를 추가할 수 없습니다.
    • Puppet을 사용하면 기본 제공 인프라가 만족스럽지 않은 경우 타사 X.509 인프라를 사용할 수 있습니다.
  • 전체 구성(환경)은 버전 제어 시스템에 저장되고 각 서버에 동시에 배포되어야 합니다.
  • 유일한 공통점은 고가용성 구성이 이 기사의 범위를 벗어나는 PostgreSQL 데이터베이스입니다.
  • cfpuppetserver 모듈은 기본(CA 포함) 및 보조 서버 설치를 지원합니다.

이전 버전 이후 중요한 변경 사항

제조업체에 자세한 설명이 있습니다.
  • 모든 서비스가 JVM, JRuby 및 Jetty로 이동되었습니다. 통합의 명백한 장점에도 불구하고 메모리 소비 측면에서 단점도 있습니다.
  • 컬렉션 처리를 위해 Lambda 함수가 추가되었습니다. 이제 Ruby에서 목발을 자르거나 create_resources()를 통해 변태할 필요가 없습니다.
  • EPP 템플릿을 처리하는 도구가 나타났습니다. 본질적으로 동일한 ERB이지만 Ruby 대신 Puppet DSL을 사용합니다.
  • 구성 파일의 기본 디렉터리 구조가 크게 변경되었습니다.
  • 환경 및 모듈용 데이터 공급자에 대한 지원이 추가되었습니다(해킹은 더 이상 필요하지 않음).
  • 글로벌 히에라의 역할을 경시합니다. 새로운 관련 명령은 puppet 조회입니다.

설치

이 프로세스는 매우 원시적이지만 특정 단계를 따라야 합니다. 이 작업을 수동으로 수행하는 것은 고마운 작업이므로 저자는 인터넷에서 이해할 수 없는 스크립트를 다운로드하여 시스템의 루트로 실행하는 것과 같은 나쁜 것을 가르쳐 줄 것입니다.

세 가지 주요 서버 구성 요소는 Puppet 서버 자체, PuppetDB 및 PostgreSQL입니다. 그것들은 모두 하나의 노드에 빽빽이 들어차 있을 수도 있고 두 개 또는 세 개의 시스템으로 나눌 수도 있습니다. Puppet Server와 Puppet DB는 여러 번 실행될 수 있지만 PostgeSQL은 단일 실패 지점입니다. PostgeSQL 복제 및 클러스터링에는 다양한 접근 방식이 있는데, 주 ​​서버와 보조 서버의 경우 편리한 접근 방식은 Master + Read-Only Slave이며 이는 PuppetDB 자체에서 주 및 읽기 전용 데이터베이스 노드로 지원되지만 이러한 작업을 자동화합니다. 설정에는 시간이 걸리므로 아직 cfpuppetserver 모듈에 포함되어 사용할 수 없습니다.

구성 자체는 최소한 다음 위치에 간단히 저장할 수 있습니다. 파일 시스템 Puppet Server와 비슷하지만 프로덕션 웹 서버에서 스크립트를 작성하는 것과 같습니다. 가장 적합한 솔루션은 git 저장소입니다. r10k 유틸리티는 저장소의 모든 분기를 가져와 별도의 환경으로 Puppet Server에 배포할 수 있습니다. r10k는 종속성을 가져오는 데 매우 좋지 않으므로 librarian-puppet이 맨 위에 사용됩니다. 주요 표준 Puppet Environment가 "프로덕션"이라는 점을 바로 주목할 가치가 있습니다. 따라서 구성 저장소는 "마스터"가 아닌 "프로덕션"이라는 분기를 사용해야 합니다.

시스템 요구 사항

하드웨어는 제조업체가 직접 설명합니다. cfpuppetserver 모듈은 현재 Debian Jessie+ 및 Ubuntu Trusty+만 지원합니다.

Git의 구성

r10k 자체의 경우 저장소 위치는 그다지 중요하지 않습니다. 가장 중요한 것은 가용성입니다. 예를 들어 테스트 목적으로 저장소를 동일한 시스템에서 호스팅하고 file:// 을 통해 액세스할 수 있습니다. 시작하기 좋은 곳은codingfuture/puppet-exampleenv 구성 예제입니다.
  1. 저장소 복제: git clone https://github.com/codingfuture/puppet-exampleenv my-puppet-conf && cd my-puppet-conf
  2. 설치하다 일반 설정댓글의 힌트를 사용하여 관리자 액세스:
    • $EDITOR 데이터/common.yaml
  3. 노드 구성을 만들어 보겠습니다.
    • $MY_DOMAIN - 루트 도메인 이름(예: example.org)
    • $HOST_NAME - 도메인이 없는 클라이언트 호스트 이름
    • mkdir 데이터/$MY_DOMAIN
    • cp 데이터/example.com/puppet.yaml 데이터/$(MY_DOMAIN)/puppet.yaml
    • $EDITOR nano -w data/$(MY_DOMAIN)/puppet.yaml - 의견의 제안에 따라 Puppet Server로 노드 설정
    • cp 데이터/example.com/host.yaml 데이터/$(MY_DOMAIN)/$(HOST_NAME).yaml
    • $EDITOR nano -w data/$(MY_DOMAIN)/$(HOST_NAME).yaml - 주석의 제안을 기반으로 임의 노드 설정
  4. 자체 Git 서버로 푸시하거나 rsync 또는 scp를 통해 Puppet Server가 있는 노드에서 로컬로 사용할 수 있도록 합니다. Git 서버가 Puppet 자체에서 배포될 때까지 중간 단계로 로컬 저장소가 편리합니다. 어떤 의미에서 이는 여러 단계에서 컴파일러를 조립하는 것을 연상시킵니다.

깨끗한 시스템에 처음부터 설치

cfpuppetserver 모듈을 사용하면 Puppet 자체를 사용하여 모든 것을 설치할 수 있지만 초기 설치의 경우 기본 작업이 Bash 스크립트에 의해 복제됩니다.

대상 시스템에서:

  1. 설치 스크립트 다운로드: wget https://raw.githubusercontent.com/codingfuture/puppet-cfpuppetserver/master/setup_puppetserver.sh
  2. 우리는 스크립트를 살펴보고 눈살을 찌푸립니다. less setup_puppetserver.sh
  3. 실행: bash setup_puppetserver.sh puppet.$(MY_DOMAIN) .
    • 원격 저장소의 예: bash setup_puppetserver.sh ssh:// [이메일 보호됨]/인형-conf
    • 로컬의 예: bash setup_puppetserver.sh file:///root/puppetconf/
  4. 우리는 시스템이 어떻게 부풀어 오르고 모든 것을 매우 빨리 설치하지 않는지 확인합니다.
  5. 저장소가 원격인 경우:
    • 루트용 SSH 키 생성: ssh-keygen -t rsa -b 2048
    • 원격 Git 서버에 공개 키 /root/.ssh/id_rsa.pub를 등록합니다...
    • ... 그리고 다음 명령을 호출하여 Git 후크를 설정합니다: /usr/bin/ssh -T 배포puppet@puppet.$(MY_DOMAIN) ./puppetdeploy.sh
  6. 수동으로 구성 배포를 시작합니다: /etc/puppetlabs/deploy.sh
  7. 서버 자체에서 어떻게 작동하는지 시험해 보겠습니다: /opt/puppetlabs/bin/puppet Agent --test
  8. 네트워크 설정을 확인하세요. 서지 보호기및 SSH 액세스

관리 노드 추가

  1. Puppet 서버의 정규화된 이름은 관리되는 호스트의 DNS를 통해 사용 가능하거나 /etc/hosts에 하드코딩되어야 합니다.
    • 예: echo "128.1.1.1 puppet.example.com" >> /etc/hosts
  2. Puppet Server가 있는 노드에서 다음 스크립트 /root/genclientinit.sh $(HOST_NAME).$(MY_DOMAIN) 을 실행합니다.
  3. 전체 결과를 복사하여 붙여넣으세요. 명령줄대상 시스템에서.
  4. 실행이 끝날 때까지 기다렸다가 /opt/puppetlabs/bin/puppet Agent --test 를 실행합니다. 처음 실행 시 인증서 서명 요청이 생성됩니다.
  5. 인증서에 서명하기 위해 Puppet Server 노드로 이동합니다.
    • 꼭두각시 인증서 목록 - 추가 편집증에 대한 인증서 서명을 확인합니다.
    • 꼭두각시 인증서 서명 $(HOST_NAME).$(MY_DOMAIN) - 실제로 인증서에 서명합니다.
  6. 관리형 노드로 돌아가서 /opt/puppetlabs/bin/puppet Agent --test`를 다시 실행합니다. 그러면 배포 절차가 강제로 시작됩니다.
  7. Puppet Agent를 통해 배포가 완료되기를 기다리고 있습니다.
  8. 이제 최소한의 Puppet 인프라가 준비되었습니다!

/root/genclientinit.sh의 출력 예

세게 때리다</etc/cflocation fi 테스트하는 경우 ! -z ""; 그런 다음 echo -n >/etc/cflocationpool fi 테스트하면! -z "\$http_proxy"; 그런 다음 http_proxy 내보내기 https_proxy="\$http_proxy" 내보내기 HTTP_PROXY="\$http_proxy" 내보내기 HTTPS_PROXY="\$http_proxy" fi echo host.example.com > /etc/hostname 호스트 이름 host.example.com if ! 어느 lsb-릴리스 | 읽다; 그런 다음 apt-get install lsb-release fi codename=\$(lsb_release -cs) if test -z "\$codename"; 그런 다음 echo "올바른 코드명을 감지하지 못했습니다." 종료 1 fi wget https://apt.puppetlabs.com/puppetlabs-release-pc1-\$(codename).deb dpkg -i puppetlabs-release-pc1-\$(codename) .deb mkdir -p /etc/puppetlabs/puppet cat > /etc/puppetlabs/puppet/puppet.conf<꼭두각시 인증서 서명 호스트.example.com" echo "다른 이유로 실패할 경우 Ctrl+C를 사용하여 주기를 중지하세요." sleep 5 done EOT

모듈 설명

초기 설치 스크립트에 대한 Bash 매개변수의 전체 목록

~# ./setup_puppetserver.sh 사용법: ./setup_puppetserver.sh [ [ [ [] ] ] ]
  • r10k_repo_url - Git 저장소의 URI
  • certname - 호스트의 정규화된 도메인 이름
  • cflocation - 팩트 cf_location 초기화
  • cflocationpool - 팩트 cf_location_pool 초기화
  • http_proxy - HTTP 및 HTTPS 요청을 위한 프록시 서버

Puppet 클라이언트 초기화 스크립트에 대한 Bash 매개변수의 전체 목록

~# /root/genclientinit.sh 사용법: ./genclientinit.sh [ [ []]]
매개변수의 의미는 이전 스크립트와 동일합니다.

cfpuppet서버 클래스

  • 배포 사용자 = "deploypuppet" - 구성 업데이트를 자동으로 배포하기 위한 사용자 이름
  • 배포 사용자_auth_keys = undef - $deployuser에 대한 키 목록
  • repo_url = undef - 저장소 URI(예: ssh://user@host/repo 또는 file:///some/path)
  • puppetserver = true - 이 노드에 Puppet 서버 구성 요소를 설치할지 여부
  • puppetdb = true - 이 노드에 PuppetDB 구성 요소를 설치할지 여부
  • puppetdb_port = 8081 - PuppetDB용 포트
  • setup_postgresql = true - 이 노드에 PostgreSQL 구성 요소를 설치할지 여부(PuppetDB 설치가 활성화된 경우에만)
  • service_face = "any" - 들어오는 연결을 수락하기 위한 cfnetwork::iface 리소스의 이름
  • puppetserver_mem = auto - Puppet 서버용 RAM(MB)(최소 192MB)
  • puppetdb_mem = auto - PuppetDB용 RAM(MB)(최소 192MB)
  • postgresql_mem = auto - PostgreSQL용 RAM(MB)(최소 128MB)

클래스 cfpuppetserver::puppetdb

  • postgresql_host = "localhost" - 데이터베이스 주소
  • postgresql_listen = $postgresql_host - 값은 listening_addresses PostgreSQL 지시문으로 직접 이동됩니다.
  • postgresql_port = 5432 - 데이터베이스 포트
  • postgresql_user = "puppetdb" - 데이터베이스의 PuppetDB 사용자
  • postgresql_pass = "puppetdb" - 데이터베이스에 있는 PuppetDB 사용자의 비밀번호
  • postgresql_ssl = false - Puppet PKI 인증서를 기반으로 연결 암호화를 활성화합니다.

클래스 cfpuppetserver::puppetserver

  • autosign = false - DMZ를 제외하고 전투 환경에서는 사용하면 안 됩니다. 테스트 자동화 전용으로 존재합니다.
  • global_hiera_config = "cfpuppetserver/hiera.yaml" - Puppet 캐논에 따른 기본 Hiera 구성 파일의 경로(첫 번째 구성 요소는 모듈 이름이고 나머지는 모듈의 files/ 폴더 아래 경로입니다)

사이트 개발을 위해 일부 자금을 돕고 이체할 수 있습니다.



다수의 Unix 시스템을 관리하는 것은 편리하다고 할 수 없습니다. 하나의 매개변수를 변경하려면 관리자가 각 시스템에 접속해야 하며 스크립트는 부분적으로만 도움이 될 수 있으며 모든 상황에 도움이 될 수는 없습니다.

Windows 네트워크 관리자가 여전히 더 유리한 위치에 있다는 점을 인식해야 합니다. 그룹 정책 설정을 변경하는 것만으로도 충분하며, 잠시 후 최근에 설치된 운영 체제를 포함하여 네트워크의 모든 컴퓨터는 혁신에 대해 "학습"하게 됩니다. 유닉스 개발의 오랜 기간을 되돌아보면 이와 같은 것이 결코 성공하지 못했다는 것을 알게 될 것입니다. 초기 설치에 도움이 되는 kickstart와 같은 솔루션이 있습니다. 운영 체제그러나 추가 개선에는 상당한 노력이 필요합니다. BladeLogic 및 OpsWare와 같은 상용 솔루션은 설정 자동화 문제를 부분적으로만 해결합니다. 주요 장점은 가용성입니다. GUI, 대규모 조직에서만 구입할 수 있습니다. 물론 무료 솔루션을 제공하는 프로젝트도 있지만, 존재하는 동안 대규모 커뮤니티를 만들 수는 없었습니다. 예를 들어, Cfengine은 Linux 외에도 *BSD, Windows 및 Mac OS X에서 사용할 수 있지만 관리자들 사이에서는 그다지 인기가 없습니다. 이는 구성 생성이 상대적으로 복잡하기 때문일 수 있습니다. 작업을 설명할 때 각 특정 시스템의 기능을 고려해야 하며 명령을 실행할 때 작업 순서를 수동으로 제어해야 합니다. 즉, 관리자는 일부 시스템의 경우 다른 시스템의 경우 adduser, 다른 시스템의 경우 useradd를 작성하고 다른 시스템의 파일 위치 등을 고려해야 한다는 점을 기억해야 합니다. 이로 인해 명령을 작성하는 과정이 엄청나게 복잡해지며, 즉석에서 올바른 구성을 생성하는 것이 매우 어렵고 생성된 구성을 잠시 후에 읽는 것이 거의 불가능합니다. GPL 라이센스에도 불구하고 Cfengine은 실제로 모든 변경 사항을 제어하는 ​​1인 프로젝트이며 열린 사회를 구축하는 데 별로 관심이 없습니다. 결과적으로 cfengine의 기능은 개발자에게는 상당히 만족스럽지만 다른 관리자에게는 오히려 골칫거리가 됩니다. cfengine을 개선하기 위해 타사 개발자가 다양한 추가 기능을 만들었으나 이로 인해 상황이 악화되는 경우가 많았습니다. cfengine용 여러 모듈의 작성자인 Luke Kanies는 결국 유사한 도구를 개발하기로 결정했지만 cfengine의 많은 단점은 없었습니다.

인형의 특징

cfengine과 마찬가지로 Puppet은 선언적, 즉 구현을 위한 작업 및 라이브러리를 설명하기 위한 필수 언어를 사용하는 클라이언트-서버 시스템입니다. 클라이언트는 주기적으로(기본적으로 30분) 중앙 서버에 연결하여 최신 구성을 받습니다. 수신된 설정이 시스템 상태와 일치하지 않으면 실행되며, 필요한 경우 수행된 작업에 대한 보고서가 서버로 전송됩니다. 서버는 메시지를 syslog나 파일에 저장하고 RRD 그래프를 생성하여 지정된 이메일로 보낼 수 있습니다. 추가 트랜잭션 및 리소스 추상화 계층은 기존 설정 및 애플리케이션과의 최대 호환성을 제공하므로 세부 명령 및 파일 형식의 구현 및 설명 차이에 대해 걱정하지 않고 시스템 개체에 집중할 수 있습니다. 관리자는 객체 유형으로만 작업하고 Puppet은 나머지를 처리합니다. 따라서 패키지 유형은 약 17개의 패키지 시스템을 알고 있으며 필요한 시스템은 배포판이나 시스템 버전에 대한 정보를 기반으로 자동으로 인식되지만 필요한 경우 패키지 관리자를 강제로 실행할 수 있습니다.

다른 시스템에서 사용할 수 없는 스크립트와는 달리, 타사 관리자가 작성한 Puppet 구성은 대부분 다른 네트워크에서 문제 없이 작동합니다. 꼭두각시 요리책에서 [ http://www.reitivelabs.com/trac/puppet/tags/puppet%2Crecipe] 이미 36개의 기성 레시피가 있습니다. Puppet은 현재 Debian, RedHat/Fedora, Solaris, SUSE, CentOS, Mac OS X, OpenBSD, Gentoo 및 MySQL, LDAP와 같은 운영 체제 및 서비스를 공식적으로 지원합니다.

꼭두각시 언어

앞으로 나아가려면 먼저 언어의 기본 요소와 기능을 이해해야 합니다. 언어는 다음 중 하나입니다. 강점인형. 이를 통해 관리자가 관리할 리소스와 조치를 설명합니다. 대부분의 유사한 솔루션과 달리 Puppet을 사용하면 언어를 통해 이기종 환경의 모든 시스템에 있는 모든 유사한 리소스에 대한 액세스를 단순화할 수 있습니다. 리소스 설명은 일반적으로 이름, 유형 및 속성으로 구성됩니다. 예를 들어, /etc/passwd 파일을 가리키고 해당 속성을 설정해 보겠습니다.

파일("/etc/passwd":

소유자 => 루트,

그룹 => 루트,

이제 서버에 연결된 클라이언트는 /etc/passwd 파일을 복사하고 지정된 속성을 설치합니다. 하나의 규칙에 여러 리소스를 정의하고 세미콜론을 사용하여 구분할 수 있습니다. 서버에서 사용하는 구성 파일이 클라이언트 구성 파일과 다르거나 전혀 사용되지 않는 경우 어떻게 해야 하나요? 예를 들어 다음과 같은 경우에 이러한 상황이 발생할 수 있습니다. VPN 설정사이. 이 경우 source 지시문을 사용하여 파일을 가리킬 수 있습니다. 여기에는 평소와 같이 다른 파일의 경로를 지정하는 두 가지 옵션이 있으며, 파일과 퍼펫이라는 두 가지 URI 프로토콜도 지원됩니다. 첫 번째 경우에는 외부 링크에 대한 링크입니다. NFS 서버, 두 번째 옵션에서는 리소스를 내보내는 NFS와 유사한 서비스가 Puppet 서버에서 시작됩니다. 후자의 경우 기본 경로는 puppet 루트 디렉터리(/etc/puppet)에 상대적입니다. 즉, puppet://server.domain.com/config/sshd_config 링크는 /etc/puppet/config/sshd_config 파일에 해당합니다. filebucket 지시문을 사용하여 이 디렉터리를 재정의할 수 있지만 /etc/puppet/fileserver.conf 파일에서 동일한 이름의 섹션을 사용하는 것이 더 정확합니다. 이 경우 특정 주소에서만 서비스 접근을 제한할 수 있습니다. 예를 들어 config 섹션을 설명하겠습니다.

경로 /var/puppet/config

*.domain.com 허용

192.168.0.* 허용

192.168.1.0/24 허용

*.wireless.domain.com 거부

그런 다음 리소스를 설명할 때 이 섹션을 참조합니다.

소스 => "puppet://server.domain.com/config/sshd_config"

콜론 앞에는 리소스 이름이 있습니다. 가장 간단한 경우에는 별칭이나 변수를 이름으로 지정할 수 있습니다. 별칭은 alias 지시문을 사용하여 설정됩니다. 파일의 전체 경로입니다. 더 복잡한 구성에서는

파일("/etc/passwd":

별칭 => 비밀번호

별칭을 만드는 또 다른 옵션은 다른 운영 체제를 처리해야 할 때 유용합니다. 예를 들어 sshd_config 파일을 설명하는 리소스를 생성해 보겠습니다.

파일(sshdconfig:

이름 => $operatingsystem ? (

솔라리스 => "/usr/local/etc/ssh/sshd_config",

기본값 => "/etc/ssh/sshd_config"

이 예에서 우리는 선택에 직면해 있습니다. Solaris용 파일은 별도로 지정되며, 다른 모든 파일의 경우 /etc/ssh/sshd_config 파일이 선택됩니다. 이제 이 리소스는 sshdconfig로 액세스할 수 있으며, 운영 체제에 따라 원하는 경로가 선택됩니다. 예를 들어, sshd 데몬이 실행 중이고 수신된 경우 새로운 파일, 서비스를 다시 시작해야 합니다.

보장 => 사실,

구독 => 파일

변수는 사용자 데이터를 작업할 때 자주 사용됩니다. 예를 들어, 사용자 홈 디렉터리의 위치를 ​​설명합니다.

$홈루트 = "/홈"

이제 특정 사용자의 파일에 다음과 같이 액세스할 수 있습니다.

$(홈루트)/$name

$name 매개변수는 사용자의 계정 이름으로 채워집니다. 어떤 경우에는 일부 유형에 대한 기본값을 정의하는 것이 편리합니다. 예를 들어, exec 유형의 경우 실행 파일을 찾아야 하는 디렉터리를 나타내는 경우가 많습니다.

Exec(경로 => "/usr/bin:/bin:/usr/sbin:/sbin")

여러 개의 중첩된 파일과 디렉터리를 가리켜야 하는 경우 recurse 매개변수를 사용할 수 있습니다.

파일("/etc/apache2/conf.d":

소스 => “puppet:// puppet://server.domain.com/config/apache/conf.d”,

재귀 => "참"

여러 리소스를 클래스나 정의로 결합할 수 있습니다. 클래스는 시스템이나 서비스에 대한 완전한 설명이며 별도로 사용됩니다.

"/etc/passwd": 소유자 => 루트, 그룹 => 루트, 모드 => 644;

"/etc/shadow": 소유자 => 루트, 그룹 => 루트, 모드 => 440

객체지향 언어와 마찬가지로 클래스도 재정의될 수 있습니다. 예를 들어, FreeBSD에서 이러한 파일의 그룹 소유자는 휠입니다. 따라서 리소스를 완전히 다시 작성하지 않기 위해 Linux 클래스를 상속할 새 클래스 freebsd를 생성해 보겠습니다.

freebsd 클래스는 Linux(

파일[“/etc/passwd”] ( 그룹 => 휠 );

파일[“/etc/shadow”] ( 그룹 => 휠 )

편의를 위해 모든 클래스를 별도의 파일에 배치할 수 있으며, 이는 include 지시문을 사용하여 연결할 수 있습니다. 정의는 여러 매개변수를 인수로 사용할 수 있지만 상속을 지원하지 않으며 재사용 가능한 객체를 설명해야 할 때 사용됩니다. 예를 들어 사용자의 홈 디렉터리와 새 계정을 만드는 데 필요한 명령을 정의해 보겠습니다.

user_homedir 정의($group, $fullname, $ingroups)(

사용자("$이름":

보장하다 => 현재,

코멘트 => "$fullname",

gid => "$그룹",

그룹 => $ingroups,

멤버십 => 최소,

쉘 => "/bin/bash",

집 => "/집/$이름",

필요 => 그룹[$group],

exec("$name 홈디렉터리":

명령 => “/bin/cp -R /etc/skel /home/$name; /bin/chown -R $name:$group /home/$name",

생성 => "/home/$name",

필요 => 사용자[$name],

이제 새로운 것을 만들려면 계정 user_homedir에 문의하세요.

user_homedir("sergej":

그룹 => "sergej",

전체 이름 => “Sergej Jaremchuk”,

그룹 내 => ["미디어", "관리자]

클래스와 같이 상속을 지원하는 노드에 대한 설명이 별도로 있습니다. 클라이언트가 Puppet 서버에 연결되면 해당 노드 섹션을 검색하여 이 컴퓨터에만 해당되는 설정을 제공합니다. 다른 모든 시스템을 설명하려면 노드 기본값을 사용할 수 있습니다. 모든 유형에 대한 설명은 "유형 참조" 문서에 나와 있으며, 최소한 Puppet 언어의 모든 기능을 이해하려면 반드시 읽어야 합니다. 다양한 방식특정 조건이 충족되는 경우(예: 구성 파일 변경)를 포함하여 지정된 명령을 실행하고, cron 작업, 사용자 자격 증명 및 그룹, 컴퓨터, 리소스 마운트, 서비스 시작 및 중지, 패키지 설치, 업데이트 및 제거, 작업 ~와 함께 SSH 키, Solaris 영역 등. 이것은 apt를 사용하여 배포판의 패키지 목록을 매일 2시간에서 4시간 사이에 업데이트하는 것이 얼마나 쉬운지입니다.

일정(매일:

기간 => 매일,

범위 =>

exec("/usr/bin/apt-get 업데이트":

일정 => 매일

해당 기간 동안의 업데이트는 각 시스템에서 한 번만 수행되며, 그 후에는 작업이 완료된 것으로 간주되어 클라이언트 컴퓨터에서 삭제됩니다. Puppet 언어는 조건, 함수, 배열, 주석 등과 같은 다른 친숙한 구조를 지원합니다.

꼭두각시 설치

Puppet에는 OpenSSL 지원 및 XMLRPC 라이브러리와 Faster 라이브러리가 포함된 Ruby(>= 1.8.1)가 필요합니다. http://reitivelabs.com/projects/facter]. 테스트 설치에 사용된 Ubuntu 7.04 저장소에는 강아지 패키지가 이미 포함되어 있습니다.

$ sudo apt-cache 검색 인형

puppet — 네트워크의 중앙 집중식 구성 관리

puppetmaster - 중앙 집중식 구성 관리 제어 데몬

설치 중에 필요한 모든 종속성 패키지(factor libopenssl-ruby libxmlrpc-ruby)가 설치됩니다.

$ sudo apt-get 설치 꼭두각시 puppetmaster

명령을 사용하여 Ruby 라이브러리의 가용성을 확인할 수 있습니다.

$ ruby ​​​​-ropenssl -e "puts:yep"

~$ ruby ​​​​-rxmlrpc/client -e "puts:yep"

오류가 수신되지 않으면 필요한 모든 것이 이미 포함되어 있는 것입니다. 원하는 시스템 구성을 설명하는 파일을 Puppet 용어로 매니페스트라고 합니다. 시작되면 데몬은 /etc/puppet/manifests/site.pp 파일을 읽으려고 시도하며 파일이 없으면 경고 메시지를 표시합니다. 테스트할 때 데몬이 오프라인 모드에서 작동하도록 지시할 수 있습니다. 이 경우 매니페스트가 필요하지 않습니다.

$ sudo /usr/bin/puppetmasterd --nonodes

필요한 경우 클래스 설명 등을 사용하여 다른 파일을 site.pp에 연결할 수 있습니다. 테스트 실행의 경우 이 파일에 가장 간단한 지침을 입력할 수 있습니다.

파일("/etc/sudoers":

소유자 => 루트,

그룹 => 루트,

서버와 클라이언트 모두에 대한 모든 구성 파일은 /etc/puppet에 있습니다. 위에서 설명한 fileserver.conf 파일은 선택 사항이며 Puppet이 파일 서버로도 작동하는 경우에만 사용됩니다. Ubuntu에서 이 파일은 /etc/puppet/files 하위 디렉터리를 내보냅니다. ssl 하위 디렉터리에는 클라이언트 연결 시 암호화에 사용되는 인증서와 키가 포함되어 있습니다. puppetmasterd를 처음 시작할 때 키가 자동으로 생성되며, 명령을 사용하여 수동으로 생성할 수 있습니다.

$ sudo /usr/bin/ puppetmasterd --mkusers.

puppetd.conf와 puppetmasterd.conf 파일은 유사합니다. 이는 클라이언트 시스템 및 서버의 데몬 작동에 대한 일부 매개변수를 나타냅니다. 클라이언트 파일은 puppetmasterd가 실행 중인 컴퓨터를 가리키는 서버 매개변수가 있는 경우에만 다릅니다.

서버 = grinder.com

logdir = /var/log/puppet

vardir = /var/lib/puppet

rundir = /var/run

# 서버에 보고서를 보냅니다

모든 것을 수동으로 입력하지 않으려면 puppetd 자체를 사용하여 템플릿을 만들 수 있습니다.

$ puppetd --genconfig > /etc/puppet/puppetd.conf

마찬가지로 서버에서 site.pp를 만들 수 있습니다.

$ puppetd --genmanifest > /etc/puppet/manifests/site.pp

또 다른 파일인 tagmail.conf를 사용하면 보고서를 보낼 이메일 주소를 지정할 수 있습니다. 가장 간단한 경우에는 한 줄을 사용할 수 있습니다.

모두: [이메일 보호됨]

클라이언트가 서버에 연결하는 데 구성 파일이 충분하지 않습니다. 이렇게 하려면 인증서에도 서명해야 합니다. 먼저 클라이언트 시스템의 새 컴퓨터에 대해 서버에 알리려면 다음 명령을 입력하십시오.

$ sudo puppetd --server grinder.com --waitforcert 60 --test

정보: 인증서 요청 중

경고: 이 SSL 세션에서는 피어 인증서가 확인되지 않습니다.

주의사항: 인증서를 받지 못했습니다.

다른 줄이 반환되면 서버의 작동을 확인해야 합니다.

$ ps 보조 | 그렙 인형

꼭두각시 5779 0.0 1.4 27764 15404 ? Ssl 21:49 0:00 ruby ​​​​/usr/sbin/puppetmasterd

방화벽은 포트 8140에서의 연결을 허용해야 합니다.

서버에서는 서명이 필요한 인증서 목록을 받습니다.

$ sudo puppetca --list

nomad.grinder.com

그리고 클라이언트 인증서에 서명합니다.

$ sudo puppetca – nomad.grinder.com 서명

이제 클라이언트는 자유롭게 서버에 연결하여 설정을 받을 수 있습니다.

불행하게도 기사 내에서 Puppet의 모든 기능을 보여주는 것은 불가능합니다. 그러나 보시다시피 이는 다수의 시스템을 동시에 관리하는 데 따른 대부분의 문제를 해결할 수 있는 기능적이고 유연한 도구입니다. 업무 라인에 여러 시스템을 설정해야 하는 경우. 그리고 가장 중요한 것은 이 프로젝트가 작지만 지속적으로 성장하는 커뮤니티를 모으는 데 성공했다는 것입니다. 그러므로 좋은 아이디어가 죽거나 옆으로 치워지는 일이 없기를 바라자.

인형할 수 있는 크로스 플랫폼 구조입니다. 시스템 관리자코드를 사용하여 일반적인 작업을 수행합니다. 이 코드를 사용하면 새 프로그램 설치부터 파일 권한 확인, 사용자 계정 업데이트까지 다양한 작업을 수행할 수 있습니다. 인형시스템의 초기 설치뿐만 아니라 시스템의 전체 수명주기 동안 우수한 성능을 발휘합니다. 대부분의 경우에 인형클라이언트/서버 구성에 사용됩니다.

이 섹션에서는 설치 및 구성을 보여줍니다. 인형클라이언트/서버 구성에서. 이 간단한 예에서는 설치 방법을 보여줍니다. 아파치사용하여 인형.

설치

설치용 인형터미널에 입력:

Sudo apt-get install puppetmaster

클라이언트 컴퓨터에서 다음을 입력합니다.

Sudo apt-get 설치 꼭두각시

설정

꼭두각시를 설정하기 전에 항목을 추가할 수 있습니다. DNS CNAME을 위한 puppet.example.com, 어디 example.com- 이것은 귀하의 도메인입니다. 기본 클라이언트 인형 puppet.example.com의 DNS를 puppet 서버 이름으로 확인하세요( 퍼펫 마스터). DNS 사용에 대한 자세한 내용은 도메인 이름 서비스를 참조하세요.

DNS를 사용하지 않으려면 서버와 클라이언트의 /etc/hosts 파일에 항목을 추가할 수 있습니다. 예를 들어, /etc/hosts 파일에서 인형서버 추가:

127.0.0.1 localhost.localdomain localhost 꼭두각시 192.168.1.17 meercat02.example.com meercat02

인형클라이언트에서 서버에 대한 항목을 추가합니다.

192.168.1.16 meercat.example.com meercat 인형

IP 주소를 교체하고 도메인 이름예제에서 서버와 클라이언트의 현재 주소와 이름까지.

이제 다음을 위한 몇 가지 리소스를 설정해 보겠습니다. 아파치2. 파일 만들기 /etc/puppet/manifests/site.pp다음을 포함합니다:

패키지( "apache2": verify => 설치됨 ) 서비스( "apache2": verify => true, 활성화 => true, require => 패키지["apache2"] )

노드 "meercat02.example.com"(apache2 포함)

바꾸다 meercat02.example.com현재 이름으로 인형고객.

이 간단한 작업의 마지막 단계 인형서버가 서비스를 다시 시작하는 것입니다.

Sudo /etc/init.d/puppetmaster 재시작

지금 인형모든 것이 서버에 구성되어 있으며 이제 클라이언트를 구성할 차례입니다.

먼저 서비스를 구성해 보겠습니다. 인형에이전트를 실행합니다. /etc/default/puppet을 편집하여 값을 바꿉니다. 시작~에 :

Sudo /etc/init.d/puppet start

다시 돌아가자 인형서버에서 다음 명령을 사용하여 클라이언트 인증서에 서명합니다.

Sudo puppetca --sign meercat02.example.com

확인하다 /var/log/syslog구성 오류가 있는 경우. 모든 것이 잘 되었다면 패키지 아파치2해당 종속성은 다음 위치에 설치됩니다. 인형고객.

이 예는 매우 간단하며 많은 기능과 이점을 보여주지 않습니다. 인형. 을 위한 추가 정보바라보다

세르게이 야렘추크

Puppet을 사용한 UNIX 시스템의 중앙 집중식 구성

다수의 UNIX 시스템을 관리하는 것은 편리하다고 할 수 없습니다. 하나의 매개변수를 변경하려면 관리자가 각 시스템에 접속해야 하며 스크립트는 부분적으로만 도움이 될 수 있으며 모든 상황에 도움이 될 수는 없습니다.

Windows 네트워크 관리자가 여전히 더 유리한 위치에 있다는 점을 인식해야 합니다. 그룹 정책 설정을 변경하는 것만으로도 충분하며, 얼마 후 최근에 설치된 운영 체제를 포함하여 네트워크의 모든 컴퓨터는 혁신에 대해 "학습"하게 됩니다. UNIX 개발의 오랜 기간을 되돌아보면 이와 같은 것이 결코 성공하지 못했다는 것을 알 수 있습니다. 운영 체제의 초기 설치에 도움이 되는 킥스타트와 같은 솔루션이 있지만 추가 개발에는 상당한 노력이 필요합니다. BladeLogic 및 OpsWare와 같은 상용 솔루션은 설정 자동화 문제를 부분적으로만 해결합니다. 주요 장점은 그래픽 인터페이스가 있다는 점이며 대규모 조직에서만 구매할 여유가 있습니다. 물론 무료 솔루션을 제공하는 프로젝트도 있지만, 존재하는 내내 대규모 커뮤니티를 만들 수는 없었습니다. 예를 들어 Cfengine은 관리자들 사이에서 그다지 인기가 없지만 Linux 외에도 *BSD, Windows 및 Mac OS X에서 사용할 수 있습니다. 이는 구성 생성이 상대적으로 복잡하기 때문일 수 있습니다. 작업을 설명할 때는 각 특정 시스템의 특성을 고려하고 명령을 실행할 때 작업 순서를 수동으로 제어해야 합니다. 즉, 관리자는 일부 시스템의 경우 adduser를 작성해야 하고 다른 시스템의 경우 useradd를 작성해야 하며 다른 시스템의 파일 위치를 고려해야 한다는 점을 기억해야 합니다. 이로 인해 명령을 작성하는 과정이 엄청나게 복잡해지며, 즉석에서 올바른 구성을 생성하는 것이 매우 어렵고 생성된 구성을 잠시 후에 읽는 것이 거의 불가능합니다. GPL 라이센스에도 불구하고 Cfengine은 본질적으로 모든 변경 사항을 제어하는 ​​1인 프로젝트이며 열린 사회를 구축하는 데 별로 관심이 없습니다. 결과적으로 Cfengine의 기능은 개발자에게는 상당히 만족스럽지만 다른 관리자에게는 오히려 골치 아픈 일이 됩니다. Cfengine을 개선하기 위해 제3자 개발자가 다양한 추가 기능을 만들었으나 이로 인해 상황이 악화되는 경우가 많았습니다. Cfengine용 여러 모듈의 작성자인 Luke Kanies는 결국 유사한 도구를 개발하기로 결정했지만 Cfengine의 많은 단점은 없었습니다.

인형의 특징

Cfengine과 마찬가지로 Puppet은 선언적 언어를 사용하여 작업을 설명하고 라이브러리를 구현하는 클라이언트-서버 시스템입니다. 클라이언트는 주기적으로(기본적으로 30분마다) 중앙 서버에 연결하여 최신 구성을 받습니다. 수신된 설정이 시스템 상태와 일치하지 않으면 실행되며, 필요한 경우 수행된 작업에 대한 보고서가 서버로 전송됩니다. 메시지 서버는 이를 syslog나 파일에 저장하고 RRD 그래프를 생성하여 지정된 이메일로 보낼 수 있습니다. 추가 트랜잭션 및 리소스 추상화 계층은 기존 설정 및 애플리케이션과의 최대 호환성을 제공하므로 세부 명령 및 파일 형식에 대한 구현 및 설명의 차이에 대해 걱정하지 않고 시스템 개체에 집중할 수 있습니다. 관리자는 객체 유형으로만 작업하고 Puppet은 나머지를 처리합니다. 따라서 패키지 유형은 약 17개의 패키지 시스템을 알고 있으며, 배포판이나 시스템의 버전 ​​정보를 기반으로 필요한 시스템을 자동으로 인식하며, 필요한 경우 패키지 관리자를 강제로 설정할 수 있습니다.

다른 시스템에서는 사용이 불가능한 경우가 많은 스크립트와 달리, 타사 관리자가 작성한 Puppet 구성은 대부분 다른 네트워크에서 문제 없이 작동합니다. Puppet CookBook에는 이미 36가지의 기성 레시피가 있습니다. Puppet은 현재 Debian, RedHat/Fedora, Solaris, SUSE, CentOS, Mac OS X, OpenBSD, Gentoo 및 MySQL, LDAP와 같은 운영 체제 및 서비스를 공식적으로 지원합니다.

꼭두각시 언어

앞으로 나아가려면 먼저 언어의 기본 요소와 기능을 이해해야 합니다. 언어는 Puppet의 강점 중 하나입니다. 관리자가 관리할 리소스와 수행할 작업에 대해 설명합니다. 대부분의 유사한 솔루션과 달리 Puppet을 사용하면 언어를 통해 이기종 환경의 모든 시스템에 있는 모든 유사한 리소스에 대한 액세스를 단순화할 수 있습니다. 리소스 설명은 일반적으로 이름, 유형 및 속성으로 구성됩니다. 예를 들어, /etc/passwd 파일을 가리키고 해당 속성을 설정해 보겠습니다.

파일("/etc/passwd":

소유자 => 루트,

그룹 => 루트,

모드 => 644,

이제 서버에 연결하는 클라이언트는 /etc/passwd 파일을 복사하고 지정된 속성을 설정합니다. 하나의 규칙에 여러 리소스를 정의하고 세미콜론을 사용하여 구분할 수 있습니다. 하지만 서버에서 사용되는 구성 파일이 클라이언트 구성 파일과 다르거나 전혀 사용되지 않는 경우에는 어떻게 될까요? 예를 들어 VPN 연결을 설정할 때 이러한 상황이 발생할 수 있습니다. 이 경우 source 지시문을 사용하여 파일을 가리켜야 합니다. 여기에는 두 가지 옵션이 있습니다. 평소와 같이 다른 파일에 대한 경로를 지정할 수 있고 지원되는 두 가지 URI 프로토콜인 파일과 퍼펫을 사용할 수도 있습니다. 첫 번째 경우에는 외부 NFS 서버에 대한 링크가 사용되며, 두 번째 옵션에서는 리소스를 내보내는 Puppet 서버에서 NFS와 유사한 서비스가 시작됩니다. 후자의 경우 기본 경로는 puppet 루트 디렉터리(/etc/puppet)에 상대적입니다. 즉, puppet://server.domain.com/config/sshd_config 링크는 /etc/puppet/config/sshd_config 파일에 해당합니다. filebucket 지시문을 사용하여 이 디렉터리를 재정의할 수 있지만 /etc/puppet/fileserver.conf 파일에서 동일한 이름의 섹션을 사용하는 것이 더 정확합니다. 이 경우 특정 주소로만 서비스 접근을 제한할 수 있습니다. 예를 들어 구성 섹션을 설명하겠습니다.

경로 /var/puppet/config

*.domain.com 허용

127.0.0.1 허용

192.168.0.* 허용

192.168.1.0/24 허용

*.wireless.domain.com 거부

그런 다음 리소스를 설명할 때 이 섹션을 참조합니다.

소스 => "puppet://server.domain.com/config/sshd_config"

콜론 앞에는 리소스 이름이 있습니다. 가장 간단한 경우에는 파일의 전체 경로를 이름으로 지정할 수 있습니다. 보다 복잡한 구성에서는 별칭이나 변수를 사용하는 것이 더 좋습니다. 별칭은 alias 지시문을 사용하여 설정됩니다.

파일("/etc/passwd":

별칭 => passwd

별칭을 만드는 또 다른 옵션은 다른 운영 체제를 처리해야 할 때 유용합니다. 예를 들어 sshd_config 파일을 설명하는 리소스를 생성해 보겠습니다.

파일(sshdconfig:

이름 => $operatingsystem ? (

솔라리스 => "/usr/local/etc/ssh/sshd_config",

기본값 => "/etc/ssh/sshd_config"

이 예에서 우리는 선택에 직면해 있습니다. Solaris용 파일은 별도로 지정되며, 다른 모든 파일의 경우 /etc/ssh/sshd_config 파일이 선택됩니다. 이제 이 리소스는 sshdconfig로 액세스할 수 있으며, 운영 체제에 따라 원하는 경로가 선택됩니다. 예를 들어, sshd 데몬이 실행 중이고 새 파일이 수신되면 서비스를 다시 시작해야 함을 나타냅니다.

서비스(sshd:

=> true인지 확인하세요.

구독 => 파일

변수는 사용자 데이터를 작업할 때 자주 사용됩니다. 예를 들어, 사용자 홈 디렉터리의 위치를 ​​설명합니다.

$홈루트 = "/홈"

이제 다음과 같이 특정 사용자의 파일에 액세스할 수 있습니다.

$(홈루트)/$name

$name 매개변수는 사용자의 계정 이름으로 채워집니다. 어떤 경우에는 일부 유형에 대한 기본값을 정의하는 것이 편리합니다. 예를 들어, exec 유형의 경우 실행 파일을 찾아야 하는 디렉터리를 지정하는 것이 매우 일반적입니다.

실행( 경로 => "/usr/bin:/bin:/usr/sbin:/sbin" )

여러 개의 중첩된 파일과 디렉터리를 가리켜야 하는 경우 recurse 매개변수를 사용할 수 있습니다.

파일("/etc/apache2/conf.d":

출처 => "puppet:// puppet://server.domain.com/config/apache/conf.d",

재귀 => "참"

여러 리소스를 클래스나 정의로 결합할 수 있습니다. 클래스는 시스템이나 서비스에 대한 완전한 설명이며 별도로 사용됩니다.

클래스 리눅스 (

파일(

"/etc/passwd": 소유자 => 루트, 그룹 => 루트, 모드 => 644;

"/etc/shadow": 소유자 => 루트, 그룹 => 루트, 모드 => 440

객체지향 언어와 마찬가지로 클래스도 재정의될 수 있습니다. 예를 들어, FreeBSD에서 이러한 파일의 그룹 소유자는 휠입니다. 따라서 리소스를 완전히 다시 작성하지 않기 위해 Linux 클래스를 상속할 새 클래스 freebsd를 생성해 보겠습니다.

freebsd 클래스는 Linux(

파일["/etc/passwd"] ( 그룹 => 휠 );

파일["/etc/shadow"] ( 그룹 => 휠 )

편의를 위해 모든 클래스를 별도의 파일에 배치할 수 있으며, 이는 include 지시어를 사용하여 포함해야 합니다. 정의는 여러 매개변수를 인수로 사용할 수 있지만 상속을 지원하지 않으며 재사용 가능한 객체를 설명해야 할 때 사용됩니다. 예를 들어, 사용자의 홈 디렉터리와 새 계정을 만드는 데 필요한 명령을 정의해 보겠습니다.

user_homedir 정의($group, $fullname, $ingroups)(

사용자("$이름":

보장 => 존재,

댓글 => "$fullname",

기드 => "$그룹",

그룹 => $ingroups,

회원 => 최소,

쉘 => "/bin/bash",

집 => "/집/$이름",

필요 => 그룹[$group],

Exec("$name 홈디렉터리":

명령 => "/bin/cp -R /etc/skel /home/$name; /bin/chown -R $name:$group /home/$name",

생성 => "/home/$name",

필요 => 사용자[$name],

이제 새 계정을 만들려면 user_homedir에 문의하세요.

user_homedir("sergej":

그룹 => "sergej",

전체 이름 => "Sergej Jaremchuk",

그룹 내 => ["미디어", " 관리자]

클래스뿐만 아니라 상속을 지원하는 노드에 대한 별도의 설명이 있습니다. 클라이언트가 Puppet 서버에 연결되면 해당 노드 섹션을 검색하여 이 컴퓨터에만 해당되는 설정을 제공합니다. 다른 모든 시스템을 설명하려면 노드 기본값을 사용할 수 있습니다. 모든 유형에 대한 설명은 "유형 참조" 문서에 나와 있으며, 최소한 Puppet 언어의 모든 기능을 이해하려면 반드시 읽어야 합니다. 다양한 유형을 사용하면 특정 조건이 충족되는 경우(예: 구성 파일 변경), cron 작업, 사용자 자격 증명 및 그룹, 컴퓨터, 리소스 마운트, 서비스 시작 및 중지, 패키지 설치, 업데이트 및 제거를 포함하여 지정된 명령을 실행할 수 있습니다. , SSH 키, Solaris 영역 등을 사용하여 작업합니다. 이것은 apt를 사용하여 배포판의 패키지 목록이 매일 2~4시간 사이에 업데이트되도록 쉽게 강제할 수 있는 방법입니다.

일정(매일:

기간 => 매일,

범위 =>

exec("/usr/bin/apt-get 업데이트":

일정 => 매일

해당 기간 동안의 업데이트는 각 시스템에서 한 번만 수행되며, 그 후에는 작업이 완료된 것으로 간주되어 클라이언트 컴퓨터에서 삭제됩니다. Puppet 언어는 조건, 함수, 배열, 주석 등과 같은 다른 친숙한 구조를 지원합니다.

꼭두각시 설치

Puppet에는 OpenSSL 지원 및 XMLRPC 라이브러리와 Faster 라이브러리가 포함된 Ruby(버전 1.8.1 이상)가 필요합니다. 테스트 설치에 사용된 Ubuntu 7.04 저장소에는 강아지 패키지가 이미 포함되어 있습니다.

$ sudo apt-cache 검색 인형

~$ ruby ​​​​-rxmlrpc/client -e "puts:yep"

오류가 수신되지 않으면 필요한 모든 것이 이미 포함되어 있는 것입니다. 원하는 시스템 구성을 설명하는 파일을 Puppet 용어로 매니페스트라고 합니다. 시작되면 데몬은 /etc/puppet/manifests/site.pp 파일을 읽으려고 시도하며 파일이 없으면 경고 메시지를 표시합니다. 테스트할 때 데몬이 매니페스트가 필요하지 않은 독립형 모드에서 작동하도록 지시할 수 있습니다.

$ sudo /usr/bin/puppetmasterd --nonodes

필요한 경우 클래스 설명 등을 사용하여 다른 파일을 site.pp에 연결할 수 있습니다. 테스트 실행의 경우 이 파일에 가장 간단한 지침을 입력할 수 있습니다.

클래스 sudo (

파일("/etc/sudoers":

소유자 => 루트,

그룹 => 루트,

모드 => 440,

노드 기본값(

sudo 포함

서버와 클라이언트 모두의 모든 구성 파일은 /etc/puppet에 있습니다. 이미 설명한 fileserver.conf 파일은 선택 사항이며 Puppet이 파일 서버로도 작동하는 경우에만 사용됩니다. Ubuntu에서 이 파일은 /etc/puppet/files 하위 디렉터리를 내보냅니다. ssl 하위 디렉터리에는 클라이언트 연결 시 암호화에 사용되는 인증서와 키가 포함되어 있습니다. puppetmasterd를 처음 시작할 때 키가 자동으로 생성됩니다. 다음 명령을 사용하여 수동으로 생성할 수 있습니다.

$ sudo /usr/bin/puppetmasterd --mkusers

puppetd.conf와 puppetmasterd.conf 파일은 유사합니다. 이는 클라이언트 시스템 및 서버의 데몬 작동에 대한 일부 매개변수를 나타냅니다. 클라이언트 파일은 puppetmasterd가 실행 중인 컴퓨터를 가리키는 server 매개 변수가 있는 경우에만 다릅니다.

서버 = grinder.com

logdir = /var/log/puppet

vardir = /var/lib/puppet

rundir = /var/run

# 서버에 보고서를 보냅니다

신고 = 사실

모든 것을 수동으로 입력하지 않으려면 puppetd 자체를 사용하여 템플릿을 만들 수 있습니다.

$ puppetd --genconfig > /etc/puppet/puppetd.conf

마찬가지로 서버에서 site.pp를 만들 수 있습니다.

$ puppetd --genmanifest > /etc/puppet/manifests/site.pp

또 다른 파일인 tagmail.conf를 사용하면 보고서를 보낼 이메일 주소를 지정할 수 있습니다. 가장 간단한 경우에는 다음 한 줄을 사용할 수 있습니다.

모두: [이메일 보호됨]

클라이언트가 서버에 연결하는 데 구성 파일이 충분하지 않습니다. 이렇게 하려면 인증서에도 서명해야 합니다.

먼저 서버에 새 컴퓨터에 대해 알리려면 클라이언트 시스템에 다음 명령을 입력합니다.

$ sudo puppetd --server grinder.com --waitforcert 60 –test

방화벽은 포트 8140에서의 연결을 허용해야 합니다.

서버에서는 서명이 필요한 인증서 목록을 얻습니다.

$ sudo puppetca – 목록

nomad.grinder.com

그리고 클라이언트 인증서에 서명합니다.

$ sudo puppetca – nomad.grinder.com 서명

이제 클라이언트는 자유롭게 서버에 연결하여 설정을 받을 수 있습니다.

안타깝게도 기사 내에서 Puppet의 모든 기능을 보여주는 것은 불가능합니다. 그러나 보시다시피 이는 다수의 시스템을 동시에 관리하는 데 따른 대부분의 문제를 해결할 수 있는 기능적이고 유연한 도구입니다. 그리고 가장 중요한 것은 이 프로젝트가 작지만 지속적으로 성장하는 커뮤니티를 모으는 데 성공했다는 것입니다. 그러므로 좋은 아이디어가 죽거나 옆으로 치워지는 일이 없기를 바라자.

행운을 빌어요!

  1. BladeLogic 프로젝트 웹사이트 – http://www.bladelogic.com.
  2. OpsWare 프로젝트 웹사이트는 http://www.opsware.com입니다.
  3. Cfengine 프로젝트 웹사이트는 http://www.cfengine.org이다.
  4. Puppet 프로젝트 웹사이트는 http://reitivelabs.com/projects/puppet입니다.
  5. 꼭두각시 요리책 - http://www.reitivelabs.com/trac/puppet/tagspuppet%2Crecipe.
  6. 더 빠른 라이브러리 –



맨 위