자주쓰는 모듈 리스트

파일모듈

copy : 로컬/원격 시스템의 파일을 관리 호스트의 위치로 복사한다. selinux 속성 설정 가능
fetch : copy 처럼 작동하지만 반대로 작동한다. 이 모듈은 원격 시스템에서 제어 노드로 파일을 가져온다.
file : 권한, 소유권, selinux 컨텍스트, 일반파일의 타임스탬프, 심볼릭링크, 하드링크 및 디렉토리 같은
         속성을 설정한다.
이 모듈은 일반 파일, 심링크, 하드링크 및 디렉토리를 생성하거나 제거할수도 있다.
lineinfile : 특정 행이 파일에 있는지 확인하거나 역참조 정규식을 사용하여 기존 행을 바꾼다.
                     이 모듈은 파일에서 한 줄을 변경할 때 유용하다.

blockinfile :  사용자 지정 가능한 마커 선으로 둘러싸인 여러 줄의 텍스트 블록을 삽입, 업데이트, 제거.
synchronize : rsync를 사용하여 컨텐츠 동기화. rsync의 모든 기능을 쓰지는 못한다.
stat : linux stat 명령과 유사하게 파일의 상태 정보를 검색한다.

소프트웨어 패키지 모듈

package : 운영체제 고유의 자동 감지 패키지 관리를 사용하여 패키지 관리
yum : yum 패키지 관리자 사용하여 패키지 관리
apt : apt 패키지 관리자를 사용하여 패키지 관리
dnf : dnf 패키지 관리자를 사용하여 패키지 관리
gem : ruby gem 관리
pip : pypi에서 python 패키지 관리

시스템 모듈

firewalld : firewalld를 사용하여 임의의 포트/서비스 관리
reboot : 시스템 재부팅
service : 서비스 관리
user :  사용자 계정 추가, 제거 및 관리

net tools 모듈

get_url:  http,https 또는 ftp 를 통해 파일 다운로드
nmcli : 네트워킹 관리
url: 웹 서비스와 상호작용

만약 원하는 모듈이 없다면, 사용자가 직접 고유의 모듈을 만들수도 있고, 타사의 모듈을 가져와서 사용할 수도 있다.

 

ansible은 ANSIBLE_LIBRARY 환경변수에 지정한 위치에서 사용자 지정 모듈을 찾으며, 위치가 설정되지 않은 경우 현재 ansible 구성 파일의 library 키워드로 찾는다. 또한 ansible은 현재 실행되고 있는 플레이북과 관련하여, ./library 디렉토리에서 사용자 지정 모듈을 검색한다. ansible.cfg 파일에서 이런식으로 명시할 수 있다. (library = /usr/share/my_modules)

 

 

file 모듈

- 파일의 권한, 속성생성, 복사, 편집, 제거, 수정같은 리눅스 파일관리와 관련된 대부분의 작업을 수행할 수 있는 모듈이다. 여기서는 file 모듈로 자주 사용하는 기능을 확인한다.

 

 

* 파일 생성 / 소유자, 그룹, 사용권한 제어

- torch 명령처럼 작동하여 파일이 존재하지 않으면 빈 파일을 만들고, 파일이 존재하면 수정 시간을 업데이트한다.

- 파일 소유자, 그룹, 사용 권한 등도 제어할 수 있다.

- name: files test
  hosts: web1.example.com
  tasks:
    - name: Touch a file and set permissions
      file:
        path: /test6
        owner: student
        group: student
        mode: 0640
        state: touch

- 결과로, 해당 호스트의 /에 test6 이라는 파일이 생성된다.

 

 

* 파일의 selinux 속성 수정하기

---
- name: selinux setting
  hosts: web.example.com
  tasks:
    - name: changes elinux type
      file:
        path: /test1
        setype: samba_share_t

- 결과로, 아래와 같이 변경전, 변경 후를 확인할 수 있다.

- 파일 속성 매개변수는 여러 파일 관리 모듈에서 사용할 수 있으므로, 추가정보는 ansible-doc로 확인한다. (ansible-doc copy, ansible-doc file 등) 

 

# 참고 : 영구적으로 selinux 속성 수정하기

- 위 selinux 속성 수정 예시에서 file모듈은 chcon과 같이 작동한다. 

- restorecon 명령으로 쉽게 원복된다. 또한 리스타트로도 원복될거라고 생각했는데 아니었음. selinux 좀 더 공부

