서버에서 더 이상 사용되지 않는 역할에서 물건을 정리하는 방법?


15

관련 Ansible 역할이 설치 nginx되고 일부 필수 구성을 수행 /etc/nginx하고 방화벽에서 포트 80 및 443을 여는 웹 서버 인 호스트가 있다고 가정합니다 .

어떤 시점에서 특정 호스트가 더 이상 웹 서버가 아니기를 원합니다. 어떤 이유로 든 다른 곳으로 서비스를 옮겼 기 때문입니다. [webservers]인벤토리에서 서버를 제거하면 서버에 쓰레기가 남습니다. 이상적으로는 설치 nginx제거, /etc/nginx디렉토리 (및 다른 디렉토리) 를 제거 하고 방화벽에서 포트 80 및 443을 닫고 싶습니다 .

꼭두각시에서 나는 이것을 할 수 있습니다. 웹 서버 인 호스트는 다음과 같이 구성됩니다.

class { 'nginx':
  ensure => present,
}

내가해야 할 일은 "present"를 "absent"로 바꾸는 것입니다. 경우 nginx클래스가 잘 작성된 것입니다, 그것이 만든 변경 사항을 취소합니다. 일반적으로 관리자는 "present"를 "absent"로 바꾸고 나중에 영향을받는 모든 호스트가 구성을 취소 한 것으로 확인되면 해당 항목을 매니페스트에서 제거합니다.

또한 Puppet 방화벽 모듈은 더 이상 매니페스트에서 찾을 수없는 방화벽 규칙을 자동으로 제거한다고 생각합니다. 따라서 방화벽의 경우 위의 "부재"를 수행하지 않아도 방화벽이 자동으로 닫힙니다.

Ansible로 이러한 것들을 어떻게 달성 할 수 있습니까?


1
귀하의 질문 자체에는 가치가 없지만 가상의 질문은 실제로 여기서 생각하는 주제가 아닙니다. 대신에 "하자가 ... 척" 바꿔 및 예를 들어 말을 "꼭두각시에 나는 서버 역할을 변경하고 제거 nginx를 변경하여 이전에 설치 한 수 ensure => present ensure => absent도 ... 어떻게 ansible와 동일한 기능을 수행 할 것이다" 등 이상적를 이미 시도한 것의 예와 함께.
HBruijn

2
나는 Ansible이 실제로 이런 종류의 것을 위해 설계된 것은 아니라고 주장합니다. 재생 가능한 일회용 서버를 대상으로합니다. 머신이 더 이상 웹 서버가되고 싶지 않다면, 용도를 바꾸지 말고 닦으십시오 (클라우드 인스턴스 인 경우 종료).
ceejayoz

@ceejayoz 내가 Ansibles에 대해 가장 많이 읽은 것은 Orson Scott Card Card의 Ender 's Game & sequals에 있지만 클라우드 오케스트레이션에서 많은 의미가 있습니다.
HBruijn

@ceejayoz : 현재 다중 서버 설정에는 Ansible을 사용하지 않고 소규모 자율 서버를 구성합니다. 이것이 올바른 사용법이라고 생각합니다. 따라서 서버는 nginx + django + PostgreSQL을 가질 수 있습니다. 나중에 nginx 또는 nginx + django를 다른 곳에두기로 결정하면 전체 서버를 지우고 백업에서 PostgreSQL을 다시 가져와야하는 것은 다운 타임은 말할 것도 없습니다.
Antonis Christofides

답변:


10

Ansible을 사용하면 꼭두각시로하는 것과 다른 방식으로이 작업을 수행 할 수 없습니다.

당신이 설정하려는 예에서

class { 'nginx':
  ensure => absent,
}

당신은 꼭두각시 모듈의 저자에게 모든 것을 제거하는 데 필요한 코드를 작성했습니다. 모든 퍼펫 모듈에이 기능이있는 것은 아닙니다.

마찬가지로 Ansible을 사용하면 설치 및 제거에 필요한 단계가 모두있는 역할이있을 수 있습니다. 차이점은 두 가지를 호출하는 방법에만 있습니다.

하나의 접근 방식은 문제의 역할이 변수를 노출하여 동작을 토글하는 방법 일 수 있습니다. 예를 들어, 그 nginx를 역할은 변수 걸릴 수 있습니다 nginx_state값 소요 installedabsent.

역할에서 tasks/main.yml역할 작성자는 다음과 같은 내용을 포함 할 수 있습니다.

- include: install.yml
  when: nginx_state|default('present') == "present"

- include: uninstall.yml
  when: nginx_state|default('present') == "absent"

.. 각각의 설치 / 제거 논리가 조건부로 포함 된 두 파일간에 분할됩니다.

가능한 역할도 중첩 될 수 있습니다. 동일한 역할을 수행하는 다른 방법으로 역할 작성자는 예를 들어 nginx역할 안에 다른 역할이 있는 역할 을 제공 할 수 있습니다 uninstalled. 그러면 다음을 수행 할 수 있습니다.

- name: Uninstall nginx
  hosts: some_group
  roles:
    - nginx/uninstalled

퍼펫과 비교할 때, 어쩌면 당연히 일을 어떻게 해야하는지에 대한 규칙과 지침이 적기 때문에 실제로는 연습이 약간 더 다양하지만 동일한 개념이 적용됩니다.


1
기술적으로 인수를 역할에 직접 전달할 수도 있지만 중첩 된 역할을 사용하는 것이 좋습니다. 플레이 북에서 어떤 역할을하는 것이 정말 이상하다는 것을 알 수 있습니다. 플레이 북 실행시 실제로는 정의 된 변수 때문에 제거 될 것입니다. 중첩 된 역할을 통해 명시 적으로 만드는 것이 훨씬 깨끗해 보입니다. 기술적으로 인수 ( - { role: nginx, state: absent })에 인수를 전달할 수는 있지만 매우 장황한 것 같습니다. 내가 본 중첩 된 역할의 유일한 단점은 부모의 기본 변수를 연결해야한다는 것입니다.
bogdan.mustiata

roles: -nginx/uninstalled일하고 싶은 일을하려면 무엇을해야 합니까? 나는 모든 곳을 살펴 보았지만 그렇게 할 수있는 방식으로 중첩 역할에 대한 문서를 찾을 수 없습니다.
집합

1

Ansible에 구성 / 프로비저닝이 있으므로 전체 서버를 날려 버리고 새로운 서버를 다시 설치 / 프로비저닝하고 잘 알려진 상태로 작동 할 수 있습니다.

실제로 다른 목적으로 "재구성"하려는 경우 필요한 정리 작업을 수행하는 새 플레이 북을 만들어야합니다.

내가 아는 한, 모든 Ansible 패키징 모듈state=absent 은 주어진 패키지가 서버에 설치되지 않도록 지원 합니다. 또한 apt모듈에는 purge=yes나머지 사용자 정의 구성 파일을 정리하는 매개 변수가 있습니다.

포트 80이 방화벽으로 설정되어 있는지 확인하는 작업을 생성 할 수도 있습니다. 그러나 해당 포트에서 실행중인 프로세스가 없으므로 방화벽을 설정해도 서버의 보안에는 아무런 영향을 미치지 않습니다.


이것에 state=absent덧붙여서 , 나는 그 역할에서 대부분의 연극에 추가 할 수있는 도박을하고 있습니다 . 대부분의 구성 변경 사항을 삭제하거나 취소 할 가능성이 높습니다. 역할의 규모에 따라 테스트 할 실제 PITA 일 수 있습니다.
Christopher Karel
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.