Ansible 에 대해 감을 잡기 위해 다음 강의로 공부함

www.udemy.com/course/using_ansible_for_simple_configuration/

 

무료 Ansible 튜토리얼 - [기초] 처음부터 설치하며 배우는 앤서블(Ansible)

앤서블과 같은 툴을 접해 보지 못한 엔지니어/관리자 그리고 개발자를 대상으로 주로 실습을 통해 앤서블을 통해 얼마나 효과적으로 시스템이 관리될 수 있는지 체험하고, 이해하게 됩니다. -

www.udemy.com

 

 

 

 

 

DevOps 의 Deploy, Operate 부분에서 ansible 이 사용됨

 

 

Ansible 이란?

배포와 관리를, 간소화/자동화하는 구성 관리 툴(Configuration management tool) 이다.

다른 구성 관리 툴들과 다르게, Agent 설치가 불필요하다.

따라서 간편도(학습 난이도나 운용코스트)가 많이 낮다.

쉽게 배워서 바로 쓸 수 있다.

 

다른 구성관리 툴보다 사용률이 높음.

https://resources.flexera.com/web/media/documents/rightscale-2019-state-of-the-cloud-report-from-flexera.pdf

 

 

Ansible Core란

Ansible 을 동작시키기 위해 필요한 최소한의 것들을 포함한 패키지

 

Ansible Tower 란

실행 명령어, 명령어 옵션들 등을 패키징하여 WebUI, 스케줄링 등을 추가한 것

 

 

 

강사님 실습은 virtual Box 위에 centos 를 설치하여 진행되지만

나는 그냥 docker 로 설치함.

 

아래 명령어를 통해 Docker CentOS Container 를 실행하자.
테스트용으로 두 대만 설치하자
a1 에 ansible 을 설치할 것이다.
a2 는 ansible 을 통해 관리할 host 가 된다.

docker run --name=a1 --privileged --network nifi-net -d centos /usr/sbin/init
docker run --name=a2 --privileged --network nifi-net -d centos /usr/sbin/init

docker exec a1 sh -c 'yum install openssh openssh-clients openssh-server -y'
docker exec a2 sh -c 'yum install openssh openssh-clients openssh-server -y'

위의 명령어를 통해 ssh 를 설치했다.
eyeballs.tistory.com/145 를 참고하여, 두 CentOS Container 간 비밀번호 없이 ssh 통신이 가능하게 만든다.

a1 에서 vi /etc/resolv.conf 열어서 아래처럼 KT public DNS 서버 추가한다.
nameserver 168.126.63.1

a1 에서 아래 명령어로 ansible 을 설치한다.

yum install epel-release -y
yum install ansible -y

vi /etc/ansible/hosts 열어서 가장 끝에 ansible 이 연결하는 host 의 ip (a2 의 ip) 를 적어준다.

 

 

 

 

ansible이 실행할 때는 아래 파일들을 참조한다.

 

/etc/ansible/ansible.cfg : ansible 실행 정보들을 담고 있다.

/etc/ansible/hosts : ansible 이 접속하는 hosts 에 대한 정보를 담고 있다.

 

 

 

 

 

 

hosts 는 group 을 지을 수 있다.

만약 /etc/ansible/hosts 의 내용이 다음과 같다고 하자.

11.0.0.3
11.0.0.4
11.0.0.5

이렇게 적으면 a-group, b-group 으로 묶을 수 있다.

[a-group]
11.0.0.3
11.0.0.4
[b-group]
11.0.0.5

 

그리고 ansible 명령어 실행시 all 대신 b-group 같이 사용 가능하다.

예를 들어

모든 hosts 로 ping 보낼 때는
ansible all -m ping
a-group 으로만 ping 보낼 때는
ansible a-group -m ping
b-group 으로만 ping 보낼 때는
ansible b-group -m ping

localhost 로 ping 보낼 때는

ansible localhost -m ping

 

아래 ansible 명령어들이 많이 나올텐데,

아래 명령어들에 적혀있는 " all " 대신 위에서 설명한 것처럼 group 이름을 사용할 수 있다.

 

나의 경우, 사용자 이름이 eye 인 컴퓨터에 ssh 로 접근할 때 (ssh 155.10.0.1 혹은 ansible all -m ping)

아래와 같은 에러가 떴다.