파일 이름이 test1이 아닌 것은 무시해주세요..ㅠ

- 아무튼, 영구적으로 변경된 selinux을 적용하려면, 아까 file 모듈로 samba_share_t 설정을 수행한 후에, 추가로 아래 새로운 예시를 실행한다.

---
- name: selinux setting
  hosts: web.example.com
  tasks:
    - name: changes selinux type permently
      sefcontext:
        target: /test4
        setype: samba_share_t
        state: present

- 이렇게 하면 해당 test1 파일은 samba_share_t 속성이 확정되어 restorecon으로도 원복되지 않는다.

이것도 파일 이름은 무시해 주세요 ㅠ

# 참고 : sefcontext 모듈은 selinux 정책에서 대상에 대해 기본 컨텍스트를 업데이트 하지만 기존 파일의 컨텍스트는 변경하지 않는다.

 

# 참고 : sefcontext 모듈 사용할 때 에러 발생 시

만약 이러한 에러가 발생한다면, 해당 ansible client에서 policycoreutils-python 패키지를 설치해야 한다. (centos 기준, yum install policycoreutils-python)

 

* 파일 제거하기

- file 모듈의 state: absent 지시문을 사용하여 파일을 삭제할 수 있다.

---
- name: remove file
  hosts: web.example.com
  tasks:
    - name: remove file
      file:
        dest: /tmp/hello_ansible_world
        state: absent

- 이렇게 하면 /tmp의 hello_ansible_world 파일은 삭제된다.

 

copy 모듈

- 이 모듈은 ansible host에 있는 파일을 ansible client로 복사한다.

- 또한 이 모듈은 defult 로 force: yes가 적용되어 있어서 ansible client로 파일을 복사할 때 해당 파일이 존재하지만 지금 복사 명령을 한 내용과 다른 내용을 포함하는 경우 덮어씌운다.

- 만약 이것을 해제하고 싶으면 force: no를 설정하면 된다. 이 옵션은 ansible client에 해당 파일이 존재하지 않을 경우에만 복사를 수행한다.

---
- name: test copy module
  hosts: web.example.com
  tasks:
    - name: test copy module
      copy:
        src: hello_world
        dest: /tmp/hello_ansible_world

- 이렇게 하면, ansible host에 있는 hello_world 라는 파일이 ansible client인 web.example.com의 /tmp/hello_ansible_world로 복사된다.

 

- content 지시문을 사용하여 파일을 새로 만들거나 있는 파일의 내용을 변경할 수 있다. 원래 /tmp/hello에 내용이 있었다면 다 없어지고 Managed by Ansible 이 저장된다. 없는 파일명이라면 해당 내용으로 새 파일이 생성된다. (잘 안씀 다른 모듈을 쓰지)

ansible all -m copy -a 'content="Managed by Ansible\n" dest=/tmp/hello'

 

lineinfile 모듈

- 기존 텍스트로 된 파일의 맨 아래에 라인을 추가하는 모듈이다.

---
- name: line test
  hosts: web.example.com
  tasks:
    - name: line test
      lineinfile:
        path: /tmp/hello_ansible_world
        line: 'happy happy'
        state: present

- 결과는 다음과 같다.

 

# 참고

- 파일 안에 line 으로 명시한 부분이 있다면 (맨 밑이 아니더라도) 더 추가하지 않는다. 

- 대소문자를 구분하므로 대소문자 하나만 달라도 다시 작동한다.

 

blockinfile 모듈

- 기존 텍스트로 된 파일의 맨 아래에 한 라인이 아닌 여러 라인으로 이루어진 텍스트 블록을 추가하는 모듈이다.

- 또한 blockinfile을 사용하면, 멱등을 위해 주석처리된 블록마커가 블록의 앞뒤에 삽입된다. (아래 결과처럼 BEGIN ANSIBLE MANAGED BLOCK, END ANSIBLE MANAGED BLOCK 이라고 나온 주석)

- 이러한 마커는 marker: 지시문을 사용해서 변경할 수 있다. ansible-doc -s blockinfile 참고

---
- name: block test
  hosts: web.example.com
  tasks:
    - name: block test1
      blockinfile:
        path: /tmp/hello_ansible_world
        block: >
          welcome to the mettugi world
          welcome to the mettugi world
          I'm i'm dancing mettugi
        state: present

# 참고로, 위 구문에서 block: | 로 하면 아래와 같이 나온다.

 

stat 모듈

