Ansible Cron 모듈

AnsibleBeginner
지금 연습하기

소개

Ansible Cron 모듈 랩에 오신 것을 환영합니다! 이 랩에서는 Ansible Cron 모듈을 사용하여 작업 일정을 자동화하는 방법을 배우게 됩니다. cron 시스템은 Unix 계열 운영 체제에서 시간 기반 작업 스케줄러로, 사용자가 지정된 시간 또는 간격으로 명령이나 스크립트를 자동으로 실행하도록 예약할 수 있게 해줍니다.

이 랩을 통해 Ansible 을 사용하여 cron 작업을 생성, 관리 및 제거하는 방법을 배우게 됩니다. 연습은 간단한 구성에서 더 복잡한 구성으로 진행되므로 Ansible Cron 모듈에 대한 기술을 점진적으로 구축할 수 있습니다. 이 랩을 마치면 Ansible 을 사용하여 일관되고 자동화된 방식으로 작업을 예약하는 실질적인 경험을 얻게 될 것입니다.

이것은 가이드 실험입니다. 학습과 실습을 돕기 위한 단계별 지침을 제공합니다.각 단계를 완료하고 실무 경험을 쌓기 위해 지침을 주의 깊게 따르세요. 과거 데이터에 따르면, 이것은 중급 레벨의 실험이며 완료율은 68%입니다.학습자들로부터 100%의 긍정적인 리뷰율을 받았습니다.

간단한 Cron 작업 생성

이 단계에서는 Ansible Cron 모듈을 사용하여 첫 번째 cron 작업을 생성합니다. cron 작업은 간단한 셸 스크립트를 정기적인 간격으로 실행합니다.

Cron 이해

시작하기 전에 cron 이 무엇인지 이해해 보겠습니다. Cron 은 Unix 계열 운영 체제에서 시간 기반 작업 스케줄러로, 사용자가 지정된 시간 또는 간격으로 명령이나 스크립트를 자동으로 실행하도록 예약할 수 있게 해줍니다. Cron 작업은 시스템 유지 관리 작업, 백업 또는 모든 반복 작업을 자동화하는 데 유용합니다.

Ansible Playbook 생성

먼저 cron 작업을 설정할 Ansible playbook 을 생성해야 합니다. WebIDE 에서 파일 탐색기 패널의 "New File" 버튼을 클릭하여 경로 /home/labex/project/cron_module_playbook.yaml에 새 파일을 생성합니다.

New File

다음 내용을 파일에 입력합니다.

- hosts: localhost
  tasks:
    - name: Create a simple cron job
      cron:
        name: my_cron_job
        minute: "*/5"
        job: /home/labex/project/script.sh

이 playbook 의 각 부분을 살펴보겠습니다.

  • hosts: localhost - 이 설정은 playbook 이 로컬 머신에서 실행됨을 지정합니다.
  • tasks - 이 섹션에는 실행할 작업 목록이 포함되어 있습니다.
  • cron - 이것은 cron 작업을 관리하는 데 사용되는 Ansible 모듈입니다.
  • name: my_cron_job - 이것은 cron 작업에 설명적인 이름을 설정하여 crontab 에서 쉽게 식별할 수 있도록 합니다.
  • minute: "*/5" - 이것은 작업을 5 분마다 실행하도록 예약합니다. */5 구문은 "5 로 나누어지는 모든 분" (0, 5, 10, 15 등) 을 의미합니다.
  • job: /home/labex/project/script.sh - 이것은 cron 작업에서 실행할 명령 또는 스크립트를 지정합니다.

셸 스크립트 생성

이제 cron 작업이 실행할 셸 스크립트를 생성해야 합니다. WebIDE 에서 경로 /home/labex/project/script.sh에 새 파일을 생성합니다.

다음 내용을 스크립트 파일에 입력합니다.

#!/bin/bash
echo "This is a simple script." >> /home/labex/project/cron_output.log
date >> /home/labex/project/cron_output.log

이 간단한 스크립트는 실행될 때마다 메시지와 현재 날짜를 로그 파일에 추가합니다.

스크립트 실행 가능하게 만들기

playbook 을 실행하기 전에 스크립트를 실행 가능하게 만들어야 합니다. WebIDE 에서 터미널을 열고 다음 명령을 실행합니다.

chmod +x /home/labex/project/script.sh