[root@99098adfe58e ~]# ansible all -m ping 
155.10.0.1 | UNREACHABLE! => {
    "changed": false,
    "msg": "Failed to connect to the host via ssh: root@155.10.0.1: Permission denied (publickey,password).",
    "unreachable": true
}

이유인 즉슨, ssh 접근을 하는 컴퓨터의 사용자 이름이 eye 인데

위에 명령어에서는 root 사용자로 접근하고 있다는 것이다.

이것은 리눅스의 배경 지식을 좀 알고 있어야 원인을 이해할 수 있다. 이 게시물의 중간 내용(리눅스 사용자) 참고

 

해결하기 위해서는, 다음과 같은 방법으로 사용자가 eye 라는 것을 명시해주면 된다.

< /etc/ansible/hosts >

eye@155.10.0.1
< ssh 접근할 때 >

ssh eye@155.10.0.1

 

 

 

 

 

 

ansible 명령어 실행시 추가할 수 있는 옵션들에 대해 몇 가지 소개한다.

 

-i (--inventory-file) : ansible 명령이 적용될 호스트들의 ip address 정보가 담긴 파일

-m (--module-name) : python 모듈을 선택할 수 있도록 해 줌

-k (--ask-pass) : hosts 접근시 ssh 패스워드를 물어보도록 설정함

-K : (--ask-become-pass) : 관리자 권한을 획득하여 hosts 에 접근

--list-hosts : 적용되는 호스트들을 확인

 

< -i 예제 >

/home/eye/ansible-hosts 파일의 값이

"11.0.0.3

11.0.0.4"

이고

ansible all -m ping -i /home/eye/ansible-hosts

옵션을 주게 되면

ansible-hosts 파일의 내용대로 두 개의 ip 에 ping 을 쏘게 된다(왜냐면 -m ping 옵션이 포함되어 있기 때문에)

즉 ansible 이 기본적으로 이용하는 /etc/ansible/hosts 파일 대신 /home/eye/ansible-hosts 을 사용한다.

 

< -m 예제 >

python 으로 작성된 ping 을 사용하는 명령어는

ansible all -m ping

만약 ABC 라는 이름의 모듈이 있다면 그것을 사용하는 명령어는

ansible all -m ABC

uptime 을 실행하는 shell 명령어를 모든 호스트(all)에서 실행하게 만들려면

ansible all -m shell -a "uptime"

여기서 -a 는 argument 의 약자

 

 

 

 

 

 

 

그래서 ansible 이 뭘 할 수 있어?

ansible 이 관리할 hosts(default : /etc/ansible/hosts) 를

ansible 을 통해 중앙관리할 수 있다.

hosts 에 모니터링 명령어를 실행시키고 그 출력값을 받아온다거나,

hosts 에 파일을 보낸다거나, hosts 에 서비스를 설치하고 실행시키는 등의 작업을

한 번에 할 수 있다!

 

다음과 같은 것들을 할 수 있고 직접 실습해 볼 예정

물론 더 많은 것들을 할 수 있겠지...

1. uptime 확인

2. 디스크 용량 확인

3. 메모리 상태 확인

4. 새로운 유저 생성

5. 파일 전송

6. 서비스 설치

 

 

 

1. uptime 확인

 

아래 명령어를 통해 ansible 이 관리할 hosts 에 접근한 후

uptime 이라는 명령어를 실행시킨다.

ansible all -m shell -a 'uptime'

 

2. 디스크 용량 확인

 

아래 명령어를 통해 ansible 이 관리할 hosts 에 접근한 후

df -h 라는 명령어를 실행시킨다.

ansible all -m shell -a 'df -h'

 

3. 메모리 상태 확인

 

아래 명령어를 통해 ansible 이 관리할 hosts 에 접근한 후

free -h 이라는 명령어를 실행시킨다.

ansible all -m shell -a 'free -h'

 

4. 새로운 유저 생성

 

아래 명령어를 통해 ansible 이 관리할 hosts 에 접근한 후

새로운 유저(예를 들어 이름이 spy인 유저)를 생성할 수 있다.

ansible all -m user -a "name=spy password=spy"

아래처럼 뜨면 잘 생성된 것이다.

host 에서 새로운 유저가 잘 생성되었는지 확인하기 위해 /etc/passwd 를 살펴본다.

 

5. 파일 전송

 

아래 명령어를 통해 ansible 이 관리할 hosts파일을 보낼 수 있다.

예를 들어 ansible 이 실행되는 서버의 /home/eye/myfile 을

