반응형
  1. Yaml에서 ansible_facts를 사용하기 위해 어떤 것들이 지원되는지 알아보기 위한 샘플 코드
    • #debugtest.yml 파일 생성
    • ---
      - name: debug Test
      hosts: all
      tasks:
      - name: debug testing
      shell: echo "debug test"
      - debug: var=ansible_facts

    • 들여쓰기 등 주의
    • 아래 이미지와 같이 생성 후 저장
    • #ansible-playbook -i hosts.inv debugtest.yml
    • 중간 생략
    • -
  2. Yaml에서 ['os_family']를 확인할 경우
    • tasks:
        - shell: echo "only on Red Hat 6, derivatives, and later"
          when: ansible_facts['os_family'] == "RedHat" and ansible_facts['lsb']['major_release']|int >= 6
    • 의 형태로 사용 가능

    • 자세한 내용을 알고 싶을 경우 stdout을 파일로 받아서 확인
    • #ansible-playbook -i hosts.inv debugtest.yml > out.txt
    • #cat out.txt
    • -
  3. 목표
    • ansible_fact에서 사용가능한 종류 확인


반응형
  1. Yaml을 이용하여 파일을 Node에 복사하는 작업 도중 발생한 이상 현상에 대한 내용
  2. 다양한 예제 파일이 존재하나 다음 소스를 가지고 테스트 
    • 위 소스를 바탕으로 ansible-playbook을 이용하여 command로 실행시 다음과 같은 결과 도출
    • #ansible-playbook -i hosts.inv notworking_filecopy.yml
    • 성공
    • AWX에 적용
    • 실패
    • -
  3. 원인 파악
    • 먼저 AWX의 로그를 살펴보면
    • "Could not find or access '/testdir/doc.tar' on the Ansible Controller." 라고 표현되어 있음
    • could not find? - 아래와 같이 파일 존재 함
    • could not access? - 아래와 같이 모든 권한이 부여 됨
    • ..... Thniking and Thniking .....
    • 파일의 권한과 존재는 이미 확인되었으며,
    • ansible-playbook 실행 시에도 정확하게 동작 됨
      • 접근 방법 1 (실패) - AWX_WEB의 계정 권한 ?
        • Docker의 Container에 실행되는 AWX_WEB이 root의 계정이 아니라 다른 계정으로 실행되고 있을수 있다는 생각에서 시작
        • 그러나, 위에서 언급한대로 권한은 744로.. 모든 사용자가 접근이 가능하므로 의미 없음으로 판단
        • -
      • 접근 방법 2 (실패) - AWX_WEB의 디렉토리 접근 문제 ?
        • 터미널에서 #ansible-playbook 명령어로는 정상실행 되나, AWX에서 안되면
        • Docker 실행 시 AWX_WEB의 도커 내의 폴더를 절대경로로 인식한다고 의심
        • 이를테면 테스트 PC내의 Docker내의 AWX_WEB의 경로는 
        • /var/lib/docker/overlay2/9a61d8e0b1f574bea31bd208edde4fac0edb8458a3fc4ef00decd5d7ef525fc4/merged/var/lib/awx/public/static로 설정되어 있음
        • /var/lib/docker/overlay2/9a61d8e0b1f574bea31bd208edde4fac0edb8458a3fc4ef00decd5d7ef525fc4/merged/var/lib/awx/public/static를 절대경로 root(/)로 설정하여 사용한다는 의심
        • 그러나 다시 생각해 보면, 배포시 마다 사용자가 매번 저 경로로 파일을 옮겨 작업한다는 것은 사실상 불가능
        • 시스템 어드민이 아니고서는 저 경로를 접근하는 것도 어렵고, Docker의 사상(?)과도 맞지 않음
        • 결정적으로
        • AWX에서 Playbook이 저장된 Yml파일 경로는 처음 설치시 설정한 /var/lib/awx/projects에서 읽어서 처리하게 되어 있음
        • 이 또한 의미 없음으로 판단
        • -
      • 접근 방법 3(성공) - Absolut path(절대경로)를 인식하지 못하는 문제?
        • AWX에서 Playbook을 선택하여 실행하는 경우 
        • 해당 yml파일을 읽어서 메모리에서 처리한다라고 생각하는게 잘못된 생각임
        • yml파일을 해당 위치에서 실행하는것으로 판단 - import나 기타 등등을 생각해보면 됨.
        • 배포 테스트 파일을 yml이 위치한 폴더로 이동
        • yml을 수정
        • Absolute path (절대 경로)를 Relative Path(상대 경로)로 변경
        • 터미널에서는 당연히 성공
        • AWX에서는
        • 성공
  4. 결론
    • Yaml파일에서 절대 경로를 인식하지 못함 (모든 명령어에서 확인한 부분은 아님)
    • 이는 copy나 shell:cp .. 혹은 Command 등 모든 명령어에서 동일하게 현상이 발생하는 문제
    • 절대 경로를 인식하지 못하는 버그 혹은 설치시 뭔가 설정을 잘못 했다는 결론에 이름
    • 절대 경로 인식 버그일 확률 90% 이상
    • playbook 사용시에는 반드시 상대 경로로 작업할 것을 권장


