Ansible: 작업 수행, 구성 및 범위 확인 및 제어

12937 단어 devopsansible
Ansible는 강력한 도구로서 인프라를 더욱 잘 제어할 수 있습니다.내가 Ansible 코드를 개발하여 집에서 인프라를 설치하고 유지할 때, 나는 우선 대부분의 스크립트를 하나의 파일로 작성한다.구조가 점점 복잡해지는 것을 깨닫게 될 때까지, 필요한 각본을 찾는 데 상당한 시간이 걸렸다는 것을 알게 될 때까지 좋은 시간이었다.그리고 저는 코드 라이브러리를 적당한 레이아웃으로 재구성했습니다. 모든 시나리오와 캐릭터를 포함하는 중심 시나리오 site.yml입니다.하지만 지금 나는 특정 노드에서 특정 임무만 실행하는 문제를 해결하기 위해 노력하고 있다.
본 논문에서, 나는 Ansible 명령줄을 사용하여 실행할 작업, 대상 호스트, 심지어 작업의 사용자 정의 배열을 제어하는 방법을 보여 드리겠습니다.Ansible 개념을 복습하려면 각주 1을 읽으십시오.
본문은 최초로 my blog에 발표되었다.

내 홈 인프라 프로젝트의 목록 레이아웃
실행 예시로 홈 인프라 프로젝트의 디렉터리 레이아웃과 파일을 보여 드리겠습니다.
최상위 수준에는 다음과 같은 디렉토리와 파일이 있습니다.
├── group_vars
├── host_vars
├── roles
├── scripts
├── site.yml
roles은 각 노드에 설치된 기본 소프트웨어를 정의합니다.
├── roles
│   ├── consul
│   └── nomad
│   └── dns
│   ├── docker-arch
│   ├── docker-arm
│   ├── nfs-client
│   ├── nfs-server
├── site.yml
scripts에는 노드에 nomad 작업이나 시스템 유지 보수 작업을 배치하는 등 선택한 수의 호스트에서 수행하는 작은 작업이 포함됩니다.
├── scripts
│   ├── consul
│   ├── nomad
│   ├── tutorial
│   └── uninstall
│   ├── system
│   │   ├── clean_docker.yml
│   │   ├── connection_test.yml
│   │   ├── install_package_on_arch.yml
│   │   ├── install_package_on_debian.yml
│   │   ├── reboot.yml
│   │   ├── rotate_ssh_key.yaml
│   │   ├── shutdown.yml
│   │   └── update_packages.yml
모든 역할과 일부 스크립트는 site.yml으로 정의됩니다.Docker, Nomad, Consor, DNS 및 NFS 서비스를 사용하여 모든 노드의 幂等式 시나리오를 설정합니다.
그렇다면 어떻게 site.yml 시나리오를 완전히 운행하지 않은 상황에서 그 중 일부만 임무를 수행할 수 있을까?계속 읽어...

집행 전 대본 검사
긴 임무를 실행하기 전에, 당신의 대본이 유효한지, 그리고 그것이 발생하는지 확인하는 것이 좋습니다.나는 스크립트를 실행하기 전에 네 가지 다른 유형의 검사를 하는 것을 강력히 건의한다.

문법 검사
우선 대본을 집행할 때 모든 스크립트를 사용해야 한다면 표기 --check-syntax 검사 문법을 사용해야 한다.
>> ansible-playbook site.yml --syntax-check

OK playbook: site.yml
만약 어떤 오류가 있다면, 예를 들어 어떤 역할에서 유용한 정보를 얻을 수 있습니다.
>> ansible-playbook site.yml --syntax-check
ERROR! Syntax Error while loading YAML.
  mapping values are not allowed in this context

The error appears to be in '[...]/roles/dns/tasks/main.yml': line 7, column 15, but may
be elsewhere in the file depending on the exact syntax problem.

The offending line appears to be:

  - name: Configure dnsmasq
      template:
              ^ here

영향 받는 호스트 목록
그 다음으로 영향을 받을 호스트를 살펴보자.
>> ansible-playbook site.yml --list-hosts

