반응형
  • 앤서블 "target uses selinux but python bindings" 에러 해결 방법

libselinux-python 패키지가 없거나, OS에서 파이썬을 3점대로 버전 업 했을 때 발생할 수 있습니다. 저의 경우 OS에서 파이썬을 3.9로 업그레이드하여 발생한것으로 아래 조치들을 통해 해결 했습니다.

 

저의 경우 libeselinux-python3 설치 후 같은 현상이 발생하여 pip install selinux까지 진행 하였으나, 검색한 바로는 libselinux-python3 install만 해도 된다는 내용들이 많았으니 참고 해주세요.

yum -y install epel-release
yum -y install libselinux-python3
python -m pip install --upgrade pip
python -m pip install selinux

 

반응형
반응형
  • 앤서블 일반 사용자 계정 "Invalid/incorrect password: Permission denied, please try again." 에러 해결 방법

일반 사용자 계정으로 앤서블을 사용하려 할 때 분명히 패스워드가 맞는데도 "Invalid/incorrect password: Permission denied, please try again." 에러가 발생할 수 있습니다. 

 

해당 에러는 /etc/ansible/hosts파일에 ansible node들을 지정하게될 때 IP 앞에 사용자명을 입력시켜 해결할 수 있습니다. 아래와 같이 /etc/ansible/hosts 파일을 점검해보시길 바랍니다.

# 에러 발생
[worker]
192.168.11.21
192.168.11.22
192.168.11.23

# 아래와 같이 변경하여 에러 해결
[worker]
root@192.168.11.21
root@192.168.11.22
root@192.168.11.23

 

반응형
반응형
  • 앤서블로 yum 사용하는 방법

앤서블로 yum을 사용하는 방법 입니다. ansible 서버에서 아래 예시를 참고하여 yml 파일을 작성해 줍니다.

---
- name: Install vim and net-tools
  hosts: worker # 저는 /etc/ansible/hosts에 worker 라는 이름으로 그룹핑 해놨기 때문에 worker로 작성 하였습니다.
  gather_facts: no
  become: yes

  tasks:
    - name: install epel-release
      yum: name=epel-release state=latest  # epel 저장소 최신 버전으로 설치
    - name: install vim
      yum: name=vim state=present          # vim 설치
    - name: install net-tools
      yum: name=net-tools state=present    # net-tools 설치



# 삭제 예시
#    - name: install net-tools
#      yum: name=net-tools state=absent    # net-tools 삭제

 

이후 아래와 같이 ansible-playbook을 통해 실행한 후 정상적으로 worker들에게 설치가 된것을 확인할 수 있었습니다.

참고로 저의 경우 authorized_key 설정(nirsa.tistory.com/281?category=914087)을 해놧기에 -k 옵션 없이 명령어를 사용 하였으니 참고 해주세요.

ansible server
worker server

 

반응형
반응형

 

  • 앤서블 조건식 거는 방법 (ansible-palybook yml when)

앤서블 플레이북을 작성할 때 when을 사용하여 특정 조건,상황을 만족해야 실행될 수 있도록 설정하는 방법에 대해 포스팅 하겠습니다. 사용 환경은 아래와 같습니다.

  • ansible master, node01, node02
  • OS : CentOS 7.8

* facts를 통한 테스트 필요 없이 바로 when 사용 방법을 알고 싶으시다면 facts쪽은 패스하고 하단에 있는 when 테스트를 바로 보셔도 됩니다.

 

  • 테스트를 위한 facts 수집 및 비교

특정 노드의 환경이나 OS 등을 확인한 후 when을 사용해서 특정 노드만 실행되도록 할 수 있는데, 우선 테스트를 해보기 위해 아래와 같이 node01, 02의 facts를 수집하도록 하겠습니다.

ansible 192.168.235.20 -m setup > facts1.txt
ansible 192.168.235.21 -m setup > facts2.txt

 

특정 노드에서만 실행되는지를 테스트하기 위해 diff 명령어를 이용해 서로 다른 facts를 확인해봅니다. 저는 ip 주소와 mac 주소를 가지고 테스트 해보도록 하겠습니다.

 

