본문 바로가기

Automation Tools/Ansible

2.3 ansible | [roles][CentOS 시스템 초기 설정] tasks

반응형

main.yml

[root@ANSIBLE tasks]# pwd
/etc/ansible/roles/Init_Install/tasks
 
[root@ANSIBLE tasks]# ll
total 48
-rw-r--r-- 1 root root 1131 Feb  9 13:37 01.init.rsyslog_selinux.yml
-rw-r--r-- 1 root root  648 Feb  9 13:37 02.init.add_user.yml
-rw-r--r-- 1 root root  522 Feb  9 13:37 03.init.ssh_config.yml
-rw-r--r-- 1 root root  213 Feb  9 13:38 04.init.yum_install.yml
-rw-r--r-- 1 root root  739 Feb  9 13:38 05.init.limit.yml
-rw-r--r-- 1 root root  160 Feb  9 13:38 06.init.sysctl.yml
-rw-r--r-- 1 root root  763 Feb  9 13:39 07.init.iptables.yml
-rw-r--r-- 1 root root  520 Feb  9 13:39 08.init.rc-local.yml
-rw-r--r-- 1 root root 1835 Feb  9 13:41 09.init.zabbix.yml
-rw-r--r-- 1 root root  239 Feb  9 13:41 10.init.reboot.yml
-rw-r--r-- 1 root root   65 Jul 24  2020 11.test.yml
-rw-r--r-- 1 root root  351 Jul 25  2020 main.yml
 
 
## 작업을 분리하여 include로 수행
[root@ANSIBLE tasks]# cat main.yml
---
- include: 01.init.rsyslog_selinux.yml
- include: 02.init.add_user.yml
- include: 03.init.ssh_config.yml
- include: 04.init.yum_install.yml
- include: 05.init.limit.yml
- include: 06.init.sysctl.yml
- include: 07.init.iptables.yml
- include: 08.init.rc-local.yml
- include: 09.init.zabbix.yml
- include: 10.init.reboot.yml

 

01.init.rsyslog_selinux.yml

 - Centos6 의 패키지 관리자 repogitory 만료로 인한 repo 주소 변경

 - time sync를 위한 rdate, selinux 라이브러리 설치

 - time sync

 - selinux config 변경

 - syslog 수집을 위한 rsyslog 설정

[root@ANSIBLE tasks]# cat 01.init.rsyslog_selinux.yml
---
## centos6의 경우 repo mirror 주소가 옮겨져 변경해 주어야 한다.
- name: "01-1 CentOS6 repo modify"
  replace:
    path: /etc/yum.repos.d/CentOS-Base.repo
    regexp: "{{ item.origin }}"
    replace: "{{ item.replace }}"
  with_items:
    - { origin: "mirrorlist=http://mirrorlist.centos.org", replace: "#mirrorlist=http://mirrorlist.centos.org" }
    - { origin: "#baseurl=http://mirror.centos.org", replace: "baseurl=http://vault.centos.org" }
## OS가 centos 이고 메이저 버전이 6인 경우 수행
  when:
    - ansible_facts['distribution'] == "CentOS"
    - ansible_facts['distribution_major_version'] == "6"
## rdate(시간 동기화가 되어 있지 않은경우 https로 부터의 패키지 설치가 안됨), libselinux-python(ansible에서 selinux 모듈을 사용하기 위해 클라이언트에 설치) 설치
## ansible.posix.selinux 모듈을 사용하기 위해 ansible-galaxy collection install ansible.posix 설치
## selinux 모듈을 사용하면 enforcing -> permissive 로 변경되며 재기동 후 disabled 됨
- name: "01-2 rdate, libselinux-python  install"
  yum:
    name: "{{ item }}"
    state: installed
  loop:
    - rdate
    - libselinux-python
## 시간 동기화
- name: "01-3 Sync Time"
  command: rdate -s time.bora.net
## setenforce 0 과 같으며 다음 tasks 진행에 문제가 발생될 소지가 있어 role 수행전에 미리 disabled 하는게 좋음.
- name: Disable SELinux
  selinux:
    state: disabled
## selinux config 상에 수정
- name: "01-4 selinux disable in config"
  replace:
    path: /etc/selinux/config
    regexp: "SELINUX=enforcing"
    replace: "SELINUX=disabled"
## rsyslog.conf 에 로그 설정 추가
- name: "01-5 rsyslog config"
  lineinfile:
    dest: /etc/rsyslog.conf
    line: "{{ item }}"
    state: present
  with_items:
    - "*.*;*.info;mail.none;news.none;authpriv.none;cron.none;local2.none       @@{{ logserver }}"

 

02.init.add_user.yml

 - user 추가 및 sudo 권한 편집

[root@ANSIBLE tasks]# cat 02.init.add_user.yml
---
## 사용자 그룹 추가
## with_dict 딕셔너리 사용
- name: "02-1 ADD GROUP"
  group:
    name: "{{ item.key }}"
    gid: "{{ item.value.gid }}"
  with_dict: "{{ ugroups }}"
