0부터 시작하는 ANSIBLE 공부 - 다양한 Module & Ansible 의 특징

Jaehong Lee·2022년 9월 21일
post-thumbnail

1. Ansible 의 특징

ansible 은 멱등성을 사용한다. ansible 에서의 멱등성은 동일한 명령을 실행하더라도 결과가 달라지지 않는 것을 의미한다

예를 들어, ansible 을 이용하여 httpd 를 설치했다. 이후 다시 설치를 진행하였다. 이 경우 해당 명령을 bash 를 이용하였다면 추가 설치를 진행시킨다

  • 처음 설치시 - Changed : true
  • 두번째 설치시 - Changed : false
  • 이를 이용하게 되면, 불필요한 작업을 SKIP 하게 되므로 리소르를 줄일 수 있게 된다

ansible 에서는 생성시 생성되어 있는 상태를 보장해달라고 하는 것이다. 이는 present 이다 = add

ansible 에서 삭제시 삭제되어 있는 상태를 보장해달라는 것이다. 이는 absent 이다 = del

Start 의 경우도 ansible 에서는 Started 이다. 시작된 상태를 보장하는 것이다


2. 다양한 Module

Ping 모듈

  • Ping 모듈은 일반적인 ICMP 를 보내는 방식이 아닌, 로그인 가능 여부와 파이썬 설치 여부를 묻는다. 정상적인 상태 확인시 PONG 이라고 응답이 온다

user 모듈 - user 추가

사용자를 생성, 수정, 삭제할 수 있는 모듈

ansible all -m user -a "name=newuser1" -k
ansible all -m user -a "name=user2" -k
  • user 모듈로 user 를 생성된 상태를 보장하도록 하자. user 가 생성된다
211.183.3.147 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": true,
    "comment": "",
    "create_home": true,
    "group": 1002,
    "home": "/home/user2",
    "name": "user2",
    "shell": "/bin/bash",
    "state": "present",
    "system": false,
    "uid": 1002
}
  • 생성되었으므로 변경 사항이 존재한다. 따라서 changed 가 true 이다
  • state 의 present 는 배치되어 있음을 의미한다. 삭제하고 싶을 때는 이 state 를 absent 로 설정해주면 된다
[root@ansible-server ~]# ansible all -m shell -a 'cat /etc/passwd | grep user2'
211.183.3.147 | CHANGED | rc=0 >>
user2:x:1002:1002::/home/user2:/bin/bash
211.183.3.146 | CHANGED | rc=0 >>
user2:x:1002:1002::/home/user2:/bin/bash
211.183.3.145 | CHANGED | rc=0 >>
user2:x:1002:1002::/home/user2:/bin/bash
  • 잘 생성됬는지 Shell 모듈로 명령을 전달하여 확인하자

같은 명령 실행시


211.183.3.145 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "append": false,
    "changed": false,
  • 동일한 user 생성 명령을 내리면, 오류가 나는 것이 아닌, 이미 존재하기에 Skip 이 된다. changed 가 false 이다. 이와 같이 ansible 은 상태를 보장한다. 따라서, user 생성을 보장하면 되기에 이미 생성되있다면, 명령을 실행하지 않고 Skip 한다. 오류가 아니기에 SUCCESS 이다

user 모듈 - user 삭제

ansible all -m user -a "name=user2 state=absent"
  • user2 를 삭제된 상태를 보장해달라고 명령을 내린다. 삭제된 상태를 보장하기에 user2 가 없는 Node 에서는 user2 가 없는 상태이므로 삭제 명령을 Skip 한다. 따라서 없는 것을 삭제하는 명령을 실행하지 않았기에 오류가 나지 않는다

yum 모듈

ansible 에서는 yum 모듈을 이용해 패키지를 설치한다

yum install & localinstall

  • 그냥 install 은 저장소에 있는 최신 버전을 다운 받는다
  • localinstall 은 yum 과 연결하여 의존성을 해결해준다

설치

