PORCH CentOS 6 지원

PORCH 현 구축 사이트에는 HP 구형 장비가 많이 있다. 이 장비들을 활용하려다 보니 최신 OS와는 호환이 되지 않는다.

HP Proliant DL380 G4/G5/G6와 같은 장비는 CentOS 7과 호환이 잘 되지 않아 CentOS 6를 설치하기로 했다.

PORCH는 CentOS 7, Debian Jessie만 현재 지원한다. CentOS 6도 지원하자.

base 이미지 만들기

/srv/fai/config/basefiles/ 에서 CentOS 6 base image를 만들자.

$ cd /srv/fai/config/basefiles
$ ./mk-basefile CENTOS6_64

상당한 시간이 걸릴 것이다. CENTOS6_64.tar 파일이 생성된다. 이 파일을 xz로 압축하자.

$ xz CENTOS6_64.tar

이제 CENTOS6_64.tar.xz 파일이 생성된다. 크기는 대략 45MiB 이다.

FAI config tarball 만들기

위 base image를 포함한 FAI config tarball을 만들자.

/srv/fai/config/config_tarball.sh:

tar cvf fai-CENTOS6-config.tar class debconf disk_config files hooks
package_config scripts pubkeys saltkey basefiles/CENTOS6_64.tar.xz


$ sh config_tarball.sh

이제 fai-CENTOS6-config.tar 파일을 /srv/tftp/fai/ 로 옮긴다.

$ mv fai-CENTOS6-config.tar /srv/tftp/fai/

PORCH 설정

PORCH에서 CENTOS6용 svc-interface 템플릿 파일을 만들자. CENTOS7과 같으므로 복사하고 uwsgi를 재시작한다.

$ cd ~/porch/porch/templates
$ cp svc-interface-CENTOS7.j2 svc-interface-CENTOS6.j2
$ sudo systemctl restart uwsgi

PORCH 코드 수정

기존 PORCH 코드는 OS 지원 목록을 client에 저장하였다.(config.js) 이것은 별로 좋지 않다. client는 PORCH 서버에게 물어보는 것이 낫다.

Client: “당신은 어떤 OS 자동설치를 지원합니까?”
PORCH: “저는 Debian jessie, CentOS 6, CentOS 7을 지원합니다.”

위와 같이 되도록 코드를 수정하였다.

그리고 각 구축 사이트 별로 사용할 OS만 노출시키면 된다.

~/porch/porch/config.py:

# Supported OS List
SUPPORTED_OS = ['JESSIE', 'CENTOS7', 'CENTOS6', 'UXENOS']

API 코드 등록:

/api/machine/supported_os

수정된 클라이언트 코드를 rebuild하자.

$ cd porch/quasar/porch
$ quasar build
$ cp -a dist/* ~/porch/web/

가산 작업

가산 KIDC에 있는 HP 머신 자동 설치를 지원하였다. Gres25와 Gres33을 PORCH로 자동 설치하였다. (호스트명에 G를 넣은 것은 아마도 가산(Gasan)의 첫글자를 딴 것이리라.)

  • Gres25: HP Proliant DL380 G6, CentOS 6 설치
  • Gres33: HP Proliant DL380 G7, CentOS 7 설치

네트워크 정보는 민감한 내용이므로 적지 않겠다.

오늘의 미션은

안양에 있는 PORCH 서버를 이용하여 가산 KIDC에 있는 머신에 WAN구간을 통해 OS와 App 자동 배포를 한다.

이다.

BIND App 배포 문제

WAN을 통한 App 배포를 지원하기 위해 ansible 환경에 proxy 설정을 PORCH서버의 외부 IP로 수정하였다.

첫 번째 문제 해결

PORCH client는 App/File 배포 시 배포대상서버의 배포망 IP로 접속하여 작업을 수행한다. App 배포는 ansible 작업, File 배포는 rsync 작업이다.

문제는 WAN 건너편에 있는 배포대상서버의 경우 설치 완료 후에는 배포망 IP로 접속할 수 없다는 것이다. 배포대상서버의 기본 gateway가 서비스망 router이다. 패킷이 배포망으로 왔는데, 응답 패킷이 서비스망으로 전달이 되지 않기 때문이다. 물론 kernel parameter에 ip_forward를 enable하면 되지만 일반 서버인데 보안 상 그런 설정은 좋지 않다.

그래서 PORCH client의 코드를 수정하였다. App/File 배포를 위한 접속 우선순위를 서비스망, 배포망 순서로 변경하였다. 즉, 서비스망 IP가 있으면 서비스망 IP로 접속하고, 없으면 배포망 IP로 접속한다.

그러나 아직 수정된 코드를 git commit하지는 않았다. 좀 더 신중히 생각하여 commit 여부를 결정할 것이다.

두 번째 문제 해결

Gres25에 BIND App 배포할 때 마지막 named를 띄우는 작업에서 실패한다. 왜? named를 띄우는 작업은 systemd를 이용하도록 했는데 CentOS 6는 systemd가 없다. systemd는 CentOS7부터 지원한다.

따라서 현재의 BIND App playbook을 다음과 같이 수정하였다.

~/porch/porch/templates/bind_main.j2:

...
- name: Add named to rc.local (CentOS 6)
  lineinfile:
    name: /etc/rc.local
    line: "/usr/sbin/named -u named"
  when:
    - ansible_distribution == "CentOS"
    - ansible_distribution_major_version == "6"
- name: Run named (CentOS 6)
  command: /usr/sbin/named -u named
  when:
    - ansible_distribution == "CentOS"
    - ansible_distribution_major_version == "6"
- name: Copy named.service systemd file.
  copy:
    src: named.service
    dest: /etc/systemd/system/named.service
  when:
    - ansible_distribution == "CentOS"
    - ansible_distribution_major_version == "7"
- name: Run named service
  systemd:
    name: named
    daemon-reload: yes
    enabled: yes
    state: started
  when:
    - ansible_distribution == "CentOS"
    - ansible_distribution_major_version == "7"

위와 같이 배포판 버전 별로 시작하는 방법을 다르게 하여 하나의 App으로 CentOS 6/7 머신에 배포하도록 하였다.

Gres25/33에 BIND App 배포 시험 완료!