playbook: site.yml

  play #1 (all): Install consul TAGS: [consul]
    pattern: ['all']
    hosts (6):
      raspi-3-1
      raspi-0
      raspi-4-1
      minas
      raspi-4-2
      raspi-3-2

모든 작업 나열
셋째, --list-tasks 로고를 사용하여 수행할 임무를 자세히 살펴본다.
>> ansible-playbook site.yml --list-tasks

playbook: site.yml

  play #1 (all): Install consul TAGS: [consul]
    tasks:
      command   TAGS: [consul]
      consul : Check if current consul version is installed     TAGS: [consul]
      consul : Set vars when architecture is armv7l     TAGS: [consul]
      consul : Set vars when architecture is armv6l     TAGS: [consul]
      consul : Set vars when architecture is x86_64     TAGS: [consul]
      consul : Create consul group      TAGS: [consul]
      consul : Create consul user       TAGS: [consul]
      consul : Create consul dir        TAGS: [consul]
      consul : Get consul binary        TAGS: [consul]
      consul : Unzip consul binary      TAGS: [consul]
      consul : Create symlink           TAGS: [consul]

모든 변경 사항을 자세히 설명하기 위해 시험 실행
마지막으로, --check --diff을 통해 시험 운행을 진행하고 노드에 적용되는 모든 단계의 결과를 볼 수 있습니다.이 수표는 특히 중요하다!중요한 시스템 파일을 수정할 때 그것을 실행합니다. 예를 들어 그림에서 보듯이 /etc/fstab 파일에 새 줄을 추가합니다.
>> ansible-playbook site.yml --check --diff


TASK [nfs-server : Install software] ****************************************
The following NEW packages will be installed:
  nfs-kernel-server
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
changed: [minas]

TASK [nfs-server : Create mount dir] ****************************************
--- before
+++ after
@@ -1,4 +1,4 @@
 {
     "path": "/mnt/nfs",
-    "state": "absent"
+    "state": "directory"
 }

changed: [minas]

TASK [nfs-server : Create fstab entry] ****************************************
--- before: /etc/fstab (content)
+++ after: /etc/fstab (content)
@@ -8,3 +8,4 @@
 UUID=BB43-B9B6                            /boot/efi      vfat    defaults,noatime 0 2
 UUID=1ece07a6-5072-4f25-aed0-27e01b0ded17 /              ext4    defaults,noatime 0 1
 192.168.2.203:/mnt/nfs  /mnt/nfs nfs defaults,soft,bg,noauto,rsize=32768,wsize=32768,noatime  0 0
+/dev/sda1 /mnt/nfs ext3 defaults,user 0 1

changed: [minas]

TASK [nfs-server : Configure nfs access] ****************************************
--- before: /etc/exports (content)
+++ after: /etc/exports (content)
@@ -0,0 +1 @@
+/mnt/nfs 192.168.2.0/24(rw,sync,no_subtree_check,no_root_squash)

changed: [minas]
좋아요!이 점에서 당신은 당신의 대본에 어떤 변화가 일어날지 잘 이해했다.계속합시다.

작업 실행 제어
임무를 완수하고 올바른 호스트를 목표로 하는 것이 확실하다는 것을 확인하면 임무를 수행하겠습니다.예를 들어 내 site.yml에서 나는 모든 노드에 DNS 해석을 설정할 수 있다.
- name: Configure DNS
  hosts:
    - all
  tags:
    - dns
  become: true
  roles:
    - dns
그러나 이 극본은 서류의 중간에 놓여 있다.나는 어떻게 해야만 이 특정한 게임을 집행할 수 있습니까?

