새소식

⇥ DevOps Tech 🙋🏻‍♀️/✏️ Ansible

Ansible Role 작성 방법

  • -
반응형

Ansible Role 작성 방법 목차

  • include_vars
  • include_tasks
  • register
  • file
  • copy
  •  

    Ansible 의 role(롤) 은 Playbook을 여러 파일로 분할하는 개념이다.
    즉 자주 재사용 되는 특정 동작을 role 로 작성 해놓으면 재사용을 통해 손쉽게 플레이북을 만들 수 있다.

    ansible 에서는 role 을 작성하기 위한 directory 구조와 동작을 지원하는 모듈 개념이 있다. 작성 관련은 공식 문서에 자세히 안내하고 있어서 사용을 원하는 동작이나 이해가 안되는 부분은 공식 문서에서 참고 할 수 있다.

    https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_reuse_roles.html

     

    Roles — Ansible Documentation

    The classic (original) way to use roles is with the roles option for a given play: When you use the roles option at the play level, Ansible treats the roles as static imports and processes them during playbook parsing. Ansible executes each play in this or

    docs.ansible.com

     

    공식 문서에는 Role 관련 디렉토리를 위와 같이 안내하고 있는데, 별로 중요하진 않고 하다보면 대충 어떤 디렉토리인지 감이 온다.
    간단히 정리해보면 아래 표와 같다.

    directory name 역할
    tasks/main.yml role 이 실행하는 주요 작업 목록
    handlers/main.yml role 내 외부에서 사용될 수 있는 핸들러
    library/my_module.py 이 role 에서 사용할 수 있는 모듈
    defaults/main.yml role 의 기본 변수
    vars/main.yml role 이 사용하는 기타 변수
    files /  role 에서 사용하는 파일
    templates / role 이 배포하는 템플릿
    meta/main.yml 메타데이터


    role 작성 기본 모듈 예시

    보통 role 에서는 어떤 작업을 하는지 생각해보면 간단하다.
    파일을 이동시키고, 압축을 풀고, 디렉토리가 없으면 생성하고, 이러한 명령들이 모여서 role이 되고 role 이 모여서 playbook 이 된다.
    물론 복잡하게 들어가면 jinja template 을 활용하고 특정 변수마다 다른 설정 파일을 적용하여 사용할 수 있도록 할 수 있다.
    추후에 다룰 예정이고 우선은 간단한 적업 예시만 확인해보면 아래와 같다.

     

    include_vars

    ---
    - include_vars:
        dir: "vars"

    앞에서 vars 디렉토리에 대해 설명했었다. role 에서 사용하는 변수를 가지고 있는 부분이라고 작성했는데, 해당 디렉토리 안에는 role 에서 사용하게 될 변수들이 작성 되어있다. 

    apple : "banana"
    very : "good"

    예를들어 vars 내부에 이러한 변수 파일을 만들어 놓았다면 role 에서 apple, very 변수를 사용할 수 있도록 해주는 것이다.

     

    include_tasks

    ---
    - include_tasks: "task.yml"

    include_vars 와 비슷한 개념으로 task.yml 에 작성한 task 들을 포함하겠다는 의미이다.
    main.yml 에 작성하게 된다면 include_tasks 가 작동하여 task.yml 을 수행하게 된다.

     

    register

    ---
    - name: User Home directory
      stat: path=/usr/lib/home/directory
      register: user_home

    코딩에서 사용하는 변수 할당과 비슷한 개념이다. user_home 변수에 /usr/home/directory 경로를 넣는 것이며, 이후 task 에서 user_home 변수를 사용할 수 있다. 해당 경로에 디렉토리가 존재하는지 검사 등을 하여 자동화와 멱등성을 유지할 수 있게 된다.

     

    file

    가장 중요한 file 모듈이다. 정말 다양한 동작을 할 수 있는데 기본적인 내용을 가지고 예시를 들어보려고 한다.

     

    ---
    - name: make_dir
      file:
        path: /usr/lib/home
        state: directory
      when: user_home.stat.exists == false

    앞에서 우리는 user_home 에 PATH 경로를 넣었었다. 만약 해당 경로에 디렉토리가 존재하지 않는다면 path 에 담긴 디렉토리를 생성하라는 의미를 가지고 있다.

     

    ---
    - name: create_symlink
      file:
        src: /usr/lib/home/src_link
        dest: /usr/bin/dest_link
        state: link

    이런식으로 src 를 가리키는 dest 심볼릭 링크를 생성하는 것도 가능하다.

     

    copy

    ---
    - name: file_copy_test
      copy:
        src: "../files/test/test.sh"
        dest: "/etc/profile.d/test.sh"

    앞에서 Files 디렉토리에는 Role 에서 사용하는 파일이 들어 있다고 하였는데, src 에서 해당 파일을 지정한 뒤, dest 에 원하는 경로를 넣어서 파일 복사를 할 수 있다.

    정말 많은 동작을 할 수 있다. unarcive 모듈을 사용하여 압축을 해제할 수 있으며, command 명령어를 사용하여 단순 명령어를 수행할 수도 있다. 관련 정보는 공식 문서를 참고하거나 구글링을 해도 손쉽게 예제 파일이 나오기 때문에 원하는 자동화 내용이 있다면 role 파일로 작성해서 자동화를 구축해보면 좋을 것 같다.

     

     

    반응형
    Contents

    포스팅 주소를 복사했습니다

    이 글이 도움이 되었다면 공감 부탁드립니다.