Automation IaC - AWX

shJeong19·2023년 11월 24일
0

Automation IaC

목록 보기
2/3

AWX란?

awx는 ansible프로젝트의 관리를 위한 웹서비스를 말한다.
Red Hat Ansible Automation Platform 프로젝트중 하나로 정식으로 서비스중인게 ansible tower이고 오픈소스 버전이 awx이다.
기능은 상당부분 동일하나 안전성과 정확성을 보장하진 않고 기술지원도 불가능하다.
그렇다고 완전히 테스트버전 정도는 아니고 대규모의 안정적인 관리를 요구하는게 아니면 실사용에도 충분하다고 한다.
웹서비스와 api호출 방식을 지원한다.

관련 사이트
awx는 오픈소스 버전이라 그런지 공식이라고 할만한 자료가 별로 없다.
AWX github site : https://github.com/ansible/awx
AWX Operator : https://github.com/ansible/awx-operator
AWX Manual : https://ansible.readthedocs.io/projects/awx-operator/en/latest

많은 부분이 상용버전인 ansible tower와 동일하다고 하니 해당 매뉴얼을 보는게 도움이 되는 부분이 있다.
Ansible Tower : https://docs.ansible.com/ansible-tower/index.html


Install

docker환경 설치버전 마지막인 17.1.0으로 설치 후 테스트 해 보았다.
로컬 맥 환경이나 VM 우분투에서는 문제없이 작동하는 코드가 awx gui에서 자꾸 구문에러가 반복되서 확인하다 보니 17.1.0 버전에 설치되는 앤서블 버전이 2.9.x였다.
모듈의 기본환경이나 명령어 구문해석 등이 맞지 않는 부분이 많아서 해당 버전으로는 테스트 중지.
상위 버전의 쿠버네티스 환경으로 진행해 본다.

설치 개요

쿠버네티스에 awx이미지를 가지고 인스턴스를 생성하는것이 아닌 awx-operator를 설치하면 api-resources에 awx가 생기고 쿠버네티스 인스턴스를 만들때 kind: AWX 로 만들면 awx가 설치되는 형태이다.

여기서는 기본 계정으로 github연동을 통해서 ansible코드를 불러와 playbook실행 및 api호출 까지만 진행해본다.
awx인스턴스 생성하는 yaml파일에서 각종 설정이 가능한 것 같은데 아직 전부 확인은 못해봤다.
서비스타입이나 포트설정, 초기 관리자 계정설정, 볼륨설정 등이 가능하다.
awx버전은 23.4.0이고 awx-operator버전은 2.7.2 : 2023-11-14기준

AWX-Operator

우선 awx-operator를 설치해야 한다.
awx인스턴스를 따로 만들고 사용해야 하니 가급적 namespace를 별도로 만들어서 진행한다.

# git 저장소 복제
$ git clone https://github.com/ansible/awx-operator.git

# 네임스페이스 세팅
$ export NAMESPACE=awx
$ kubectl create ns ${NAMESPACE}

# 설치하는 동안은 기본 네임스페이스를 awx로 설정
$ kubectl config set-context --current --namespace=$NAMESPACE

# make
$ make deploy

Warning: resource namespaces/awx is missing the kubectl.kubernetes.io/last-applied-configuration annotation which is required by kubectl apply. kubectl apply should only be used on resources created declaratively by either kubectl create --save-config or kubectl apply. The missing annotation will be patched automatically.
namespace/awx configured
customresourcedefinition.apiextensions.k8s.io/awxbackups.awx.ansible.com created
customresourcedefinition.apiextensions.k8s.io/awxrestores.awx.ansible.com created
customresourcedefinition.apiextensions.k8s.io/awxs.awx.ansible.com created
serviceaccount/awx-operator-controller-manager created
role.rbac.authorization.k8s.io/awx-operator-awx-manager-role created
role.rbac.authorization.k8s.io/awx-operator-leader-election-role created
clusterrole.rbac.authorization.k8s.io/awx-operator-metrics-reader created
clusterrole.rbac.authorization.k8s.io/awx-operator-proxy-role created
rolebinding.rbac.authorization.k8s.io/awx-operator-awx-manager-rolebinding created
rolebinding.rbac.authorization.k8s.io/awx-operator-leader-election-rolebinding created
clusterrolebinding.rbac.authorization.k8s.io/awx-operator-proxy-rolebinding created
configmap/awx-operator-awx-manager-config created
service/awx-operator-controller-manager-metrics-service created

위와 같이 생성 메시지가 출력되면 쿠버네티스에 awx-operator관련된 요소들이 실행된다.

$ kubectl get pods


AWX인스턴스 생성

awx 인스턴스를 생성하는 yaml파일.

---
apiVersion: awx.ansible.com/v1beta1
kind: AWX
metadata:
  name: awx
spec:
  service_type: nodeport
  nodeport_port: 30080
  admin_user: admin
  admin_email: shjeong19@ubersys.co.kr
  admin_password_secret: awx-admin-password