반응형
  1. yaml이란
    • YAML Ain't Markup Language의 약어
    • 구조화된 데이터나 오브젝트를 문자열로 변환 및 관리하기 위한 데이터 형식의 한 종류
    • 사람이 쉽게 읽을 수 있는 데이터 직렬화 양식
    • JSON이나 XML과 유사하나 가독성이 뛰어남
    • JSON과 상위 호환
    • 확장자는 대부분 .yml로 표기 (8.3 포맷의 경우)
    • 공백문자의 갯수로 상위와 구분 (탭문자는 사용할 경우 디버깅의 문제가 발생함)
    • 특수문자는 \(역슬래쉬)키와 함께 사용 됨 (c 코딩 패턴과 유사)
  2. yaml 방식 비교
    • 구분
      소스 (단순 비교를 위한 코드임)
      XML<keys>
        <key1> <value>value1</value>
      </key1>   <key2> <value>1</value> <value>2</value> <value>3</value>
      </key2> 

        <key3> <keys> <keys3-1> <value>1</value> </keys3-1> <keys3-2> <value>4</value> <value>5</value> <value>6</value> </keys3-2> </keys>
      </key2>  </keys>
      JSON
      {"key1":"value1","key2":[1,2,3]","key3":{"key3-1":"value3-1","key3-2":"value":[4,5,6]}}
      YAML---
      key1: value1
      key2: [1,2,3]
      key3:
       key3-1: value3-1
       key3-2: [4,5,6]
  3. 샘플 코드 작성
    • 하기 샘플 코드는 다른 명령어로도 가능하나 기본적인 테스트를 위해 작성 됨
    • HOST VM에 접속하여 샘플 코드를 /var/lib/awx/projects/awxtest에 각각 작성하여 저장
    • vi 명령어는 VI명령어 를 참조
    • 주의 : 모든 소스의 들여쓰기는 맞추어야 함(우측 이미지 참고, 탭 사용 금지)
    • helloworld.yml 작성
    • ---
      - name: Hello World!
      hosts: all

      tasks:
      - name: Hello World!
      shell: echo "Hi! It is working"

    • firewall 서비스 시작 (startFirewall.yml)
    • ---
      - name: Turn on the FireWall in system
      hosts: all

      tasks:
      - name: execute command for firewall
      shell: systemctl start firewalld

    • firewall 서비스 중지 (stopFirewall.yml)

    • ---
      - name: Turn on the FireWall in system
      hosts: all

      tasks:
      - name: execute command for firewall
      shell: systemctl stop firewalld

    • 작성 후 최종 화면 (read 권한 확인)
    • -
  4. 목표
    • yaml 파일 생성