- ansible client에 있는 특정 파일의 상세정보를 확인한다. 리눅스의 stat 명령과 유사하다.

- 또한 stat 모듈은 파일 상태 데이터가 포함된 값의 해시/딕셔너리 값을 반환하여 별도의 변수를 사용한 개별 정보를 참조하게 할 수 있다.

- 아래 예시는, stat 모듈의 결과를 보여주며, 결과에 md5 checksum 값도 포함한다.

---
- name: stat module
  hosts: web.example.com
  tasks:
    - name: check stat module
      stat:
        path: /tmp/message-log
        checksum_algorithm: md5
      register: result

    - name: check result
      debug:
        var: result

- 만약 checksum만 보고 싶다면, 아래와 같이 하면 된다.

---
- name: stat module
  hosts: web.example.com
  tasks:
    - name: check stat module
      stat:
        path: /tmp/message-log
        checksum_algorithm: md5
      register: result

    - name: check result
      debug:
        msg: "the file's checksum is {{ result.stat.checksum }}"

 

 

synchronize 모듈

- 이 모듈은 rsync 도구와 관련된 레퍼런스이다. 즉 ansible host와 ansible client 간의 파일을 동기화 한다. 이렇게 하여 playbook에서 일반적인 파일 관리 작업을 간소화한다.

- 이 모듈을 사용하기 위해 rsync를 ansible host, ansible client 양쪽에 설치해야 한다.

- 기본적으로 이 모듈을 쓸 때 동기화 작업을 시작하는 것은 ansible host이고, 동기화 당하는 것은 ansible client 이다.

---
- name: sync file
  hosts: web.example.com
  tasks:
    - name : sync file
      synchronize:
        src: /home/devops/ansible_test
        dest: /tmp

- 이 예시는, ansible host의 /home/devops/ansible_test 디렉토리 자체를 ansible client의 /tmp로 복사한다.(동기화한다)

 

 

 

fetch 모듈

- fetch는 각 ansible client에서 특정 경로의 파일을 검색하고, 이 파일들을 모두 ansible host로 각 호스트별로 정리해서 저장한다.

- flat: no 매개변수는 호스트이름, 경로 및 파일 이름을 대상에 추가하는 기본 동작을 수행한다. 이걸 하지 않으면, 모든 내용이 한 텍스트파일에 저장되므로 보기 어렵다.

---
- name: Use the fetch module to retrieve secure log files
  hosts: all

  tasks:
    - name: Fetch the /var/log/secure log file from managed hosts
      fetch:
        src: /var/log/messages
        dest: /home/devops/ansible_test/secure-backups
        flat: no

secure-backups 라는 디렉토리가 생겼고, 아래와 같은 트리구조가 생긴다. (flat: no 옵션)

 

 

연습문제

* 파일 복사하기 심화

- ansible host에서 관리 호스트들로 파일 사본을 뿌리고, 오너쉽, 퍼미션, selinux까지 설정한다.

---
- name: Using the copy module
  hosts: web.example.com
  tasks:
    - name: copy a file to manage hosts and set attributes
      copy:
        src: users.txt
        dest: /home/devops/users.txt
        owner: devops
        group: devops
        mode: u+rw,g=wx,o-rwx
        setype: samba_share_t

- 다음과 같이 확인할 수 있다.

 

* selinux 유형 설정을 기본값으로 돌리기

- user, role, type, level 필드에 대해 기본 selinux 컨텍스트를 적용한다.

---
- name: using the file module to ensure selinux file context
  hosts: web1.example.com
  remote_user: root
  tasks:
    - name: selinux file context is set to defaults
      file:
        path: /home/devops/users.txt
        seuser: _default
        serole: _default
        setype: _default
        selevel: _default

- 다음과 같이 결과를 확인할 수 있다.

 

 

 

참조

ansible-doc(1)

chmod(1)

chown(1)

rsync(1)

stat(1)

touch(1)

 

 

files 모듈 ansible 설명서

https://docs.ansible.com/ansible/2.7/modules/list_of_files_modules.html

 

Files modules — Ansible Documentation

 

docs.ansible.com

 

'Ansible' 카테고리의 다른 글

8장. 변수 사용하기  (0) 2021.02.20
7장. ansible playbook 기본 구현  (0) 2021.02.20
6장. ansible에서 모듈 사용하기  (0) 2021.02.19
5장. ad-hoc 명령  (0) 2021.02.19
4장. ansible.cfg 파일 톺아보기  (0) 2021.02.06

+ Recent posts