[Ansible] 5 . Ansible 의 멱등성 이해 및 Cron 모듈 예제

Ansible의 멱등성 개요

Ansible의 기존 shell script 자동화 방식 대비 가장 큰 장점은 멱등성(idempotence)를 기본 개념으로 제공하는 것이라 생각한다.

멱등성(冪等性, 영어: idempotence) : 연산을 여러 번 적용하더라도 결과가 달라지지 않는 성질을 의미한다.

https://ko.wikipedia.org/wiki/%EB%A9%B1%EB%93%B1%EB%B2%95%EC%B9%99

자동화 솔루션 도입 시 가장 걱정되는 것은 버그나 예외상황에 의한 오동작으로 장애나 설정 오류가 발생하는 것이다.

Shell script를 직접 작성 시에는 모든 작업에 대해 if 문을 통한 상태 체크가 필요하거나 장애 케이스별 영향도 파악을 사전에 모두 완료해야한다.

하지만 ansible 에서 제공하는 모듈 대부분은 멱등성을 기반으로 제작되어 있기 때문에 운용자가 의도하지 않은 상황에서는 불필요한 중복 작업이 수행되지 않게 한다. task 수행 전 해당 모듈과 관련된 상태를 체크하여 문제가 없을 시에만 작업을 실행한다.

Cron 모듈과 멱등성 이해

ansible의 Cron은 Linux 시스템의 cron.d 와 crontab 을 관리하는 모듈이다.

운용자가 특정 계정으로 매분 단위 "ls -alh > /dev/null" 라는 명령어를 수행하고 싶다면,

Bash Shell의 echo로 /var/spool/cron 폴더 내 계정 파일에 crontab 작업을 추가하는 스크립트를 제작하면 된다.

이 경우 동일 명령어가 2번 수행 된다면 동일한 crontab 작업은 중복으로 2개가 추가된다.

 

ansible 의 Cron은 개별 cron job을 name 을 통해 관리한다.

운용자가 A 라는 crontab 작업 추가를 지시할 시 기존 crontab 내 A라는 작업이 있는지 사전에 확인한 후

동일 작업이 없을 경우에만 A job을 추가한다. 동일한 job이 있다면 해당 task를 pass 한다.

  • When crontab jobs are managed: the module includes one line with the description of the crontab entry "#Ansible: <name>" corresponding to the “name” passed to the module, which is used by future ansible/module calls to find/check the state. The “name” parameter should be unique, and changing the “name” value will result in a new cron task being created (or a different one being removed).

 

[Playbook]

"* * * * * ls -alh > /dev/null" crontab job 을 추가하는 playbook

Playbook 실행 시 crontab job 추가 작업이 진행되었기 때문에 changed 상태가 1로 설정된다.

작업 대상인 server2에 아래와 같이 crontab job이 추가된 것을 확인할 수 있다.

server1에서 동일 playbook 을 재실행 시에는 동일한 name으로 기존재 crontab job 이기 때문에 추가 작업이 미수행 되며 changed 상태는 0이 된다.

server2의 crontab 작업에는 변화가 없다.


다른 카테고리의 글 목록

Ansible 카테고리의 포스트를 톺아봅니다