#  projects_persistence: true
#  projects_storage_access_mode: ReadWriteOnce
#  web_extra_volume_mounts: |
#    - name: project-data-dir
#      mountPath: /var/lib/projects
#  extra_volumes: |
#    - name: project-data-dir
#      persistentVolumeClaim:
#        claimName: pvc-project-data-dir  

apiVersion과 kind부분을 위 코드처럼 선언하면 k8s에 awx환경이 구축된다.
spec 부분에 각종 설정들이 들어가는데 현재 서비스타입 설정과 웹 관리자 설정만 해보고 퍼시스턴스볼륨 설정은 했을때 awx-web파드 실행이 제대로 되지 않는 현상이 있어서 우선 보류..
git연동방식으로 환경을 잡아서 테스트 하는거라 project-data-dir 의 볼륨설정이 꼭 필수는 아닌것 같다(테스트정도는). 어차피 깃 폴더랑 연동되니까 해당 폴더 조작은 깃으로 하면 된다.

awx설치 후 k8s인스턴스 조회.
image.png

위 코드에서 spec부분에 admin_password_secret 설정부분에 들어가는 awx-admin-password 값은 쿠버네티스에 시크릿 인스턴스를 생성하고 그 시크릿의 name을 넣어줘야 한다.
필수값은 아니므로 넣어주지 않으면 자동으로 생성되므로 추후 조회해서 웹화면에 접속이 가능하다.

# awx-admin-password.yaml

apiVersion: v1
kind: Secret
metadata:
  name: awx-admin-password
  namespace: awx
stringData:
  password: mysuperlongpassword

시크릿 생성 후 해당 시크릿 name을 awx생성시 admin_password_secret 에 넣어주면 웹 서비스 로그인 시 해당 패스워드로 로그인이 가능하다.


awx 웹 서비스

awx 로그인

  • 로그인

awx의 모든 인스턴스가 정상적으로 실행되면 awx를 nodeport로 만들었기 때문에 외부에서 해당 포트로 접속이 가능하다.
서비스 인스턴스중 awx-service 에 올라와있는 포트 정보를 기준으로 웹브라우저에서 접속하면 아래 화면으로 접근이 가능하다.
http://<K8S_SERVICE_IP>:<NODEPORT>

사용자 이름과 암호는 awx생성할 때 spec에 정의한 admin_useradmin-password-secret 이다.
만약 둘다 없이 만들었다면 기본 사용자 이름은 admin 이고 암호는 아래 명령어를 통해 확인 후 입력하면 된다.
$ kubectl get secret awx-admin-password -o jsonpath="{.data.password}" | base64 --decode ; echo


  • 설정 변경

설정 > 작업 > 작업설정 메뉴로 진입해서 앤서블의 컬렉션 사용을 위해 galaxy ssl 인증서 확인 무시 항목을 on 시킨다.


프로젝트 : Github연동

  • 인증정보등록

사용자와 조직은 기본 정보로 진행하기로 하고 바로 git연동을 위한 인증정보를 입력한다.
레프트 메뉴에서 리소스 > 인증정보 > 추가 로 바로 진입한다.
이름, 조직을 입력하고 인증정보유형에 소스제어 를 선택하면 화면 하단에 인증정보 입력창이 나타난다.
ssh key 정보를 입력해주면 된다.
사용자이름에 github계정, scm개인 키에 ssh-keygen으로 발급받은 개인키 정보를 입력하고 저장한다.

개인키 정보는 일반적으로 /<USER_BASE_DIR>/.ssh/id_rsa 또는 /<USER_BASE_DIR>/.ssh/id_ed25519 와 같은 형식의 파일이다.
github의 키 등록과 연동에 대한 내용은 구글링으로...
대략 awx에 개인키(id_rsa) 정보를 등록하고 github쪽에 공개키(id_rsa.pub)를 등록해 주면 된다.

  • 프로젝트등록

리소스 > 프로젝트 > 추가 이름 입력하고 소스제어유형을 Git으로 선택하면 하단에 세부정보 입력란이 나타난다.
git레파지토리 주소를 입력하고 소스제어 분기/태그/커밋 입력란에 브랜치 정보를 입력한다.
소스제어 인증정보에 미리 만들어놓은 인증정보를 선택해 주고 마지막으로 시작 시 버전 업데이트에 체크해 준다.

프로젝트 생성 후 화면에서 git과 동기화를 진행한다. 마지막 작업 상태 성공으로 나오면 동기화 완료.

보기 > 작업 화면에서 동기화 작업에 대한 로그를 조회할 수 있다.
실패와 성공의 로그. 아래는 성공로그에 대한 상세화면.


템플릿

리소스 > 템플릿 화면에서 작업 템플릿 추가 실행한다.
프로젝트를 선택해 주면 해당 git에 올라가 있는 파일들이 Playbook 선택박스에 보인다.
플레이북에서 실행할 대상 인벤토리 정보와 해당 인벤토리에 등록된 노드에 접속할 인증정보를 입력해 줘야 한다.

