becool

20210728 (수) playbook 변수 실습 본문

ansible

20210728 (수) playbook 변수 실습

gusalstm 2021. 7. 28. 17:47
반응형

09:33 review

 

 adhoc 명령어 추가 설명

 

[user@ansible-server work]$ ansible all -m copy -a "src=/etc/resolv.conf dest=/tmp/"

[user@ansible-server work]$ ansible all -m shell -a "ls -l /tmp/resolv.conf"

[user@ansible-server work]$ ansible all -m user -a "name=work password=1234"

[user@ansible-server work]$ ansible all -m user -a "name=work state=absent"

[user@ansible-server work]$ ansible webservers -m yum -a "name=zsh state=present"

[user@ansible-server work]$ ansible all -m yum -a "name=zsh state=present"

[user@ansible-server work]$ ansible all -m yum -a "name=vim state=present"

[user@ansible-server work]$ ansible all -m yum -a "name=vim state=latest"

   * 최신버전으로 업데이트 : latest

   * 프로그램이 설치만 되어있으면 아무동작안함 (업데이트 x) : present

 ※ name=yum (value of state must be one of: absent, installed, latest, present, removed)

 ※ name=service (value of state must be one of: reloaded, restarted, started, stopped

 ※ name=lineinfile (value of state must be one of: absent, present)

[user@ansible-server work]$ ansible all -m service -a "name=crond state=started"

[user@ansible-server work]$ ansible all -m service -a "name=crond state=stopped"

[user@ansible-server work]$ ansible -m file -a "path=/etc/ansible/fact.d state=directory recurse=true"

 

---
- name: Install Apache HTTPD Webservers
  hosts: all
  become: true
  become_user: root

  tasks:
  - name: Install Apache HTTPD Package
    yum:
      name: httpd
      state: latest
  - name: Ensure start and enable Apache HTTPD Service
    service:
      name: httpd
      state: started
      enabled: true
  - name: Create index.html Web Content
    copy:
      content: "Hello Apache webserver<br>index.html"
      dest: /var/www/html/index.html
---
- name: "Setup firewall service rules"
  hosts: all
  become: true
  become_method: sudo

  tasks:
  - name: "Allow web service"
    firewalld:
      service: http
      state: enabled


[user@ansible-server work]$ ansible all -m command -a "firewall-cmd --list-services" --become
192.168.56.12 | CHANGED | rc=0 >>
dhcpv6-client http ssh
192.168.56.13 | CHANGED | rc=0 >>
dhcpv6-client http ssh
192.168.56.11 | CHANGED | rc=0 >>
dhcpv6-client http ssh

 

변수 (Variable)

 - 데이터를 저장하기 위한 메모리의 저장 공간

 

변수의 이름 규칙

 - 변수의 이름은 영문 대소문자, 숫자, '_'로 구성됨

 - Python 에서 사용하는 키워드(예약어)는 사용 불가

 - 변수의 이름은 숫자로 시작할 수 없음 

 - 영문자나 언더바로 시작은 가능

 

사용가능 사용불가
foo
foo_test
foo5
_foo
*foo
foo-test
5foo
foo test
foo.test
1foo
12345

 

변수 종류

1. 기본변수 2. 목록변수
(1) 기본 변수 정의
  host_name: "test01"
(2) 기본 변수 참조
  {{ host_name }}
(1) 목록 변수 정의
  list01:
    - northeast
    - southeast
    - mideast
 (2) 목록 변수 참조
    test: "{{ list01[0] }}"
3. 사전 변수 (Dictionary Variable) 4. 등록 변수 (Registered Variable)
(1) 사전 변수 정의
   foo:
     field1: one
     field2: two
(2) 사전 변수 참조
     foo['field1']
     foo.field1
모듈 실행 후 리턴 값을 저장하는 변수

변수의 정의 가능 경로
  - 인벤토리(inventory)
  - 플레이북(Playbook)
  - 외부 참조 파일(재사용 가능 파일)
  - 역할
  - 명령어의 '-e' 옵션

 

변수의 사용 범위

  - 전역/플레이북 : ansible.cfg, 명령어 실행 시 옵션으로 전달하는 변수 

  - 호스트 그룹 : 

  - 호스트

  - 플레이(play) : vars, vars_files 

  - 블록 :

  - 작업(task) : 

 

playbook을 통한 변수 사용 실습 : vars에 선언하고 아래에서 사용

※ playbook에서 {{ }} 괄호로 문장이 시작하면 " "필요. 문장 중간에 들어가면 불필요 

[user@ansible-server work]$ vim 0728_playbook_variables.yml

---
- name: Configure Apache Web Service
  hosts: webservers
  vars:
  - package_web: httpd
    package_firewall: firewalld
    service_web: httpd
    service_firewall: firewalld
    rule_service: http
  become: true

  tasks:
  - name: Install Packages
    yum:
      name:
      - "{{ package_web }}"
      - "{{ package_firewall }}"
      state: latest
  - name: The {{ service_firewall }} service is started and enabled
    service:
      name: "{{ service_firewall }}"
      state: started
      enabled: true
  - name: The {{ service_web }} service is started and enabled
    service:
      name: "{{ service_web }}"
      state: started
      enabled: true
  - name: Web service is allowed
    firewalld:
      service: "{{ rule_service }}"
      state: enabled
      permanent: true

[user@ansible-server work]$ ansible-playbook 0728_playbook_variables.yml

PLAY [Configure Apache Web Service] ************************************************************************************

TASK [Gathering Facts] *************************************************************************************************
ok: [192.168.56.12]
ok: [192.168.56.13]

TASK [Install Packages] ************************************************************************************************
ok: [192.168.56.12]
ok: [192.168.56.13]

TASK [The firewalld service is started and enabled] ********************************************************************
ok: [192.168.56.12]
ok: [192.168.56.13]

TASK [The httpd service is started and enabled] ************************************************************************
ok: [192.168.56.12]
ok: [192.168.56.13]

TASK [Web service is allowed] ******************************************************************************************
changed: [192.168.56.12]
changed: [192.168.56.13]

PLAY RECAP *************************************************************************************************************
192.168.56.12              : ok=5    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
192.168.56.13              : ok=5    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

 

과제

 playbook 에서 변수를 사용하여 포함된 install_web_variables.yaml 작성

 

web server: nginx

db: mariadb

firewall 허용 서비스 http

설치 호스트 ansible-node01 (192.168.56.11) - inventory에 정의

 


[user@ansible-server work]$ cat install_web_variables.yaml
---
- name: "variables exam #3"
  hosts: 192.168.56.11
  become: true
  vars:
  - release : epel-release
    package_web: nginx
    package_db: mariadb
    package_db_server: mariadb-server
    service_firewall: firewalld
    package_web_rule: http
    package_db_rule: mysql

  tasks:
  - name: install {{ release }}
    yum:
      name: "{{ release }}"
      state: latest

  - name: install packages
    yum:
      name:
      - "{{ package_web }}"
      - "{{ package_db }}"
      - "{{ package_db_server }}"
      state: latest
  - name: The {{ service_firewall }} service is started and enabled
    service:
      name: "{{ service_firewall }}"
      state: restarted
      enabled: true

  - name: The {{ package_web }} service is started and enabled
    service:
      name: "{{ package_web }}"
      state: started
      enabled: true

  - name: The {{ package_db }} service is started and enabled
    service:
      name: "{{ package_db }}"
      state: started
      enabled: true

  - name: Allow to {{ package_web_rule }} service in Firewalld (permanent)
    firewalld:
      service: "{{ package_web_rule }}"
      state: enabled
      permanent: true

  - name: Allow to {{ package_web_rule }} service in Firewalld (runtime)
    firewalld:
      service: "{{ package_web_rule }}"
      state: enabled


  - name: Allow to {{ package_db_rule }} service in Firewalld (permanent)
    firewalld:
      service: "{{ package_db_rule }}"
      state: enabled
      permanent: true

  - name: Allow to {{ package_db_rule }} service in Firewalld (runtime)
    firewalld:
      service: "{{ package_db_rule }}"
      state: enabled



[user@ansible-server work]$ ansible-playbook install_web_variables.yaml

PLAY [variables exam #3] ***********************************************************************************************

TASK [Gathering Facts] *************************************************************************************************
ok: [192.168.56.11]

TASK [install epel-release] ********************************************************************************************
changed: [192.168.56.11]

TASK [install packages] ************************************************************************************************
changed: [192.168.56.11]

TASK [The firewalld service is started and enabled] ********************************************************************
changed: [192.168.56.11]

TASK [The nginx service is started and enabled] ************************************************************************
changed: [192.168.56.11]

TASK [The mariadb service is started and enabled] **********************************************************************
changed: [192.168.56.11]

TASK [Allow to http service in Firewalld (permanent)] ******************************************************************
ok: [192.168.56.11]

TASK [Allow to http service in Firewalld (runtime)] ********************************************************************
ok: [192.168.56.11]

TASK [Allow to mysql service in Firewalld (permanent)] *****************************************************************
ok: [192.168.56.11]

TASK [Allow to mysql service in Firewalld (runtime)] *******************************************************************
ok: [192.168.56.11]

PLAY RECAP *************************************************************************************************************
192.168.56.11              : ok=10   changed=5    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

[user@ansible-server work]$

웹서버노드에서 방화벽 확인

[user@ansible-node01 lib]$ sudo firewall-cmd --list-services
dhcpv6-client http mysql ssh
[user@ansible-node01 lib]$ sudo firewall-cmd --list-services --permanent
dhcpv6-client http mysql ssh

과제시 유의사항

1) 의존성 : nginx설치를 위한 epel-release 설치 선행

2) mariadb 패키지 : mariadb, mariadb-server 두개 설치해야함

3) systemctl start와 firewall-cmd --add-service를 서비스별로 묶어서 리스트 형태로 해봤으나 안됨.

fatal: [192.168.56.11]: FAILED! => {"changed": false, "msg": "This module does not currently support using glob patterns, found '[' in service name: ['firewalld', 'nginx', 'mariadb']"}

fatal: [192.168.56.11]: FAILED! => {"changed": false, "msg": "ERROR: Exception caught: org.fedoraproject.FirewallD1.Exception: INVALID_SERVICE: ['http', 'mysql'] Non-permanent operation, Services are defined by port/tcp relationship and named as they are in /etc/services (on most systems)"}

4) nginx 서비스를 시작할때는 아파치 웹서비스 http 서비스가 종료된 상태에서만 가능

5) 문자열 :   - name: "{{ service_firewall }} service is started and enabled"  전체 문자열은 "" 쌍따옴표로 묶을 것.

 

728x90
Comments