728x90

 

사전 분석

- 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
반응형