인벤토리 등록 화면. 구조를 보면 인벤토리 하위에 호스트 정보가 들어가는걸로 보이는데 메뉴가 따로 있어서 좀 헷갈리는 부분이 있다.
인벤토리는 그냥 이름만 입력하고 넘어가면 되는 정도.

호스트 등록. 테스트 할 맥장비 1대를 호스트 등록.

인벤토리에 등록된 노드 접속 인증정보.
위에서 호스트 등록한 jsh-mac 이라는 맥 장비로 접근하는 인증정보다.
k8s서버에서 jsh-mac으로 접근하기 위해 ssh key 정보로 인증정보를 등록했다.

템플릿 실행.
템플릿 리스트 또는 상세화면에서 실행하면 문제가 없을 시 아래와 같은 성공 로그를 볼 수 있다.

위 템플릿에서 실행되는 앤서블 플레이북 폴더의 구조와 파일의 내용을 공유한다.

# 폴더구조
ansible/
ansible/webset_mac.yml
ansible/var_lists.yml
ansible/collections/requirements.yml
# webset_mac.yml

- hosts: jsh-mac
  vars_files: 
    - var_lists.yaml
  name: Install WebDev Env
  become: yes
  become_user: sanghoonjeong

  pre_tasks:
    - name: brew update
      community.general.homebrew:
        update_homebrew: true

  tasks:
    - name: "install {{ item.key | default('from brew') }}"
      community.general.homebrew:
        name: "{{ item.value }}"
        state: present
      register: rtn
      loop: "{{ apps }}"

    - name: "install {{ item.key | default('from brew cask') }}"
      community.general.homebrew_cask:
        name: "{{ item.value }}"
        state: present
      register: rtn_cask
      loop: "{{ apps_cask }}"

    - name: modify environment variable
      ansible.builtin.lineinfile:
        path: /Users/{{ user_id }}/.zshrc
        insertafter: 'EOF'
        line: "{{ item }}"
      loop:
        - export JAVA_HOME={{ java_home }}
        - export PATH="$PATH:$JAVA_HOME/bin"
        - export PATH="$PATH:{{ db_home }}/bin"

    - name: DB service start
      ansible.builtin.shell:
        cmd: "{{ homebrew_bin_path }}/brew services start mariadb@10.11"
        executable: /bin/zsh
      when: ansible_facts['os_family'] == "Darwin"

  post_tasks:
    - name: print rtn
      ansible.builtin.debug:
        msg: "rtn == {{ rtn }}"
      when: rtn is defined

    - name: print rtn_cask
      ansible.builtin.debug:
        msg: "rtn_cask == {{ rtn_cask }}"
      when: rtn_cask is defined
# var_lists.yml

user_id: sanghoonjeong
apps:
  - { key: DB, value: mariadb@10.11 }
apps_cask:
  - { key: JAVA, value: adoptopenjdk/openjdk/adoptopenjdk11 }
  - { key: STS, value: springtoolsuite }
  - { key: DBEAVER, value: dbeaver-community }
java_home: /Library/Java/JavaVirtualMachines/adoptopenjdk-11.jdk/Contents/Home
db_home: /opt/homebrew/Cellar/mariadb@10.11/10.11.5

homebrew_bin_path: /opt/homebrew/bin
# requirements.yml

collections:
  - name: community.general
    version: 7.5.1
  1. 처음 awx웹서비스 접속 후 사용자, 인증정보, 호스트, 인벤토리, 프로젝트, 템플릿 등 설정을 모두 마치고 실행하니 모듈이 없다는 메시지 출력.
    맥 환경에서 웹개발환경 구축하는 코드라서 community.general.homebrew 모듈을 사용해야 한다.
    일반적으로는 그냥 ansible-galaxy 에서 다운로드 받아놓고 쓰면 되는걸로 알고있는데 k8s환경에서는 당연히 저렇게는 안될거라서 구글링..
    프로젝트 루트 아래에 <project-data-dir>/collections/requirements.yml 구조로 파일을 만들고 해당 파일에 필요한 모듈을 선언하면 자동으로 다운로드 후 사용할 수 있게 되어있다고 한다. (awx tower 매뉴얼에는 자동화 컨트롤러 라고 함)
    그리하여 위 프로젝트 폴더에서 collections/requirements.yml 이 만들어졌다.

  2. db서비스 실행할 때 brew services start <SERVICE> 구문을 썼는데 brew를 그냥쓰면 찾지 못함.
    반드시 풀경로를 써줘야 한다.
    내 경우는 m2 arm맥미니에서 /opt/homebrew/bin/brew services start <SERVICE> 로 실행.

API 정보

api 조회 페이지 주소

http://<AWX_ADDRESS>/api/v2/
/api/v2/로 접속하면 api리스트 화면이 나온다.
image.png

awx웹 로그인 계정으로 로그인 후 사용이 가능하다.

ex) 아이디 10번 잡 템플릿을 실행하는 api 호출
http://<AWX_ADDRESS>:<AWX_PORT>/api/v2/job_templates/10/launch/

profile
Im steady Jeong

0개의 댓글