텍스트 파일 관리를 위한 Ansible lineinfile 모듈 사용 방법

앤서블은 수백 개의 노드를 한 번에 관리할 수 있는 널리 사용되는 자동화 도구입니다. 앤서블에는 많은 훌륭한 기능이 있으며, 그 중 하나는 앤서블 lineinfile 모듈을 사용하여 원격 노드의 파일 내에서 단일 라인을 관리할 수 있는 능력입니다.

앤서블 lineinfile 모듈은 라인을 대체하거나 업데이트하거나 특정 라인을 추가하는 등 파일의 단일 라인에 대해 다양한 작업을 수행하는 모듈입니다.

이 튜토리얼에서는 앤서블 lineinfile 모듈이 무엇인지, 동작 방식은 무엇인지, 텍스트 파일을 관리하기 위해 어떻게 사용하는지 배우게 될 것입니다.

전제 조건

이 게시물은 앤서블 lineinfile 모듈에 대한 단계별 튜토리얼입니다. 따라하려면 다음 사항이 준비되어 있어야 합니다:

  • 앤서블 컨트롤러 호스트 – 이 튜토리얼에서는 Ubuntu 18.04.5 LTS 머신에서 앤서블 v2.9.24를 사용합니다.
  • A remote computer to run commands. You’ll need an inventory file set up and one or more hosts already configured to run Ansible command and playbooks on. The remote Linux computer will be called myserver, and the tutorial will use an inventory group called web.
  • 튜토리얼을 정확히 따라하려면 원격 컴퓨터에 이미 Apache가 설치되어 있어야 합니다.

수정한 텍스트 파일을 Ansible lineinfile 모듈로 변경합니다.

이 튜토리얼을 시작하려면 Ansible lineinfile 모듈을 ad hoc 명령을 사용하여 실행합니다. Ad hoc 명령은 원격 호스트에서 단일 명령을 테스트하거나 실행하는 빠른 방법입니다.

Ansible 컨트롤러에 로그인하고 다음 명령을 실행합니다. 이 명령은 lineinfile 모듈 (-m)을 사용하여 웹 머신에 연결하고 실행할 명령을 전달하는 인수 (-a)를 사용합니다.

이 경우에는 lineinfile 모듈이 /etc/hosts 파일에서 IP 주소 127.0.0.1myapache와 매핑하여 localhost 항목을 업데이트합니다. 127.0.0.1myapache로 매핑하면 로컬로 HTTP://myapache:80에서 아파치 테스트 페이지로 이동할 수 있습니다.

  • path는 파일 위치를 나타냅니다.
  • regexp는 파일에서 정규 표현식을 찾아 127.0.0.1 myapache로 업데이트합니다.
  • –become 플래그를 사용하면 명령을 특권 사용자로 실행할 수 있습니다.
  • web은 모든 서버의 컬렉션인 인벤토리 그룹입니다.
  • ansible.builtin.lineinfile 또는 간단히 lineinfile은 모듈 이름입니다.
ansible web -m ansible.builtin.lineinfile -a "path=/etc/hosts regexp='^127\.0\.0\.1'  line='127.0.0.1 myapache' state=present" --become

명령을 실행한 후 원격 호스트에서 성공적으로 업데이트된 메시지인 CHANGED를 확인해야 합니다.

Running the ad hoc command with ansible lineinfile module

원격 노드에 SSH 클라이언트를 사용하여 로그인하고 cat 명령을 사용하여 /etc/hosts 파일이 새 값으로 업데이트되었는지 확인하십시오.

아래에서 볼 수 있듯이, 로컬호스트 항목이 원격 머신에서 127.0.0.1 myapache로 성공적으로 업데이트되었습니다.

Verifying the host file on remote machine

플레이북 내에서 여러 텍스트 파일 수정하기

원격 머신에서 한 줄을 관리하기 위해 단일 단기 명령을 사용하는 것은 괜찮을 수 있지만, 여러 파일에 여러 줄 또는 파일 내에 여러 줄이 있는 경우에는 어려울 것입니다. 단기 명령을 사용하는 대신에, ansible-playbook 명령을 사용하여 플레이북 내에서 Ansible lineinfile 모듈을 사용하는 것을 고려하십시오.

이제 플레이북 내에서 Ansible lineinfile 모듈을 사용하고 몇 줄을 수정하는 방법을 배워보겠습니다.

이미 Ansible 컨트롤러 호스트에 로그인한 것으로 가정합니다:

1. 홈 디렉터리에 ansible_lineinfile_module_demo라는 디렉터리를 만듭니다. 이 디렉터리에는 lineinfile 모듈을 호출하는 데 사용할 플레이북이 포함됩니다.

mkdir ~/ansible_lineinfile_module_demo
cd ~/ansible_lineinfile_module_demo

2. my_playbook.yml 파일을 ~/ansible_lineinfile_module_demo 디렉토리에 만들고 다음과 같은 YAML 플레이북 내용을 붙여넣습니다. 이 플레이북에는 원격 머신의 Apache 구성 파일의 다른 라인을 관리하는 Ansible lineinfile 모듈을 사용하는 여러 작업이 포함되어 있습니다.

