-
[Ansible 101] 환경 설정 자동화IT/Ansible 2024. 2. 4. 05:32728x90
사전 분석
- OS가 우분투의 경우, netplan 파일을 이용하여 IP를 설정한다
- OS가 CentOS/레드햇일 경우에는 nmcli 모듈을 사용하여 IP를 설정한다.
- community.general.nmcli
- ansible.builtin.template
1) 프로젝트 디렉터리 생성 및 ansible.cfg, inventory 파일 작성
# mkdir ~/ansible-project/chapter_10.1 cd ~/ansible-project/chapter_10.1 # ansible.cfg, inventory 파일 작성 cat <<EOT> ansible.cfg [defaults] inventory = ./inventory remote_user = ansible ask_pass = false inject_facts_as_vars = false roles_path = ./roles [privilege_escalation] become = true become_method = sudo become_user = root become_ask_pass = false EOT cat <<EOT> inventory [tnode] tnode1 tnode2 tnode3 EOT
2) 롤 생성
# ansible-galaxy role init --init-path ./roles myrole.nmcli ansible-galaxy role init --init-path ./roles myrole.netplan # 확인 ansible-galaxy role list tree roles -L 2
생성된 롤을 다음의 명령어로 확인 합니다.
3) myrole.nmcli 에 태스크 파일 작성
~/chapter_10.1/roles/myrole.nmcli/tasks/main.yml
--- # tasks file for myrole.nmcli - name: Setup nic ip community.general.nmcli: type: ethernet conn_name: "{{ item.con_name }}" ip4: "{{ item.ip_addr }}" gw4: "{{ item.ip_gw }}" dns4: "{{ item.ip_dns }}" state: present loop: "{{ net_info }}" when: net_info[0].con_name in ansible_facts.interfaces
nmcli 모듈을 사용하여 외부로부터 받은 변수로 네트워크 IP를 설정합니다.
설명 :
- loop를 이용하여 변수는 배열 방식으로 받은 변수이므로 하고,
- when을 통해 외부로부터 받은 인터페이스가 앤서블 팩트에 존재하는 확인합니다.
4) myrole.netplan 에 Jinja2 템플릿 파일 작성
touch ~/ansible-project/chapter_10.1/roles/myrole.netplan/templates/01-netplan-ansible.yaml.j2
~/chapter_10.1/roles/myrole.netplan/templates/01-netplan-ansible.yaml.j2
# This is the network config written by 'ansible' network: version: 2 ethernets: {% for item in net_info %} {{ item.con_name }}: dhcp4: no dhcp6: no addresses: [{{ item.ip_addr }}] gateway4: {{ item.ip_gw }} nameservers: addresses: [{{ item.ip_dns }}] {% endfor %}
설명 :
- Jinja2 템플릿을 이용하여 외부로부터 받은 배열형 변수를 for 문으로 하나씩 꺼내 사용할 수 있습니다.
- Jinja2 템플릿에서 제어문이나 반복문을 사용할 때는 다음과 같이 {% ~ %}를 이용합니다.
5) myrole.netplan 에 태스크 파일 작성
~/chapter_10.1/roles/myrole.netplan/tasks/main.yml
--- # tasks file for myrole.netplan - name: Copy netplan file ansible.builtin.template: src: 01-netplan-ansible.yaml.j2 dest: /etc/netplan/01-netplan-ansible.yaml when: net_info[0].con_name in ansible_facts.interfaces notify: Netplan apply
6) myrole.netplan 에 핸들러 파일 작성
~/chapter_10.1/roles/myrole.netplan/handlers/main.yml
--- # handlers file for myrole.netplan - name: Netplan apply ansible.builtin.command: netplan apply
7) 메인 플레이북 작성
cd ~/ansible-project/chapter_10.1 touch set_ip.yml
~/chapter_10.1/set_ip.yml
--- - hosts: tnode1 vars: fedora_os: - CentOS - RedHat net_info: - con_name: ens5 ip_addr: 10.10.1.11/24 ip_gw: 10.10.1.1 ip_dns: 127.0.0.53 tasks: - name: Include role in CentOS and RedHat ansible.builtin.include_role: name: myrole.nmcli when: ansible_facts.distribution in fedora_os - name: Include role in Ubuntu ansible.builtin.include_role: name: myrole.netplan when: ansible_facts.distribution == "Ubuntu" - hosts: tnode2 vars: fedora_os: - CentOS - RedHat net_info: - con_name: ens7 ip_addr: 10.10.1.12/24 ip_gw: 10.10.1.1 ip_dns: 127.0.0.53 tasks: - name: Include role in CentOS and RedHat ansible.builtin.include_role: name: myrole.nmcli when: ansible_facts.distribution in fedora_os - name: Include role in Ubuntu ansible.builtin.include_role: name: myrole.netplan when: ansible_facts.distribution == "Ubuntu"
8) 플레이북 실행
# 실행 전 tnode1 정보 확인 ssh tnode1 ls /etc/netplan ssh tnode1 cat /etc/netplan/50-cloud-init.yaml ssh tnode1 ip -br -c addr ssh tnode1 ip -c route ssh tnode1 nslookup blog.cloudneta.net # ansible -m shell -a "cat /var/log/syslog | grep -i dhcp" tnode1 ssh tnode1 sudo dhclient -v ens5
9) 실행
# 문법 체크 ansible-playbook --syntax-check set_ip.yml # 플레이북 실행 : 우분투 OS로 롤 호출 되지만, tnode2는 enp7 NIC가 없어서 Setup nic ip 태스크가 실행되지는 않는다 ansible-playbook set_ip.yml ... # 실행 후 tnode1 정보 확인 ssh tnode1 ls /etc/netplan ssh tnode1 cat /etc/netplan/01-netplan-ansible.yaml ssh tnode1 ip -br -c addr ssh tnode1 ip -c route ssh tnode1 nslookup blog.cloudneta.net
728x90반응형'IT > Ansible' 카테고리의 다른 글
[Ansible 101] 보안 설정 (7) 2024.02.12 [Ansible 101] 호스트명 설정하기 (0) 2024.02.04 [Ansible 101] NTP 서버 설치 및 설정하기 (0) 2024.02.04 [Ansible 101] SSH 키 생성 및 복사하기 (0) 2024.02.04 [Ansible 101] 사용자 계정 생성하기 (0) 2024.02.04