## 사용자 추가
- name: "02-2 ADD USER"
  user:
    name: "{{ item.key }}"
    uid: "{{ item.value.uid }}"
    group: "{{ item.value.group }}"
    home: "{{ item.value.home }}"
    shell: "{{ item.value.shell }}"
    password: "{{ item.value.upassword | password_hash('sha512') }}"
    append: yes
  with_dict: "{{ uusers }}"
## sudo 권한 추가
- name: "02-3 Add user to sudoers"
  lineinfile:
    dest: /etc/sudoers
    regexp: "%{{ item.key }}   ALL"
    line: "%{{ item.key }}   ALL=(ALL) NOPASSWD: ALL"
    state: present
  with_dict: "{{ ugroups }}"

 

03.init.ssh_config.yml

 - ssh config 변경

## ssh 설정 수정
## root는 막는다.
[root@ANSIBLE tasks]# cat 03.init.ssh_config.yml
---
- name: "03-1 REPLACE SSH CONFIG"
  replace:
    path: /etc/ssh/sshd_config
    regexp: "{{ item.origin }}"
    replace: "{{ item.replace }}"
  with_items:
    - { origin: "#LoginGraceTime 2m", replace: "LoginGraceTime 2m" }
    - { origin: "#PermitRootLogin yes", replace: "PermitRootLogin no" }
    - { origin: "#MaxAuthTries 6", replace: "MaxAuthTries 5" }
    - { origin: "#ClientAliveInterval 0", replace: "ClientAliveInterval 600" }
    - { origin: "#ClientAliveCountMax 3", replace: "ClientAliveCountMax 3" }

 

04.init.yum_install.yml

 - 필수 패키지 설치

 - ntpd 데몬 enable

[root@ANSIBLE tasks]# cat 04.init.yum_install.yml
---
- command: yum clean all
## 초기 패키지 설치
## yum의 경우 {{ item }} -> with_items 를 사용하지 않고 loop를 사용
- name: "04-1 yum install packages"
  yum:
    name: "{{ item }}"
    state: installed
  loop: "{{ upackages }}"
## ntpd 서비스 enable
- name: "04-2 enable ntpd"
  service:
    name: ntpd
    enabled: yes

 

05.init.limit.yml

 - ulimit soft, hard 값 openfile 수치 변경

[root@ANSIBLE tasks]# cat 05.init.limit.yml
---
## root 사용자 설정
- name: "05-1 Add root soft config to limits.conf"
  lineinfile:
    dest: /etc/security/limits.conf
    line: "root soft nofile 63536"
    state: present
- name: "05-2 Add root soft config to limits.conf"
  lineinfile:
    dest: /etc/security/limits.conf
    line: "root hard nofile 63536"
    state: present
## ugroups,uusers 변수를 combine 하여 key만 사용
- name: "05-3 Add soft user config to limits.conf"
  lineinfile:
    dest: /etc/security/limits.conf
    line: "{{item.key}} soft nofile 63536"
    state: present
  with_dict: "{{ ugroups | combine(uusers) }}"
- name: "05-4 Add hard user config to limits.conf"
  lineinfile: 
    dest: /etc/security/limits.conf
    line: "{{item.key}} hard nofile 63536"
    state: present
  with_dict: "{{ ugroups | combine(uusers) }}"

 

06.init.sysctl.yml

 - sysctl.conf 변경

[root@ANSIBLE tasks]# cat 06.init.sysctl.yml
---
- name: "06-1 Add config to sysctl.conf"
  lineinfile:
    dest: /etc/sysctl.conf
    line: "{{ item }}"
    state: present
  with_items: "{{ usysctl }}"

 

07.init.iptables.yml

 - firewalld 데몬 중지 및 iptables 스크립트 등록

[root@ANSIBLE tasks]# cat 07.init.iptables.yml
---
## iptables를 스크립트 형태로 실행 예정이므로 iptables 관련 서비스 중지하고 disable
## 분기문을 사용하여 메이져 버전이 6인경우 iptables , 7인경우 firewalld 를 사용
- name: "07-1 disable and stop firewalld"
  service:
    name: "{{ 'firewalld' if ansible_distribution_major_version == '7' else 'iptables' if ansible_distribution_major_version == '6'}}"
    enabled: no
    state: stopped
## iptables 디렉토리 생성
- name: "07-2 Mkdir iptables"
  file:
    path: /home/script/iptables
    state: directory
## iptables.sh 파일 생성 및 퍼미션 부여
- name: "07-3 touch iptables.sh"
  file:
    path: /home/script/iptables/iptables.sh
    mode: 0744
    state: touch
## iptables.sh 스크립트 작업
- name: "07-4 Add config to iptables.sh"
  lineinfile:
    dest: /home/script/iptables/iptables.sh
    line: "{{ item }}"
    state: present
  with_items: "{{ uiptables }}"