ansible all -m yum -a "name=curl state=present"
  • 모든 Node 에 curl 이 배치되는 것을 보장하도록 하자. state 를 present 로 지정하여 배치된 상태를 보장하게 하였다. 따라서 curl 이 설치된다
  • 같은 명령을 다시 실행하면, 명령 결과는 SUCCESS 지만, 변경 사항이 없으므로 changed 는 False 이다

삭제

ansible all -m yum -a "name=curl state=absent"
  • 모든 Node 에 curl 이 삭제되는 것을 보장하도록 하자. state 를 absent 로 지정하여 삭제된 상태를 보장하게 하였다. 따라서 curl 이 삭제된다

git 모듈

ansible all -m yum -a "name=git state=present"
  • git 을 설치해주자

clone

ansible all -m git -a "repo=https://github.com/lijahong/html_css_example.git dest=/root/gittest"
  • git 모듈을 이용하여 해당 저장소의 내용을 지정한 디렉토리에 Clone 한 상태를 보장하게 하자
  • repo 는 git 저장소 주소, dest 는 해당 내용을 붙여넣을 디렉토리를 지정한다. 이때, dest 는 사전에 없는 디렉토리를 지정해야 한다. 즉, 디렉토리가 생성되고, 해당 git 저장소의 내용을 clone 해서 붙여 넣어준다

확인

[root@ansible-server ~]# ansible all -m shell -a "ls /root/gittest"
211.183.3.147 | CHANGED | rc=0 >>
image2.PNG
image.PNG
index.html
README.md
style.css
211.183.3.145 | CHANGED | rc=0 >>
image2.PNG
image.PNG
index.html
README.md
style.css
211.183.3.146 | CHANGED | rc=0 >>
image2.PNG
image.PNG
index.html
README.md
style.css
  • shell 모듈을 이용해 잘 clone 됬는지 확인하자

copy 모듈

ansible all -m copy -a "src=원본 dest=붙여넣을 곳" -k
  • 위 코드를 통해 원본 파일을 지정한 디렉토리에 붙여넣은 상태를 보장하게 할 수 있다

실습 - Service 모듈

이를 이용해 웹 서버 설치 및 홈 디렉토리에 index.html 을 복사 붙여넣기 해보자

ansible all -m yum -a "name=httpd state=present" -k
  • 웹 서버 설치
echo "<h2>lijahong</h2>" > index.html
  • index.html 생성
ansible all -m copy -a "src=index.html dest=/var/www/html/index.html"
  • server 의 index.html 을 node 의 디렉토리에 복사
[root@ansible-server ~]# ansible all -m shell -a "ls /var/www/html"
211.183.3.145 | CHANGED | rc=0 >>
index.html
211.183.3.147 | CHANGED | rc=0 >>
index.html
211.183.3.146 | CHANGED | rc=0 >>
index.html
  • 잘 복사가 되었다

실행

ansible all -m service -a "name=httpd state=started" # = ansible all -m shell -a "systemctl start httpd"
  • service 모듈을 통해 state 를 started 로 지정한다. 이는 해당 서비스가 시작된 상태를 보장해달라는 것이다

  • 잘 접속된다

중지

ansible all -m service -a "name=httpd state=stopped"
  • 위와 같이 상태를 stopped 로 하여 중지 시킬 수 있다

삭제

ansible all -m yum -a "name=httpd state=absent"
  • state 를 absent 로 하여 httpd 를 삭제하였다

3. 간단 실습

해야 할 것

  1. github 에 shop 이라고 써있는 index.html 생성
  2. git 모듈을 이용하여 /var/www/html/shop 아래에 index.html clone
  3. 확인

실습 수행

  • index.html 업로드
ansible all -m git -a "repo=https://github.com/lijahong/test.git dest=/var/www/html/shop"
  • clone

  • 확인하기. 잘 접속된다. 기본디렉토리/shop 에 넣었으므로, 주소/shop 에 들어가야 한다
profile
멋진 엔지니어가 될 때까지

0개의 댓글