Cloud-Config 스크립팅 소개
소개
최신 배포판에서 사용할 수 있는 cloud-init
프로그램(이 글을 쓰는 시점에는 Ubuntu 14.04 및 CentOS 7만 해당)은 user-data
에서 데이터를 소비하고 실행할 수 있습니다. DigitalOcean 메타데이터 서비스의 필드입니다. 이 프로세스는 찾은 정보의 형식에 따라 다르게 동작합니다. user-data
내에서 가장 많이 사용되는 스크립트 형식 중 하나는 cloud-config 파일 형식입니다.
Cloud-config 파일은 cloud-init 프로세스에서 실행되도록 설계된 특수 스크립트입니다. 일반적으로 서버를 처음 부팅할 때 초기 구성에 사용됩니다. 이 가이드에서는 cloud-config 파일의 형식과 사용법에 대해 설명합니다.
Cloud-Config에 대한 일반 정보
cloud-config
형식은 많은 공통 구성 항목에 대한 선언적 구문을 구현하여 많은 작업을 쉽게 수행할 수 있도록 합니다. 또한 미리 정의된 선언적 기능을 벗어나는 모든 항목에 대해 임의의 명령을 지정할 수 있습니다.
이 "양쪽 세계의 최고\ 접근 방식을 사용하면 파일이 일반적인 작업에 대한 구성 파일처럼 작동하는 동시에 더 복잡한 기능에 대한 스크립트의 유연성을 유지할 수 있습니다.
YAML 포맷팅
파일은 YAML 데이터 직렬화 형식을 사용하여 작성됩니다. YAML 형식은 사람이 이해하기 쉽고 프로그램에서 쉽게 구문 분석할 수 있도록 만들어졌습니다.
YAML 파일은 일반적으로 파일을 읽을 때 이해하기 매우 직관적이지만 이를 제어하는 실제 규칙을 아는 것이 좋습니다.
YAML 파일에 대한 몇 가지 중요한 규칙은 다음과 같습니다.
- 공백이 있는 들여쓰기는 항목 간의 구조 및 관계를 나타냅니다. 더 많이 들여쓰기된 항목은 그 위에 들여쓰기 수준이 낮은 첫 번째 항목의 하위 항목입니다.
- 목록 구성원은 선행 대시로 식별할 수 있습니다.
- 연관 배열 항목은 콜론(:) 다음에 공백 및 값을 사용하여 생성됩니다.
- 텍스트 블록이 들여쓰기됩니다. 서식을 유지하면서 블록을 있는 그대로 읽어야 함을 나타내려면 블록 앞에 파이프 문자(|)를 사용하십시오.
이러한 규칙을 적용하고 형식에만 주의하면서 예제 cloud-config
파일을 분석해 보겠습니다.
#cloud-config
users:
- name: demo
groups: sudo
shell: /bin/bash
sudo: ['ALL=(ALL) NOPASSWD:ALL']
ssh-authorized-keys:
- ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDf0q4PyG0doiBQYV7OlOxbRjle026hJPBWD+eKHWuVXIpAiQlSElEBqQn0pOqNJZ3IBCvSLnrdZTUph4czNC4885AArS9NkyM7lK27Oo8RV888jWc8hsx4CD2uNfkuHL+NI5xPB/QT3Um2Zi7GRkIwIgNPN5uqUtXvjgA+i1CS0Ku4ld8vndXvr504jV9BMQoZrXEST3YlriOb8Wf7hYqphVMpF3b+8df96Pxsj0+iZqayS9wFcL8ITPApHi0yVwS8TjxEtI3FDpCbf7Y/DmTGOv49+AWBkFhS2ZwwGTX65L61PDlTSAzL+rPFmHaQBHnsli8U9N6E4XHDEOjbSMRX user@example.com
- ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDcthLR0qW6y1eWtlmgUE/DveL4XCaqK6PQlWzi445v6vgh7emU4R5DmAsz+plWooJL40dDLCwBt9kEcO/vYzKY9DdHnX8dveMTJNU/OJAaoB1fV6ePvTOdQ6F3SlF2uq77xYTOqBiWjqF+KMDeB+dQ+eGyhuI/z/aROFP6pdkRyEikO9YkVMPyomHKFob+ZKPI4t7TwUi7x1rZB1GsKgRoFkkYu7gvGak3jEWazsZEeRxCgHgAV7TDm05VAWCrnX/+RzsQ/1DecwSzsP06DGFWZYjxzthhGTvH/W5+KFyMvyA+tZV4i1XM+CIv/Ma/xahwqzQkIaKUwsldPPu00jRN user@desktop
runcmd:
- touch /test.txt
이 파일을 보면 여러 가지 중요한 사실을 알 수 있습니다.
첫째, 각 cloud-config
파일은 맨 첫 줄에서 #cloud-config
만으로 시작해야 합니다. 이는 이것이 cloud-config
파일로 해석되어야 함을 cloud-init 프로그램에 알립니다. 이것이 일반 스크립트 파일인 경우 첫 번째 줄은 파일을 실행하는 데 사용해야 하는 인터프리터를 나타냅니다.
위의 파일에는 users
및 runcmd
라는 두 개의 최상위 지시문이 있습니다. 둘 다 키 역할을 합니다. 이러한 키의 값은 키 뒤에 들여쓰기된 모든 행으로 구성됩니다.
users
키의 경우 값은 단일 목록 항목입니다. 다음 수준의 들여쓰기가 목록 항목을 지정하는 대시(-)이고 이 들여쓰기 수준에는 대시가 하나만 있기 때문에 이를 알고 있습니다. users
지시문의 경우 이는 부수적으로 단일 사용자만 정의하고 있음을 나타냅니다.
목록 항목 자체에는 더 많은 키-값 쌍이 있는 연관 배열이 포함되어 있습니다. 이들은 모두 동일한 수준의 들여쓰기에 존재하기 때문에 형제 요소입니다. 각 사용자 속성은 위에서 설명한 단일 목록 항목에 포함되어 있습니다.
주목해야 할 몇 가지 사항은 표시되는 문자열에 인용 부호가 필요하지 않으며 연결을 정의하는 데 불필요한 대괄호가 없다는 것입니다. 인터프리터는 데이터 유형을 매우 쉽게 결정할 수 있으며 들여쓰기는 사람과 프로그램 모두에 대한 항목의 관계를 나타냅니다.
지금쯤이면 YAML 형식에 대한 작업 지식이 있어야 하며 위에서 논의한 규칙을 사용하여 정보 작업을 편안하게 해야 합니다.
이제 cloud-config
에 대한 가장 일반적인 지시어 중 일부를 탐색할 수 있습니다.
사용자 및 그룹 관리
시스템에서 새 사용자를 정의하려면 위의 예제 파일에서 본 users
지시문을 사용할 수 있습니다.
사용자 정의의 일반적인 형식은 다음과 같습니다.
#cloud-config
users:
- first_user_parameter
first_user_parameter
- second_user_parameter
second_user_parameter
second_user_parameter
second_user_parameter
각각의 새 사용자는 대시로 시작해야 합니다. 각 사용자는 키-값 쌍으로 매개변수를 정의합니다. 다음 키를 정의에 사용할 수 있습니다.
- 이름: 계정 사용자 이름입니다.
- primary-group: 사용자의 기본 그룹입니다. 기본적으로 사용자 이름과 일치하는 그룹이 생성됩니다. 여기에 지정된 모든 그룹은 이미 존재하거나 명시적으로 생성되어야 합니다(이 섹션의 뒷부분에서 설명).
- 그룹: 모든 보조 그룹을 쉼표로 구분하여 여기에 나열할 수 있습니다.
- gecos: 사용자에 대한 추가 정보를 위한 필드입니다.
- shell: 사용자에 대해 설정해야 하는 셸입니다. 이것을 설정하지 않으면 아주 기본적인
sh
셸이 사용됩니다. - 만료일: 계정이 만료되어야 하는 날짜(YYYY-MM-DD 형식)
- sudo: 사용자 이름 필드 없이 sudo 권한을 정의하려는 경우 사용할 sudo 문자열입니다.
- lock-passwd: 기본적으로 "True\로 설정되어 있습니다. 사용자가 암호로 로그인할 수 있도록 하려면 "False\로 설정하십시오.
- passwd: 계정의 해시된 암호입니다.
- ssh-authorized-keys:
.ssh
디렉토리에 있는 이 사용자의authorized_keys
파일에 추가해야 하는 완전한 SSH 공개 키 목록입니다. - 비활성: 계정을 비활성으로 설정하는 부울 값입니다.
- 시스템: "True\이면 이 계정은 홈 디렉토리가 없는 시스템 계정이 됩니다.
- homedir: 기본
/home/
을 재정의하는 데 사용되며 그렇지 않으면 생성 및 설정됩니다. - ssh-import-id: LaunchPad에서 가져올 SSH ID입니다.
- selinux-user: 이 계정의 로그인에 사용해야 하는 SELinux 사용자를 설정하는 데 사용할 수 있습니다.
- no-create-home: 사용자를 위한
/home/
디렉토리를 생성하지 않으려면 "True\로 설정합니다. - no-user-group: 사용자와 같은 이름으로 그룹을 만들지 않으려면 "True\로 설정합니다.
- no-log-init: 사용자 로그인 데이터베이스를 시작하지 않으려면 "True\로 설정합니다.
name
키와 같은 일부 기본 정보 외에는 기본값에서 벗어나거나 필요한 데이터를 제공하는 영역만 정의하면 됩니다.
사용자가 인식해야 할 중요한 한 가지는 주어진 값을 즉시 수정하는 메커니즘이 없는 한 프로덕션 시스템에서 passwd
필드를 사용해서는 안 된다는 것입니다. 사용자 데이터로 제출된 모든 정보와 마찬가지로 해시는 서버의 전체 수명 동안 시스템의 모든 사용자가 액세스할 수 있는 상태로 유지됩니다. 최신 하드웨어에서 이러한 해시는 짧은 시간 안에 쉽게 해독될 수 있습니다. 해시조차 노출하는 것은 일회용이 아닌 기계에서 취해서는 안 되는 엄청난 보안 위험입니다.
예제 사용자 정의의 경우 위에서 본 예제 cloud-config
의 일부를 사용할 수 있습니다.
#cloud-config
users:
- name: demo
groups: sudo
shell: /bin/bash
sudo: ['ALL=(ALL) NOPASSWD:ALL']
ssh-authorized-keys:
- ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDf0q4PyG0doiBQYV7OlOxbRjle026hJPBWD+eKHWuVXIpAiQlSElEBqQn0pOqNJZ3IBCvSLnrdZTUph4czNC4885AArS9NkyM7lK27Oo8RV888jWc8hsx4CD2uNfkuHL+NI5xPB/QT3Um2Zi7GRkIwIgNPN5uqUtXvjgA+i1CS0Ku4ld8vndXvr504jV9BMQoZrXEST3YlriOb8Wf7hYqphVMpF3b+8df96Pxsj0+iZqayS9wFcL8ITPApHi0yVwS8TjxEtI3FDpCbf7Y/DmTGOv49+AWBkFhS2ZwwGTX65L61PDlTSAzL+rPFmHaQBHnsli8U9N6E4XHDEOjbSMRX user@example.com
- ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDcthLR0qW6y1eWtlmgUE/DveL4XCaqK6PQlWzi445v6vgh7emU4R5DmAsz+plWooJL40dDLCwBt9kEcO/vYzKY9DdHnX8dveMTJNU/OJAaoB1fV6ePvTOdQ6F3SlF2uq77xYTOqBiWjqF+KMDeB+dQ+eGyhuI/z/aROFP6pdkRyEikO9YkVMPyomHKFob+ZKPI4t7TwUi7x1rZB1GsKgRoFkkYu7gvGak3jEWazsZEeRxCgHgAV7TDm05VAWCrnX/+RzsQ/1DecwSzsP06DGFWZYjxzthhGTvH/W5+KFyMvyA+tZV4i1XM+CIv/Ma/xahwqzQkIaKUwsldPPu00jRN user@desktop
그룹을 정의하려면 groups
지시문을 사용해야 합니다. 이 지시문은 만들고자 하는 그룹 목록만 취한다는 점에서 비교적 간단합니다.
이에 대한 선택적 확장은 만들고 있는 모든 그룹에 대한 하위 목록을 만드는 것입니다. 이 새 목록은 이 그룹에 배치되어야 하는 사용자를 정의합니다.
#cloud-config
groups:
- group1
- group2: [user1, user2]
기존 사용자의 비밀번호 변경
이미 존재하는 사용자 계정의 경우(root
계정이 가장 적절함) chpasswd
지시문을 사용하여 암호를 제공할 수 있습니다.
참고: 이 지시문은 디버깅 상황에서만 사용해야 합니다. 다시 한 번 서버 수명 동안 시스템의 모든 사용자가 값을 사용할 수 있기 때문입니다. 이 지시문과 함께 제출된 암호는 일반 텍스트로 제공되어야 하므로 이 섹션에서는 훨씬 더 관련이 있습니다.
기본 구문은 다음과 같습니다.
#cloud-config
chpasswd:
list: |
user1:password1
user2:password2
user3:password3
expire: False
지시문에는 두 개의 연관 배열 키가 포함되어 있습니다. list
키에는 할당하려는 계정 이름 및 관련 비밀번호를 나열하는 블록이 포함됩니다. expire
키는 처음 부팅할 때 암호를 변경해야 하는지 여부를 결정하는 부울입니다. 기본값은 \True입니다.
한 가지 유의할 점은 비밀번호를 "RANDOM” 또는 "R”로 설정할 수 있으며, 그러면 임의의 비밀번호가 생성되어 /var/log/cloud-init-output.log
에 기록됩니다. . 이 파일은 시스템의 모든 사용자가 액세스할 수 있으므로 더 이상 안전하지 않습니다.
디스크에 파일 쓰기
디스크에 파일을 쓰려면 write_files
지시문을 사용해야 합니다.
작성해야 하는 각 파일은 지시어 아래의 목록 항목으로 표시됩니다. 이러한 목록 항목은 각 파일의 속성을 정의하는 연관 배열입니다.
이 배열에서 유일하게 필요한 키는 파일을 작성할 위치를 정의하는 경로
와 파일에 포함할 데이터를 포함하는 콘텐츠
입니다.
write_files
항목을 구성하는 데 사용할 수 있는 키는 다음과 같습니다.
- 경로: 파일을 작성해야 하는 파일 시스템 위치의 절대 경로입니다.
- 콘텐츠: 파일에 배치해야 하는 콘텐츠입니다. 여러 줄 입력의 경우 "content\ 줄에 파이프 문자(|)를 사용하여 블록을 시작하고 그 뒤에 콘텐츠가 포함된 들여쓰기된 블록이 옵니다. 바이너리 파일에는 "!!binary”와 앞의 공백이 포함되어야 합니다. 파이프 문자로.
- 소유자: 파일의 소유권을 부여받아야 하는 사용자 계정 및 그룹입니다. "사용자 이름:그룹\ 형식으로 지정해야 합니다.
- permissions: 이 파일에 부여되어야 하는 8진수 권한 집합입니다.
- encoding: 파일에 대한 선택적 인코딩 사양입니다. Base64 파일의 경우 "b64\, Gzip 압축 파일의 경우 "gzip\ 또는 조합의 경우 "gz+b64\가 될 수 있습니다. 이 값을 그대로 두면 기본 파일 형식이 사용됩니다.
예를 들어 /test.txt
에 다음 내용으로 파일을 작성할 수 있습니다.
Here is a line.
Another line is here.
이를 수행하는 cloud-config
부분은 다음과 같습니다.
#cloud-config
write_files:
- path: /test.txt
content: |
Here is a line.
Another line is here.
서버에서 패키지 업데이트 또는 설치
패키지를 관리하기 위해 염두에 두어야 할 몇 가지 관련 설정 및 지시문이 있습니다.
Debian 기반 배포판에서 apt 데이터베이스를 업데이트하려면 package_update
지시문을 "true”로 설정해야 합니다. 이는 명령줄에서 apt-get update
를 호출하는 것과 같습니다. .
기본값은 실제로 "true\이므로 비활성화하려는 경우에만 이 지시문에 대해 걱정하면 됩니다.
#cloud-config
package_update: false
서버가 처음 부팅된 후 서버의 모든 패키지를 업그레이드하려면 package_upgrade
지시문을 설정할 수 있습니다. 이는 수동으로 실행되는 apt-get 업그레이드
와 유사합니다.
기본적으로 "false\로 설정되어 있으므로 기능을 사용하려면 "true\로 설정해야 합니다.
#cloud-config
package_upgrade: true
추가 패키지를 설치하려면 "packages\ 지시문을 사용하여 패키지 이름을 나열하면 됩니다. 각 목록 항목은 패키지를 나타내야 합니다. 위의 두 명령과 달리 이 지시문은 yum 또는 apt 관리 배포판에서 작동합니다.
이러한 항목은 두 가지 형식 중 하나를 취할 수 있습니다. 첫 번째는 단순히 패키지 이름이 포함된 문자열입니다. 두 번째 형식은 두 항목이 있는 목록입니다. 이 새 목록의 첫 번째 항목은 패키지 이름이고 두 번째 항목은 버전 번호입니다.
#cloud-config
packages:
- package_1
- package_2
- [package_3, version_num]
"packages\ 지시문은 apt_update
를 true로 설정하여 이전 설정을 무시합니다.
사용자 계정 및 SSH 데몬에 대한 SSH 키 구성
users
지시문에서 SSH 키를 관리할 수 있지만 전용 ssh_authorized_keys
섹션에서 지정할 수도 있습니다. 이들은 첫 번째로 정의된 사용자의 authorized_keys 파일에 추가됩니다.
이것은 users
지시문 내에서 키 사양의 동일한 일반 형식을 사용합니다.
#cloud-config
ssh_authorized_keys:
- ssh_key_1
- ssh_key_2
SSH 서버의 개인 키를 미리 생성하여 파일 시스템에 배치할 수도 있습니다. 이 기능은 클라이언트에 이 서버에 대한 정보를 미리 제공하여 온라인 상태가 되는 즉시 서버를 신뢰할 수 있도록 하려는 경우에 유용할 수 있습니다.
이를 위해 ssh_keys
지시문을 사용할 수 있습니다. 이것은 rsa_private
, rsa_public
, dsa_private
, dsa_public
를 사용하여 RSA, DSA 또는 ECDSA 키에 대한 키 쌍을 가져올 수 있습니다. , ecdsa_private
및 ecdsa_public
하위 항목입니다.
개인 키는 서식 지정 및 줄 바꿈이 중요하므로 이를 지정할 때 파이프 키가 있는 블록을 사용해야 합니다. 또한 키가 유효하려면 시작 키 및 종료 키 행을 포함해야 합니다.
#cloud-config
ssh_keys:
rsa_private: |
-----BEGIN RSA PRIVATE KEY-----
your_rsa_private_key
-----END RSA PRIVATE KEY-----
rsa_public: your_rsa_public_key
신뢰할 수 있는 CA 인증서 설정
인프라가 내부 인증 기관에서 서명한 키에 의존하는 경우 인증서 정보를 삽입하여 CA 인증서를 신뢰하도록 새 시스템을 설정할 수 있습니다. 이를 위해 ca-certs
지시문을 사용합니다.
이 지시문에는 두 개의 하위 항목이 있습니다. 첫 번째는 remove-defaults
로, true로 설정하면 기본적으로 포함된 일반 인증서 신뢰 정보를 모두 제거합니다. 이것은 일반적으로 필요하지 않으며 수행 중인 작업을 모르는 경우 몇 가지 문제가 발생할 수 있으므로 주의하여 사용하십시오.
두 번째 항목은 각각 신뢰할 수 있는 CA 인증서를 포함하는 목록인 trusted
입니다.
#cloud-config
ca-certs:
remove-defaults: true
trusted:
- |
-----BEGIN CERTIFICATE-----
your_CA_cert
-----END CERTIFICATE-----
특정 DNS 서버를 사용하도록 resolv.conf 구성
사용하려는 자체 DNS 서버를 구성한 경우 resolv_conf
지시문을 사용하여 서버의 resolv.conf 파일을 관리할 수 있습니다. 이것은 현재 RHEL 기반 배포판에서만 작동합니다.
resolv_conf
지시문에서 nameservers
, searchdomains
, domain
및 로 설정을 관리할 수 있습니다. 옵션
항목.
nameservers
지시문은 이름 서버의 IP 주소 목록을 가져와야 합니다. searchdomains
지시문은 사용자가 도메인이 아닌 호스트를 지정하는 경우 검색할 도메인 및 하위 도메인 목록을 가져옵니다.
domain
은 확인할 수 없는 요청에 사용해야 하는 도메인을 설정하고 options
에는 resolv.conf 파일에서 정의할 수 있는 옵션 세트가 포함되어 있습니다.
resolv_conf
지시문을 사용하는 경우 manage-resolv-conf
지시문도 true로 설정되어 있는지 확인해야 합니다. 그렇게 하지 않으면 설정이 무시됩니다.
#cloud-config
manage-resolv-conf: true
resolv_conf:
nameservers:
- 'first_nameserver'
- 'second_nameserver'
searchdomains:
- first.domain.com
- second.domain.com
domain: domain.com
options:
option1: value1
option2: value2
option3: value3
더 많은 제어를 위해 임의 명령 실행
cloud-config
에서 제공하는 관리 작업이 수행하려는 작업에 대해 작동하지 않는 경우 임의의 명령을 실행할 수도 있습니다. runcmd
지시문을 사용하여 이 작업을 수행할 수 있습니다.
이 지시문은 실행할 항목 목록을 사용합니다. 이러한 항목은 처리 방법에 영향을 미치는 두 가지 방법으로 지정할 수 있습니다.
목록 항목이 단순 문자열인 경우 전체 항목이 실행할 sh
셸 프로세스로 전달됩니다.
다른 옵션은 execve
가 명령을 처리하는 방식과 유사한 방식으로 각 항목이 실행되는 목록을 전달하는 것입니다. 첫 번째 항목은 실행할 명령 또는 스크립트로 해석되며 다음 항목은 해당 명령의 인수로 전달됩니다.
대부분의 사용자는 이러한 형식 중 하나를 사용할 수 있지만 유연성을 통해 특별한 요구 사항이 있는 경우 최상의 옵션을 선택할 수 있습니다. 모든 출력은 표준 출력 및 /var/log/cloud-init-output.log
파일에 기록됩니다.
#cloud-config
runcmd:
- [ sed, -i, -e, 's/here/there/g', some_file]
- echo "modified some_file"
- [cat, some_file]
서버 종료 또는 재부팅
경우에 따라 다른 항목을 실행한 후 서버를 종료하거나 재부팅해야 할 수도 있습니다. power_state
지시문을 설정하여 이를 수행할 수 있습니다.
이 지시문에는 설정할 수 있는 4개의 하위 항목이 있습니다. delay
, timeout
, message
및 mode
입니다.
지연
은 다시 시작 또는 종료가 발생할 미래의 시간을 지정합니다. 기본적으로 이것은 절차가 즉시 시작됨을 의미하는 "지금\입니다. 지연을 추가하려면 사용자는 +
를 사용하여 경과해야 하는 시간을 분 단위로 지정해야 합니다. 체재.
timeout
매개변수는 지연
카운트다운을 시작하기 전에 cloud-init가 완료될 때까지 대기하는 시간(초)을 나타내는 단위 없는 값을 사용합니다.
message
필드를 사용하면 시스템의 모든 사용자에게 보낼 메시지를 지정할 수 있습니다. mode
는 시작할 전원 이벤트 유형을 지정합니다. 이는 서버를 종료하는 "poweroff\, 서버를 다시 시작하는 "reboot\ 또는 시스템이 최선의 조치(일반적으로 종료)를 결정하도록 하는 "halt\일 수 있습니다.
#cloud-config
power_state:
timeout: 120
delay: "+5"
message: Rebooting in five minutes. Please save your work.
mode: reboot
결론
위의 예는 cloud-config
파일을 실행할 때 사용할 수 있는 보다 일반적인 구성 항목 중 일부를 나타냅니다. 이 가이드에서 다루지 않은 추가 기능이 있습니다. 여기에는 구성 관리 설정, 추가 리포지토리 구성, 서버 초기화 시 외부 URL 등록이 포함됩니다.
/usr/share/doc/cloud-init/examples
디렉터리를 확인하여 이러한 옵션 중 일부에 대해 자세히 알아볼 수 있습니다. cloud-config
파일에 익숙해지는 데 도움이 되는 실용적인 가이드를 보려면 여기에서 cloud-config를 사용하여 기본 서버 구성을 완료하는 방법에 대한 자습서를 따르십시오.