## 시작 프로그램으로 등록
- name: "07-5 rc.local config"
  lineinfile:
    dest: /etc/rc.d/rc.local
    line: su - root -c "/home/script/iptables/iptables.sh"
    state: present

 

08.init.rc-local.yml

 - 시작 스크립트 등록

## CentOS7의 경우 rc-local 가 부팅후 자동 실행 되지 않으므로 해당 작업을 수행
[root@ANSIBLE tasks]# cat 08.init.rc-local.yml
---
## rc.local 퍼미션 수정
- name: "08-1 rc.local chmod"
  file:
    path: /etc/rc.d/rc.local
    mode: 0755
## 메이져 7버전의 경우만 수행하며 systemd 파일 수정
- name: "08-2 enable config rc.local"
  lineinfile:
    dest: /usr/lib/systemd/system/rc-local.service
    line: "{{ item }}"
    state: present
  with_items:
    - " "
    - "[Install]"
    - "WantedBy=multi-user.target"
  when:
    - ansible_facts['distribution_major_version'] == "7"
## 메이져 7버전의 경우만 수행 하며 rc-local enable
- name: "08-3 enable-rc-local"
  service:
    name: rc-local
    enabled: yes
  when:
    - ansible_facts['distribution_major_version'] == "7"

 

09.init.zabbix.yml

 - zabbix agent 설치 및 config 설정, user 템플릿 등록

## zabbix-agent 설치
---
## 메이져 버전에 따라 zabbix release repo 설치 주소가 다름.
- name: "09-1 install {{ zabbixagent }}"
  yum:
    name: "{{ item }}"
    state: installed
  loop:
    - "https://repo.zabbix.com/zabbix/5.0/rhel/{{ ansible_distribution_major_version }}/x86_64/zabbix-release-5.0-1.el{{ ansible_distribution_major_version }}.noarch.rpm"
    - "{{ zabbixagent }}"
## zabbix-agent 서비스 enable
- name: "09-2 systemctl enable {{ zabbixagent }}"
  service:
    name: "{{ zabbixagent }}"
    enabled: yes
## zabbix_agent.conf 수정
- name: "09-3 configure zabbix-agent2.conf"
  replace:
    path: "{{ '/etc/zabbix/zabbix_agent2.conf' if zabbixagent == 'zabbix-agent2' else '/etc/zabbix/zabbix_agentd.conf' if zabbixagent == 'zabbix-agent' }}"
    regexp: "{{ item.origin }}"
    replace: "{{ item.replace }}"
  with_items:
    - { origin: "Server=127.0.0.1", replace: "Server={{ zabbixserver }}" }
    - { origin: "ServerActive=127.0.0.1", replace: "ServerActive={{ zabbixserver }}" }
    - { origin: "Hostname=Zabbix server", replace: "#Hostname=Zabbix server" }
    - { origin: "# HostnameItem=system.hostname", replace: "HostnameItem=system.hostname" }
- name: "09-4 zabbix template config"
  lineinfile:
    dest: "{{ '/etc/zabbix/zabbix_agent2.conf' if zabbixagent == 'zabbix-agent2' else '/etc/zabbix/zabbix_agentd.conf' if zabbixagent == 'zabbix-agent' }}"
    line: "UserParameter=temp[*],/etc/zabbix/scripts/temp.sh"
    state: present
- name: "09-5 mkdir scripts"
  file:
    path: /etc/zabbix/scripts
    state: directory
- name: "09-6 touch temp.sh"
  file:
    path: /etc/zabbix/scripts/temp.sh
    mode: 0755
    state: touch
## 기본적으로 temp.sh(sensors를 이용한 core 온도 측정) 만 추가.
- name: "09-7 configure temp.sh"
  lineinfile:
    dest: /etc/zabbix/scripts/temp.sh
    line: "{{ item }}"
    state: present
  with_items:
    - "#!/bin/sh"
    - sensors | grep "Physical id 0:" | awk '{print $4}' | awk -F'+' '{print $2}' | awk -F'°C' '{print $1}' | awk -F'.' '{print $1}'

 

10.init.reboot.yml

 - 시스템 재부팅 및 시스템 up 후 ssh 포트 모니터링

## 최종 시스템 재기동
- block:
## async 시간동안 poll 시간 주기로 체크한다는 의미.(ansible는 ssh 통신 하므로 재기동의 경우 ssh 커넥션이 끊어지므로 최종 fail로 됨. 따라서 async 하게 진행해야함)
## 여기서는 async 1, poll 0으로 shell 작업만 수행 후에 다음 작업 진행
    - name: Restart machine
      shell: sleep 2 && shutdown -r now "Restarting with Init install"
      async: 1
      poll: 0
      ignore_errors: true
    - name: Init Install | Wait for the server to come back
      become: false
      delegate_to: localhost
      wait_for:
        port: 22
        host: "{{ ansible_host }}"
        search_regex: SSH
        delay: 10
반응형