우선 facts1.txt 파일을 보면 address와 macaddress가 ansible_default_ipv4라는 필드 아래에 존재하고 있습니다.

 

  • when 테스트 - 1

맥주소가 00:0c:29:0a:0c:26인 호스트(192.168.235.20)가 있을 경우 "mac address" 문자열을 출력, ip 주소가 192.168.235.21인 호스트가 있을 경우 "ip address"를 출력하는 간단한 yml 입니다. 해당 코드를 작성하며 주의 및 설명은 아래와 같습니다.

  1. hosts: nginx는 본인의 환경에 따라서 변경 해주어야 합니다.
  2. when의 ansible_default_ipv4 이후 [] 구간은 바로 위의 스샷을 확인해보시면 이해할 수 있습니다. ansible_default_ipv4 이후 {}안에 address와 alias, broadcast 등의 필드로 나뉘어 지는데 ansible_default_ipv4['macaddress']는 ansible_default_ipv4 아래의 macaddress 필드를 가르키는 의미이며 ansible_default_ipv4['address']는 ansible_default_ipv4 아래의 address 필드를 가르킵니다. 즉, macdress 필드가 00:0c:29:0a:0c:26인것을, address 필드가 192.168.235.21인것을 의미 합니다.
---
- name: when test
  hosts: nginx  #/etc/ansible/hosts 내용에 따라 해당 라인을 변경

  tasks:
    - name: mac address가 00:0c:29:0a:0c:26 인 경우 mac address! 출력
      debug:
        msg: echo "mac address!"
      when: ansible_default_ipv4['macaddress'] == '00:0c:29:0a:0c:26'

    - name: ip address가 192.168.235.21 인 경우 ip address! 출력
      debug:
        msg: echo "ip address!"
      when: ansible_default_ipv4['address'] == '192.168.235.21'

 

이후 ansible-playbook when.yml 명령을 이용해 해당 yml을 실행시켜보면 mac address가 00:0c:29:0a:0c:26인 경우 21번 서버는 해당되지 않으므로 skipping이 발생, 20번 서버는 mac address가 일치하므로 echo "mac address!" 가 실행 되었습니다.

마찬가지로 그 아래는 ip address가 192.168.235.20번 서버는 일치하지 않으므로 skipping 발생, 192.168.235.21번 서버는 일치하므로 echo "ip address!"가 실행 되었습니다.

 

  • when 테스트 - 2

마지막으로 아래와 같이 ==, >, < 와 같은 기호를 통해서도 할 수 있습니다. 현재 저의 node01, node02의 ansible_uptime_seconds 값은 6000 이상 입니다.

아래와 같이 5000보다 높을 경우 uptime_seconds > 5000 문자열을, 5000보다 낮을 경우 uptime_second < 5000 문자열을 출력하도록 when2.yml 파일을 작성 하였습니다. 즉, 저의 현재 uptime_seconds 값은 6000 이상이므로 uptime_seconds > 5000이 실행되고 uptime_seconds < 5000은 skipping이 되어야 합니다.

* 참고로 when 부분의 숫자를 '' 으로 묶어버리면 숫자가 재대로 인식되지 않아 의도한바와 다른 결과가 출력 됩니다. ''으로 묶게되면 숫자가 아니라 단순 문자로 취급해버리는 것 같은데 정확한 이유는 확인하지 못했으니 참고 해주세요.

---
- name: when test
  hosts: nginx

  tasks:
    - name: ansible_uptime_seconds이 5000보다 더 높은 경우 출력
      debug:
        msg: echo "uptime_seconds > 5000"
      when: ansible_uptime_seconds > 5000

    - name: ansible_uptime_seconds이 5000보다 더 낮은 경우 출력
      debug:
        msg: echo "uptime_seconds < 5000"
      when: ansible_uptime_seconds < 5000

 

ansible-playbook when2.yml 명령어르 실행해주면 5000 이상이므로 uptime_seconds > 5000이 출력되었고, 낮은 경우는 skipping이 발생한것을 확인할 수 있습니다.

 

이와 같이 특정 상황을 만족하는 호스트들만 yml에 작성한 내용이 실행될 수 있도록 설정할 수 있습니다.

 

반응형

+ Recent posts