hosts 의 /home/host/ 로 보낸다고 하자.

ansible all -m copy -a "src=/home/eye/myfile dest=/home/host"

 

6. 서비스 설치

 

아래 명령어를 통해 ansible 이 관리할 hosts 에 https 서비스를 설치할 수 있다.

ansible all -m yum -a "name=httpd state=present"

hosts 가 centos 라서 yum module 을 사용한 것이다.

만약 ubuntu 였다면 apt module 을 사용했을 것이다....

 

만약 에러가 난다면 hosts 에 DNS 서버 주소가 없기 때문.

아래 명령어를 통해 DNS 서버 주소 정보를 hosts 에도 넘겨주자.

ansible all -m copy -a "src=/etc/resolv.conf dest=/etc/resolv.conf"

 

hosts 에 httpd 가 잘 설치되었는지 보려면 hosts 에 접근한 뒤 아래 명령어 실행

yum list installed | grep httpd

 

 

 

 

 

 

위의 작업 예제들을 통해 ansible 이 hosts 에 어떤 영향을 끼칠 수 있는지 알아보았다.

ansible 을 통해 해야 할 작업할 것이 많은 경우,

작업들을 하나의 리스트로 만들어 둔 'playbook' 을 작성하여

한 번에, 혹은 반복적으로 작업들을 실행시킬 수 있다.

 

예를 들어 각 hosts 에 다음과 같은 작업들을 해야 한다고 하자.

- nginx 설치

- nginx 의 main 페이지가 될 정보가 담긴 파일 전송

- nginx 서비스 시작

 

 

이 세 가지 작업을 한 번에 할 수 있도록,

playbook 을 만들어서 ansible 에게 시킬 수 있다.

 

vi 를 이용하여 install_nginx.yml 이라는 yaml 파일을 만들고 아래 내용을 넣는다.

 

< install_nginx.yml >

---
- name: Install nginx on linux
  hosts: all
  gather_facts: no
 
  tasks:
    - name: install epel-release
      yum: name=epel-release state=latest
    - name: install nginx web server
      yum: name=nginx state=present
    - name: upload default index.html for web server
      get_url: url=https://www.nginx.com dest=/usr/share/nginx/html/ mode=0644
    - name: start nginx web server
      service: name=nginx state=started

 

이 yml 파일을 다음 명령어를 통해 실행시킨다.

ansible-playbook install_nginx.yml

 

그럼 모든 hosts 에 nginx 가 설치되고, 파일을 전송받고, nginx 서비스를 시작하게 된다.

 

다른 playbook yml 파일의 예제를 살펴보자.

---
- name: Ansible_vim
  hosts: all
  
  tasks:
    - name: Ass_ansible_hosts
      blockinfile:
          path: /etc/ansible/hosts
          block: |
              [test]
              11.0.0.3

위와 같은 yml 파일이 있다.

blockinfile 이라는 작업을 수행한다고 한다.

이 작업은 /etc/ansible/hosts 파일 끝에

"[test]

11.0.0.3"

이라는 block 을 추가하는 것이다.

(yml 파일 내 block: 뒤에있는 | 부터 추가할 block의 내용이 시작된다.)

 

 

ansible 에는 멱등성이라는 성질이 있다.

연산을 여러번 적용해도 결과가 달라지지 않는 성질을 의미한다.

예를 들어 바로 위에 짧은 yml 파일을 4번 실행하면

/etc/ansible/hosts 뒤에 block([test] 11.0.0.3) 이 4번 붙게 될 것 같지만,

멱등성이라는 성질에 의해, 처음 실행되었을 때 한 번만 적용되고

그 뒤부터는 적용되지 않는다.

위의 짧은 yml 파일을 여러번 실행/적용해도 결과가 달라지지 않는다.

만약 중간에 yml 파일을 업데이트(내용 추가 혹은 삭제)하게 된다면,

ansible 실행시 업데이트 된 내용만 적용되고 업데이트되지 않은 내용은 적용되지 않는다.

 

 

 

강좌에서 사용된 playbook yml 파일은 아래와 같다(스샷)

 

 

 

 

ansible 명령어 실행시 에러가 났을 때 에러 로그를 읽기 편하게 출력하도록 하려면

/etc/ansible/ansible.cfg 에

#stdout_callback = skippy 을

stdout_callback = debug 로 바꾸면 된다.

 

 

 

 

+ Recent posts