Ansible Playbook 실행

이제 Ansible playbook 을 실행하여 cron 작업을 생성합니다. 터미널에서 다음 명령을 실행합니다.

cd /home/labex/project
ansible-playbook cron_module_playbook.yaml

다음과 유사한 출력을 볼 수 있습니다.

[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that
the implicit localhost does not match 'all'

PLAY [localhost] ***************************************************************

TASK [Gathering Facts] *********************************************************
ok: [localhost]

TASK [Create a simple cron job] ************************************************
changed: [localhost]

PLAY RECAP *********************************************************************
localhost                  : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

changed: [localhost] 줄은 cron 작업이 성공적으로 생성되었음을 나타냅니다.

Cron 작업 확인

cron 작업이 생성되었는지 확인하려면 다음 명령을 사용하여 시스템의 crontab 을 확인합니다.

crontab -l

다음과 유사한 출력을 볼 수 있습니다.

#Ansible: my_cron_job
*/5 * * * * /home/labex/project/script.sh

#Ansible: my_cron_job 줄은 Ansible 이 cron 작업을 식별하기 위해 추가한 주석입니다. */5 * * * * 부분은 일정 (5 분마다) 을 나타내고 /home/labex/project/script.sh는 실행할 명령입니다.

축하합니다! Ansible Cron 모듈을 사용하여 cron 작업을 성공적으로 생성했습니다. 작업은 5 분마다 스크립트를 실행합니다.

사용자 지정 시간으로 작업 예약

이 단계에서는 정기적인 간격이 아닌 특정 시간에 실행되도록 cron 작업을 예약하는 방법을 배우게 됩니다. 이는 백업, 데이터 처리 또는 보고서 생성과 같이 하루 중 특정 시간에 실행해야 하는 작업에 유용합니다.

Cron 시간 형식 이해

cron 시간 형식은 다음을 나타내는 5 개의 필드로 구성됩니다.

  1. 분 (0-59)
  2. 시 (0-23)
  3. 월의 날짜 (1-31)
  4. 월 (1-12)
  5. 요일 (0-7, 여기서 0 과 7 은 모두 일요일을 나타냄)

각 필드에 값을 지정하면 모든 조건이 일치할 때 cron 작업이 실행됩니다. 예를 들어, 0 9 * * *는 "매일 오전 9 시에 실행" (9 시의 0 분, 월의 모든 날짜, 모든 월, 모든 요일) 을 의미합니다.

Ansible Playbook 수정

이제 기존 playbook 을 수정하여 특정 시간에 실행되는 새 cron 작업을 생성해 보겠습니다. WebIDE 에서 /home/labex/project/cron_module_playbook.yaml 파일을 열고 내용을 다음 내용으로 바꿉니다.

- hosts: localhost
  tasks:
    - name: Schedule a task with custom time
      cron:
        name: custom_cron_job
        minute: "0"
        hour: "9"
        job: /home/labex/project/script.sh

이 playbook 의 변경 사항은 다음과 같습니다.

  • name: custom_cron_job - 다른 이름으로 새 cron 작업을 생성하고 있습니다.
  • minute: "0" - 이 설정은 작업을 0 분 (시작) 에 실행하도록 설정합니다.
  • hour: "9" - 이 설정은 작업을 오전 9 시에 실행하도록 설정합니다.

나머지 필드 (월의 날짜, 월, 요일) 는 지정되지 않으므로 기본값은 * (모든 값) 입니다. 따라서 이 작업은 매일 오전 9 시에 실행됩니다.

수정된 Playbook 실행

이제 수정된 Ansible playbook 을 실행하여 새 cron 작업을 생성합니다. 터미널에서 다음 명령을 실행합니다.

cd /home/labex/project
ansible-playbook cron_module_playbook.yaml

다음과 유사한 출력을 볼 수 있습니다.

[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that
the implicit localhost does not match 'all'

PLAY [localhost] ***************************************************************

TASK [Gathering Facts] *********************************************************
ok: [localhost]

TASK [Schedule a task with custom time] ****************************************
changed: [localhost]

PLAY RECAP *********************************************************************
localhost                  : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

새 Cron 작업 확인

새 cron 작업이 생성되었는지 확인하려면 시스템의 crontab 을 확인합니다.

crontab -l

이제 출력에 두 개의 cron 작업이 표시됩니다.

#Ansible: my_cron_job
*/5 * * * * /home/labex/project/script.sh
#Ansible: custom_cron_job
0 9 * * * /home/labex/project/script.sh

첫 번째 작업은 1 단계에서 생성한 작업으로, 5 분마다 실행됩니다. 두 번째 작업은 방금 생성한 새 작업으로, 매일 오전 9 시에 실행됩니다.

추가 Cron 예약 예시

시간 형식을 더 잘 이해하는 데 도움이 되도록 몇 가지 추가 cron 예약 예시가 있습니다.

  • 0 * * * * - 매시간 시작 시 실행
  • 0 0 * * * - 매일 자정에 실행
  • 0 0 1 * * - 매월 첫날 자정에 실행
  • 0 0 * * 0 - 매주 일요일 자정에 실행
  • 0 12 * * 1-5 - 평일 (월요일부터 금요일까지) 정오에 실행

이러한 패턴을 이해하면 Ansible Cron 모듈을 사용하여 작업을 보다 효과적으로 예약하는 데 도움이 됩니다.

축하합니다! Ansible Cron 모듈을 사용하여 특정 시간에 실행되도록 cron 작업을 성공적으로 예약했습니다.

특정 사용자로 Cron 작업 실행 보장

이 단계에서는 cron 작업이 어떤 사용자로 실행되어야 하는지 지정하는 방법을 배우게 됩니다. 이는 예약된 작업이 실행되는 권한 및 환경을 제어할 수 있으므로 시스템 관리 및 보안의 중요한 측면입니다.

Cron 작업에 대한 사용자 컨텍스트 이해

Unix 계열 시스템에서 cron 작업은 해당 작업을 소유한 사용자의 권한과 환경을 상속합니다. 즉, 다음과 같습니다.

  1. 작업은 사용자가 액세스할 권한이 있는 파일 및 리소스에만 액세스할 수 있습니다.
  2. 작업은 사용자의 환경 변수 및 설정으로 실행됩니다.
  3. 작업에서 생성된 모든 파일은 사용자가 소유합니다.

기본적으로, 사용자를 지정하지 않고 Ansible Cron 모듈을 사용하면 Ansible playbook 을 실행하는 사용자에 대해 cron 작업이 생성됩니다. 그러나 user 매개변수를 사용하여 다른 사용자를 명시적으로 설정할 수 있습니다.

Ansible Playbook 수정

cron 작업이 labex 사용자로 실행되도록 지정하도록 playbook 을 수정해 보겠습니다. WebIDE 에서 /home/labex/project/cron_module_playbook.yaml 파일을 열고 내용을 다음 내용으로 바꿉니다.

- hosts: localhost
  tasks:
    - name: Schedule a task with custom time for specific user
      cron:
        name: custom_cron_job
        minute: "0"
        hour: "9"
        job: /home/labex/project/script.sh
        user: labex

여기서 중요한 추가 사항은 다음과 같습니다.

  • user: labex - 이 매개변수는 cron 작업이 labex 사용자에 대해 생성되어야 함을 지정합니다.

이 환경에서 이미 labex 사용자로 실행 중이더라도, 명시적으로 설정하는 것은 playbook 의 명확성과 다른 환경으로의 이식성을 위해 좋은 방법입니다.

수정된 Playbook 실행

이제 수정된 Ansible playbook 을 실행하여 cron 작업을 업데이트합니다. 터미널에서 다음 명령을 실행합니다.

cd /home/labex/project
ansible-playbook cron_module_playbook.yaml

다음과 유사한 출력을 볼 수 있습니다.

[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that
the implicit localhost does not match 'all'

PLAY [localhost] ***************************************************************

TASK [Gathering Facts] *********************************************************
ok: [localhost]

TASK [Schedule a task with custom time for specific user] **********************
ok: [localhost]

PLAY RECAP *********************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

출력에 changed 대신 ok가 표시됩니다. 이는 cron 작업이 이미 존재하고 유일한 변경 사항이 사용자 매개변수이기 때문이며, 이 경우 이미 올바릅니다 (처음부터 labex 사용자로 실행되었기 때문입니다).

Cron 작업 확인

cron 작업이 제대로 구성되었는지 확인하려면 crontab 을 확인합니다.

crontab -l

다음과 유사한 출력을 볼 수 있습니다.

#Ansible: my_cron_job
*/5 * * * * /home/labex/project/script.sh
#Ansible: custom_cron_job
0 9 * * * /home/labex/project/script.sh

특정 사용자에 대한 Cron 작업 보기

특정 사용자에 대한 cron 작업을 보려면 crontab 명령과 함께 -u 옵션을 사용할 수 있습니다.

sudo crontab -u labex -l

이 명령은 labex 사용자에 대해 예약된 모든 cron 작업을 표시합니다. 프로덕션 환경에서는 각 작업에 필요한 액세스 수준 및 권한에 따라 다른 사용자로 실행되는 다른 cron 작업이 있을 수 있습니다.

보안 고려 사항

다른 사용자에 대한 cron 작업을 예약할 때 다음 보안 관행을 고려하십시오.

  1. 최소 권한의 원칙을 사용합니다. - cron 작업을 작업 수행에 필요한 권한만 있는 사용자에게 할당합니다.
  2. 절대적으로 필요한 경우가 아니면 root 사용자로 작업을 예약하지 마십시오.
  3. cron 작업에서 실행되는 스크립트에 적절한 권한 및 오류 처리가 있는지 확인합니다.
  4. 인프라 전체에서 일관된 cron 작업 설정을 유지하기 위해 Ansible 과 같은 구성 관리 도구를 사용하는 것을 고려하십시오.

축하합니다! Ansible Cron 모듈을 사용하여 특정 사용자로 실행되도록 cron 작업을 성공적으로 구성했습니다. 이 기술은 시스템 작업을 보다 안전하고 효과적으로 관리하는 데 도움이 됩니다.

Cron 작업 삭제

이 단계에서는 Ansible Cron 모듈을 사용하여 원치 않는 cron 작업을 제거하는 방법을 배우게 됩니다. cron 작업의 전체 수명 주기를 관리하는 것은 시스템 관리자 및 DevOps 엔지니어에게 중요한 기술입니다.

Cron 작업을 제거하는 이유

cron 작업을 제거해야 하는 몇 가지 이유가 있습니다.

  1. 예약된 작업이 더 이상 필요하지 않습니다.
  2. 기존 작업을 새 구성으로 바꾸고 싶습니다.
  3. 유지 관리성을 향상시키기 위해 시스템을 정리해야 합니다.
  4. 작업을 일시적으로 비활성화해야 합니다.

Ansible 을 사용하면 인프라 전체에서 체계적이고 반복 가능한 방식으로 cron 작업을 쉽게 제거할 수 있습니다.

State 매개변수 이해

Ansible Cron 모듈은 state 매개변수를 사용하여 cron 작업의 존재 여부를 제어합니다.

  • state: present - 이것이 기본값입니다. 지정된 구성으로 cron 작업이 존재하도록 합니다.
  • state: absent - 이 설정은 cron 작업이 존재하지 않도록 하여 이전에 생성된 경우 제거합니다.

Ansible Playbook 수정

첫 번째로 생성한 cron 작업 (이름: my_cron_job) 을 제거하도록 playbook 을 수정해 보겠습니다. WebIDE 에서 /home/labex/project/cron_module_playbook.yaml 파일을 열고 내용을 다음 내용으로 바꿉니다.

- hosts: localhost
  tasks:
    - name: Remove the cron job
      cron:
        name: my_cron_job
        state: absent

이 playbook 의 주요 요소는 다음과 같습니다.

  • name: my_cron_job - 제거할 cron 작업을 이름으로 식별합니다.
  • state: absent - Ansible 에 cron 작업이 존재하지 않도록 지시합니다.

제거할 cron 작업을 식별하기 위해 cron 작업의 이름만 지정하면 됩니다. 다른 매개변수 (분, 시, 작업 등) 는 필요하지 않습니다.

수정된 Playbook 실행

이제 수정된 Ansible playbook 을 실행하여 cron 작업을 제거합니다. 터미널에서 다음 명령을 실행합니다.

cd /home/labex/project
ansible-playbook cron_module_playbook.yaml

다음과 유사한 출력을 볼 수 있습니다.

[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that
the implicit localhost does not match 'all'

PLAY [localhost] ***************************************************************

TASK [Gathering Facts] *********************************************************
ok: [localhost]

TASK [Remove the cron job] *****************************************************
changed: [localhost]

PLAY RECAP *********************************************************************
localhost                  : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

changed: [localhost] 줄은 cron 작업이 성공적으로 제거되었음을 나타냅니다.

Cron 작업 제거 확인

cron 작업이 제거되었는지 확인하려면 시스템의 crontab 을 확인합니다.

crontab -l

이제 출력에 두 번째 cron 작업만 표시됩니다.

#Ansible: custom_cron_job
0 9 * * * /home/labex/project/script.sh

playbook 에서 요청한 대로 my_cron_job 항목이 제거되었습니다.

Ansible 의 멱등성 (Idempotence)

Ansible 의 주요 기능 중 하나는 멱등성 (idempotence) 입니다. 즉, 동일한 작업을 여러 번 적용해도 한 번 적용하는 것과 동일한 결과를 얻는 속성입니다. 이는 cron 작업을 제거하는 것과 같은 작업에 특히 유용합니다.

이를 보여주기 위해 playbook 을 다시 실행해 보겠습니다.

ansible-playbook cron_module_playbook.yaml

다음과 유사한 출력을 볼 수 있습니다.

[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that
the implicit localhost does not match 'all'

PLAY [localhost] ***************************************************************

TASK [Gathering Facts] *********************************************************
ok: [localhost]

TASK [Remove the cron job] *****************************************************
ok: [localhost]

PLAY RECAP *********************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

두 번째 실행에서 제거 작업에 대해 changed 대신 ok가 표시됩니다. 이는 cron 작업이 이미 제거되었으므로 변경 사항이 필요하지 않았기 때문입니다.

여러 Cron 작업 관리

실제 시나리오에서는 단일 playbook 에서 여러 cron 작업을 관리해야 할 수 있습니다. 각자 고유한 구성을 가진 여러 cron 작업을 포함할 수 있습니다.

- hosts: localhost
  tasks:
    - name: Remove first cron job
      cron:
        name: job1
        state: absent

    - name: Create second cron job
      cron:
        name: job2
        minute: "0"
        hour: "12"
        job: /path/to/script.sh

    - name: Update third cron job
      cron:
        name: job3
        minute: "*/10"
        job: /path/to/another/script.sh

이 접근 방식을 사용하면 단일 버전 관리 playbook 에서 모든 cron 작업의 전체 수명 주기를 관리할 수 있습니다.

축하합니다! Ansible Cron 모듈을 사용하여 cron 작업을 제거하는 방법을 성공적으로 배웠습니다. 이는 cron 작업의 기본 수명 주기 관리 (생성, 수정 및 제거) 를 완료합니다.

요약

Ansible Cron Module Lab 을 완료하신 것을 축하드립니다! 이 랩을 통해 Ansible 을 사용하여 예약된 작업을 관리하는 몇 가지 주요 측면에 대한 실질적인 경험을 얻었습니다.

  1. 정기적으로 실행되는 간단한 cron 작업 생성
  2. 사용자 지정 cron 시간 표현식을 사용하여 특정 시간에 실행되도록 작업 예약
  3. 적절한 보안 및 권한 관리를 위해 cron 작업이 특정 사용자로 실행되도록 보장
  4. 더 이상 필요하지 않은 cron 작업 제거

이러한 기술은 모든 Linux 환경에서 시스템 관리 작업, 유지 관리 작업 및 반복 프로세스를 자동화하는 데 필수적입니다. Ansible 을 사용하여 cron 작업을 관리하면 다음과 같은 이점을 얻을 수 있습니다.

  • 여러 시스템에서 일관된 구성
  • 작업 일정의 버전 관리
  • 반복적으로 적용할 수 있는 멱등성 (idempotent) 작업
  • 예약된 작업의 자동 배포 및 관리

Ansible 을 계속 사용하면서 다음과 같은 Cron 모듈의 고급 기능을 살펴보십시오.

  • cron 작업에 대한 환경 변수 설정
  • @daily 또는 @reboot와 같은 특수 시간 사양 사용
  • 포괄적인 자동화 솔루션을 위해 cron 관리와 다른 Ansible 모듈 결합

예약된 작업을 효과적으로 관리하는 능력은 시스템 관리, DevOps 및 기타 IT 역할에서 유용하게 활용될 가치 있는 기술입니다.