Ansible 에 대해 감을 잡기 위해 다음 강의로 공부함
www.udemy.com/course/using_ansible_for_simple_configuration/
DevOps 의 Deploy, Operate 부분에서 ansible 이 사용됨
Ansible 이란?
배포와 관리를, 간소화/자동화하는 구성 관리 툴(Configuration management tool) 이다.
다른 구성 관리 툴들과 다르게, Agent 설치가 불필요하다.
따라서 간편도(학습 난이도나 운용코스트)가 많이 낮다.
쉽게 배워서 바로 쓸 수 있다.
다른 구성관리 툴보다 사용률이 높음.
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 로 바꾸면 된다.
'눈가락' 카테고리의 다른 글
[Fluentd] Docker fluentd 로 kafka 연동하는 방법 (0) | 2021.03.16 |
---|---|
[Git] 부분 commit 들만 merge 하고 싶을 때 방법들 (0) | 2021.03.16 |
[IT] 내부 directory 의 파일까지 cat 으로 출력하는 방법 (0) | 2021.03.02 |
[IT] loop device 설명 링크 (0) | 2021.02.21 |
[IT] LINE의 장애 보고와 후속 절차 문화 링크 (0) | 2021.02.18 |