- 3. Ansible(앤서블)2023년 03월 29일 11시 33분 48초에 업로드 된 글입니다.작성자: 각수짱728x90반응형SMALL
Ansible은 스토리지, 서버 및 네트워킹을 자동화하는 구성 관리 플랫폼
Ansible을 사용하여 이러한 구성 요소를 구성하면 어려운 수동 반복 작업을 자동화 가능연산을 여러 번 적용하더라도 결과가 달라지지 않는 것이 특징 (멱등성)
앤서블 구성요소
Ansible Control Node
앤서블을 실행하는 노드. /usr/bin/ansible이나 /usr/bin/ansible-playbook 명령을 이용하여 제어 노드에서 관리 노드들을 관리
앤서블이 설치되어 있으면 노트북이나, 서버급 컴퓨터를 제어 노드로 이용Managed Node
앤서블로 관리되는 서버를 매니지드 노드라고 한다.
매니지드 노드에는 앤서블이 설치되지 않는다.Inventory (host file)
매니지드 노드 목록을 인벤토리라고 한다.
인벤토리는 각 매니지드 노드에 대한 IP 주소, 호스트 정보, 변수와 같은 정보를 지정할 수 있다.Module
https://docs.ansible.com/ansible/latest/collections/ansible/builtin/index.html
앤서블이 실행하는 코드 단위
각 모듈은 데이터베이스 처리, 사용자 관리, 네트워크 장치 관리 등 다양한 용도로 사용
단일 모듈을 호출하거나 플레이북에서 여러 모듈을 호출할 수도 있다.Playbook
순서가 지정된 작업 목록이 저장되어 지정된 작업을 해당 순서로 반복적으로 작업을 실행할 수 있다.
앤서블 설치
Managed Node(192.168.52.165)
Control Node에서 키 생성
ssh-keygen
엔터 3번
ssh-copy-id root@매니지노드IP 패스워드
ssh root@매니지드노드IP 했을 때 패스워드 없이 접속ssh root@매니지노드IP
exit
Control Node(192.168.52.164)
yum install -y epel-release
wget http://192.168.0.100:8888/ansible%2d2.8.8%2d1.el8.noarch.rpm
ansible galaxy활용하기 전에 최신 버전(2.9)은 지원을 안 해주기에 2.8로 설치
yum install -y ansible-2.8.8-1.el8.noarch.rpm
ansible --version
인벤토리
기본 인벤토리
/etc/ansible/hosts
커스텀 인벤토리
원하는 위치에 파일 생성(/root/test/hosts)
앤서블 명령어를 실행할 때 -i 옵션으로 파일 지정 가능인벤토리 테스트
children 1개
host 파일
vi /root/test/hosts all: children: server: hosts: 192.168.52.165 192.168.52.166
/root/test 에서
server 밑에 hosts에 해당하는 IP들에게 pingansible server -i hosts -m ping
children 2개
hosts 파일
vi /root/test/hosts all: children: server: hosts: 192.168.52.165: db: hosts: 192.168.52.166:
server 밑에 hosts에 해당하는 IP들에게 ping
ansible server -i hosts -m ping
db 밑에 hosts에 해당하는 IP들에게 ping
ansible db -i hosts -m ping
전체 hosts에 해당하는 IP들에게 ping
ansible all -i hosts -m ping
yml 파일 형식
vi /root/test/hosts all: hosts: 192.168.52.165: 192.168.52.166: 192.168.52.167: children: webservers: hosts: 192.168.52.165: 192.168.52.166: dbservers: hosts: 192.168.52.167:
플레이북
실행 명령어
ansible-playbook -i 인벤토리파일경로 플레이북파일경로
모듈 구성
- name: 이름 # 앤서블 명령어를 실행할 때 출력되는 내용 unarchive: # 모듈 이름 become: yes # 옵션
리눅스 명령어 실행
playbook 파일
- name: 이름 shell: | 명령어 become: yes - name: 이름 command: 명령어 become: yes
실행
PLAY : 어떤 노드한테 실행할 건지 확인
Gathering facts : 해당 노드에 정상적으로 실행할 수 있는지 확인(노드 상태 확인)ansible-playbook -i hosts playbook
확인
파일 관련 모듈
권한 설정
- name: 이름 file: path: "경로" mode: 0755 become: yes
실행
확인
중복 실행 시 changed에서 ok로 하고 명령어를 넘어감 (멱등성)
파일 다운 및 압축 해제
- name: 이름 get_url: url: http://example.com/path/file.conf dest: /etc/foo.conf
- name: 이름 unarchive: src: "압축 파일 경로" dest: "해제할 경로" remote_src: yes 타겟 서버에 압축 파일이 존재하는지 여부를 세팅. 디폴트 값은 no. become: yes no인 경우 타겟 서버에 컨트롤 노드에 존재하는 압축 파일을 복사
실행
확인
/tmp에 apache-tomcat.9.0.73.tar.gz 다운로드 확인/usr/local에서 해제 후 이름 변경(tomcat9)
파일 복사
- name: "copy file" copy: src: 원본 dest: 사본 remote_src: no - name: "copy file" copy: src: {{ item }} dest: 사본 with_items: - file1 - file2 - file3 remote_src: yes
실행
확인
yum으로 설치
- name: Install the latest version of Apache yum: name: httpd state: latest
템플릿
진자2 문법
https://jinja.palletsprojects.com/en/3.0.x/templates/#escaping- name: "template file" template: src: 원본 dest: 사본 with_items: - file1 - file2 - file3 remote_src: yes
scp 192.168.52.165:/usr/local/tomcat9/conf/server.xml ./
mv server.xml server.xml.j2
vi server.xml.j2 <Connector protocol="AJP/1.3" address="{{ ansible_all_ipv4_addresses[0] }}" secretRequired="false" port="8009" redirectPort="8443" />
playbook 파일
vi playbook - hosts: ["server", "db"] tasks: - name: Copy File template: src: /root/test/server.xml.j2 dest: /usr/local/tomcat9/conf/server.xml remote_src: no become: yes
실행
확인
각각 노드 1 2에{{ ansible_all_ipv4_addresses[0] }} 부분에 현재 IP가 들어가서 저장됨
DB 관련 모듈
사용자 생성
- name: Create mysql user mysql_user: login_user: root login_password: '' name: sjb password: qwer1234 host: '%' priv: '*.*:ALL'
DB 생성
- name: Create a new database with name 'sjb_db' mysql_db: login_user: root login_password: '' name: sjb_db state: present
쿼리 실행
ansible galaxy 2.8 버전
- name: 이름 shell: | echo "CREATE TABLE sjb_db.student (sname VARCHAR(10), sage int)" | mysql -u sjb -pqwer1234 become: yes
ansible galaxy 2.9 버전 (모듈 설치 후)
- name: Create new Table community.mysql.mysql_query: login_user: root login_password: '' login_db: sjb_db query: CREATE TABLE student (sname VARCHAR(10), sage INT)
롤(역할)
롤 생성
ansible-galaxy init [롤 이름]
롤 구성
- defaults : 역할에 대한 기본 변수를 정의하는 디렉토리. 이 변수들은 우선순위가 가장 낮아 사용자가 지정한 변수에 의해 쉽게 재정의됨
- files : 역할과 관련된 정적 파일들이 위치하는 디렉토리. 여기에 있는 파일들은 'copy'모듈 등을 사용하여 원격 시스템에 전송할 수 있음.
- handlers : 핸들러를 정의하는 디렉토리. 핸들러는 특정 작업이 변경될 때 실행되는 작업(예: 서비스 재시작).
- meta : 역할에 대한 메타데이터를 정의하는 디렉토리. 여기에는 역할의 의존성, 작성자 정보, 라이선스 정보 등이 포함.
- tasks : 역할의 주요 작업들이 정의되는 디렉토리. 이곳의 'main.yml'파일은 역할이 실행될 때 호출.
- templates : Jinja2 템플릿 파일이 위치하는 디렉토리. 'template'모듈을 사용하여 원격 시스템에 전송하기 전에 템플릿을 렌더링 할 수 있음.
- tests: 역할에 대한 테스트 설정과 테스트 플레이북을 포함하는 디렉토리.
- vars : 역할에 대한 변수를 정의하는 디렉토리. 이 디렉토리의 변수들은 'defaults'보다 높은 우선순위를 가짐
예시:
- name: Apply my_role to servers hosts: servers roles: - my_role
변수
vars
인벤토리 또는 플레이북에 작성
vars: var01: 10 var02: 10
변수 파일에 작성
vi vars.yml var03: 10 var04: 10
플레이북에서 불러와서 사용
- name: load vars include_vars: "/root/test/vars.yml" - name: print debug: msg: "{{ var03 }}" become: yes
특수 변수
앤서블을 실행하면서 생성되는 변수
{{ ansible_facts }} {{ hostvars }}
register
모듈 실행 결과 저장
- name: create file shell: | df -h | grep /dev/mapper/cs-root | awk -F" " '{print $5}' | cut -d'%' -f 1 register: df_result become: yes
- name: test stat: path: /root register: root_stat become: yes - name: print debug: msg: "{{ root_stat }}" - name: print debug: msg: "{{ root_stat.stat.exists }}"
set_fact
동적으로 변수 저장
- set_fact: var05={{ df_result.stdout }}
when 조건문
모듈에 when 옵션 추가
동적 인벤토리
설정
vi /etc/ansible/ansible.cfg 파일 수정
[inventory] 항목에서 aws_ec2 추가yum install python3 pip3 install boto3 vi /etc/ansible/ansible.cfg ... [inventory] # enable inventory plugins, default: 'host_list', 'script', 'auto', 'yaml', 'ini', 'toml' enable_plugins = host_list, virtualbox, yaml, constructed, aws_ec2 ...
인벤토리 파일 생성
--- plugin: aws_ec2 aws_access_key: 액세스키 aws_secret_key: 시크릿키 keyed_groups: - key: tags prefix: tag
확인
플레이북 생성
- hosts: ["tag_group_test"] vars: ansible_ssh_private_key_file: "/ec2/test.pem" tasks: - name: print debug: msg: "{{ ansible_facts.default_ipv4.address }}" become: yes
실행
ansible-playbook -i aws_ec2.yml playbook --user ubuntu
728x90반응형LIST'IaC' 카테고리의 다른 글
4. Terraform(테라폼) (0) 2023.03.30 Ansible(앤서블) - 활용(3계층구현) (0) 2023.03.29 쉘 프로그래밍 - 활용 (0) 2023.03.29 2. 쉘 프로그래밍 (0) 2023.03.29 1. IaC (0) 2023.03.28 이전글이 없습니다.댓글