ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Ansible 101] 환경 설정 자동화
    IT/Ansible 2024. 2. 4. 05:32
    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
    반응형
Designed by Tistory.