특정한 극본을 집행하다
가장 좋은 선택은 탭을 적용하고 사용하는 것이다.라벨은 극중 캐릭터나 임무에 적용되는 모든 라벨입니다.위에서 보듯이 나는 간단한'tag to role'성명을 사용했다.특정 태그만 사용하여 재생을 실행하려면 --tags 플래그를 사용합니다.이 플래그에 개별 또는 태그 세트를 전달할 수 있습니다.
지금 DNS 재생만 실행하고 싶으면 ansible-playbook site.yml --tags consul을 실행합니다.다른 선택은 이름, 예를 들어 ansible-playbook site.yml --start-at-task="Install consul"을 사용하는 것이지만 라벨이 첫 번째 선택이다.

극중에서 특정 임무를 수행하다
만약 네가 시작하고 싶은 대본에 몇 개의 하위 임무가 있는데, 네가 전부 집행하고 싶지 않다면 어떻게 해야 합니까?--step 플래그만 추가하면 됩니다.작업을 수행하기 전에 계속할지 묻는 프롬프트가 열립니다.질문에 답하거나 언제든지 ctrl-c을 입력하여 플레이북 실행을 중지하십시오.
ansible-playbook -i hosts site.yml --tags "dns" --step

PLAY [Install consul]
****************************************


PLAY [Install nomad]
****************************************


PLAY [Configure DNS]
****************************************

Perform task: TASK: dns : Install dnsmasq on raspi-3-1 (N)o/(y)es/(c)ontinue:

특정 호스트에서만 작업 수행
대본을 현장에서 테스트하고 싶을 때, 전체 목록을 수정하기 전에 호스트 하나만 수정하는 것이 유용하다.유용한 --limit은 당신이 필요로 하는 것입니다.
>> ansible-playbook -i hosts site.yml --tags "dns" --limit minas

TASK [dns : Install dnsmasq]
****************************************

ok: [minas]

TASK [dns : Configure dnsmasq]
ok: [minas]
이제 중심 시나리오에서 임무를 선택하는 방법을 알게 되었습니다.한 가지 일만 남았다.

임무를 조율하다
당신이 대본을 집행할 때, 모든 대본에서 모든 배역이 먼저 집행하고, 그 다음에 임무를 수행하며, 쓴 순서에 따라 위에서 아래로 내려간다.만약 네가 다른 방식으로 그것들을 편성하고 싶다면, 라벨도 너를 도울 수 있다.모든 작업과 역할에 여러 태그를 적용할 수 있습니다.예를 들어 소프트웨어를 설치할 모든 작업은 install으로 표시하고 프로필을 복사하는 모든 작업은 config으로 표시할 수 있다.그리고 이 라벨로 대본을 집행한다. ansible-playbook site.yml --tags "install, config".

결론
이 문서는 복잡한 Ansible 시나리오를 보다 효과적으로 사용하는 방법을 보여 줍니다.우선 집행 전에 대본을 어떻게 점검해야 하는가.문법 검사를 어떻게 실행하는지, 작업과 영향을 받은 호스트의 목록을 어떻게 보는지, 시험 실행을 어떻게 하는지 배웠습니다.작업이 중요한 시스템 프로필에 영향을 미칠 때, 시험 실행은 특히 중요하다.--check 국기를 자주 사용하는 건강 습관을 기르다.그 다음에 특정한 재생과 재생 중인 작업만 수행하는 법을 배웠습니다.라벨은 너에게 매우 큰 유연성을 준다.당신의 대본에 그것들을 적용하는 것은 임무와 캐릭터와 유사하다.그리고 위의 한 차원에서 생각해서 프로필을 수정하는 임무를 확정하고 소프트웨어를 설치하는 임무를 확정하고 그룹을 나누어 표시한다.일단 표시가 자리에 앉으면 구체적으로 실행할 수 있다.또한 이를 --step 로고와 결합시켜 수행된 임무를 제시한다.네가 라벨을 일치하게 정의할 때, 너는 대본의 집행을 마음대로 편성할 수 있다.

각주
다음은 상세 정보:
시나리오
  • Plays: 호스트 그룹
  • 에서 실행되는 작업 그룹
  • 작업: 호스트에 적용되는 특정 작업
  • 역할: 호스트에 대해 사용자 정의 역할을 수행하는 일련의 작업 제공
  • 좋은 웹페이지 즐겨찾기