아래 플레이북에는 다음과 같은 작업이 포함되어 있습니다:

1. ADMIN/etc/sudoers 파일에 있는지 확인하고, 없으면 해당 작업이 추가됩니다.

2. Apache 기본이 /etc/apache2/ports.conf 파일에서 8080 포트를 수신 대기하도록 보장하며, 다른 포트 라인이 있는 경우 lineinfile 모듈을 사용하여 해당 포트를 8080으로 업데이트합니다. 비슷하게 /etc/apache2/apache2.conf 파일에서 MaxKeepAliveRequests를 1000으로, KeepAliveTimeout를 100으로 업데이트합니다.

3. 원격 서버의 index.html 페이지 끝에 “Hello This is my Apache Page”라는 텍스트가 포함된 라인을 추가합니다. 이는 /var/www/html 디렉토리 아래에 있습니다.

Ansible 플레이북은 YAML로 작성됩니다. YAML에 대해 더 알아보려면, 여기를 클릭하세요

---
- name: Ansible lineinfile module example
# Ansible lineinfile 모듈이 적용될 원격 서버 정의
  hosts: web
  remote_user: ubuntu   # 원격 호스트로 ubuntu 사용
  become: true
  tasks:

# (작업-1) Sudoers 파일에서 관리자가 모든 작업을 수행할 수 있는지 확인
    - name: Validate the sudoers file before saving
      ansible.builtin.lineinfile:
         path: /etc/sudoers
         state: present
         regexp: '^%ADMIN ALL='
         line: '%ADMIN ALL=(ALL) NOPASSWD: ALL'

# (작업-2) Apache 기본 포트를 8080으로 업데이트
    - name: Ensure the default Apache port is 8080
      ansible.builtin.lineinfile:
         path: /etc/apache2/ports.conf
         regexp: '^Listen '
         insertafter: '^#Listen '
         line: Listen 8080

# (작업-3) html 페이지의 끝에 라인 추가: Hello This is my Apache Page
    - name: Add a line to a file if the file does not exist
      ansible.builtin.lineinfile:
         path: /var/www/html/index.html
         line: Hello This is my Apache Page
         create: yes

# (작업-4) Sudoers 파일에서 관리자가 모든 작업을 수행할 수 있는지 확인
    - name: Ensure MaxKeepAliveRequests is set to greater than 100
      ansible.builtin.lineinfile:
         path: /etc/apache2/apache2.conf
         regexp: '^MaxKeepAliveRequests'
         line: MaxKeepAliveRequests=1000

# (작업-5) Sudoers 파일에서 관리자가 모든 작업을 수행할 수 있는지 확인
    - name: Ensure KeepAliveTimeout is set to greater than 50
      ansible.builtin.lineinfile:
         path: /etc/apache2/apache2.conf
         regexp: '^KeepAliveTimeout'
         line: KeepAliveTimeout=100

3. 이제 플레이북을 호출하고 원격 호스트에서 정의된 모든 라인을 추가 또는 업데이트하기 위해 ansible-playbook 명령을 사용하여 작업을 실행합니다.

ansible-playbook my_playbook.yml 
Invoking the ansible playbook

아래에서는 TASK변경되었다는 상태를 가지고 있으며, 이는 원격 호스트가 올바른 상태에 있지 않았고 명령을 실행할 수 있도록 수정되었다는 것을 의미합니다. OK 상태인 TASK는 변경 사항이 필요하지 않음을 나타냅니다.

4. 그런 다음, 원하는 SSH 클라이언트를 사용하여 원격 호스트에 SSH로 접속합니다.

5. 마지막으로, my_playbook.yml에 정의된 모든 라인이 원격 호스트에서 업데이트되거나 추가되었는지 cat 명령을 사용하여 확인합니다.

# 관리자가 전체 권한으로 존재하는지 확인하고 없는 경우 추가합니다.
cat /etc/sudoers
# MaxKeepAliveRequests 및 KeepAliveTimeout이 각각 1000과 100으로 업데이트되었는지 확인합니다.
cat /etc/apache2/apache.config | grep Alive
# Apache가 포트 8080에서 수신 대기 중인지 확인합니다.
cat /etc/apache2/ports.config

아래 스크린샷은 admin이 이미 sudoers 파일에 추가되었음을 확인합니다.

Verifying the sudoers file

또한, 아래 스크린샷은 아파치가 기본적으로 포트 8080에서 수신 대기 중임을 확인합니다.

Verifying the ports for in the config file

마지막으로, MaxKeepAliveRequestsKeepAliveTimeout이 각각 1000과 100으로 업데이트되었는지 확인합니다.

Verifying the MaxKeepAliveRequests and KeepAliveTimeout in the config file

결론

Ansible의 lineinfile 모듈은 원격 호스트의 텍스트 파일을 수정하는 훌륭한 방법입니다. 이 모듈은 플레이북 내에서 텍스트 파일에 줄을 추가, 제거 및 수정하는 훌륭한 방법을 제공합니다.

Ansible lineinfile 모듈에서 어떤 다른 사용 사례가 이득을 얻을 수 있다고 보십니까?

Source:
https://adamtheautomator.com/ansible-lineinfile/