티스토리 뷰

Ansible

yaml [ playbook ]

looeon 2024. 2. 13. 11:48

▶ 확장자를 yaml로 하면 탭을 스페이스로 바꿔준다

▷ yaml 은 tab을 사용하면 안된다

>> yaml 쓰려면 확장자를 yaml로 쓰라는 의미

>> ansible-doc  궁금한 것 입력으로 확인하면서 체크하자

>> /^= 로 필수사항 체크

>> EXAMPLE 보고 하자

>> 플레이는 순서가 지정된 작업집합
>> 인벤토리에서 선택한 호스트만 실행가능
>> 1개이상의 플레이가 필요하다
>> yaml 형식으로 작성
>> 일반적으로 확장자는 yaml 또는 yml 로 한다
>> 들여쓰기 규칙은 엄격하게 지켜야 한다.
>> 동일한 수준의 계층은 들여쓰기가 같아야 한다. 
>> 하위 항목은 상위항목보다 들여쓰기가 되어야 한다.
>> 빈줄은 얼마든지 사용해도 된다. 
>> 들여쓰기는 스페이스만 사용해야하고 탭은 사용할수 업다.
 그러나 vim 환경설정으로 탭을 스페이스키처럼 사용할수 있다.
 >> vim 편집기로 플레이북을 편리하게 사용하고 싶으면 환경설정 변경 $HOME/.vimrc
 autocmd FileType yaml setlocal ai ts=2 sw=2 et 
 >> 플레이북의 시작은 '---' 로 시작한다.(생략가능하다) 
 >> 플레이북의 종료는 '...' 이지만 일반적으로 거의 생략한다.

 

▶ playbook 의 시작과 task 의 시작은 list로 시작해야 한다는 것을 기억

[ - 으로 시작해야 한다 ]

>> hosts 는 생략불가
>> tasks 는 경우에 따라서 생략가능하다.
>> 하나이상의 작업이 등록되어 있는경우는 생략불가
>> tasks 는 관리대상 호스트에서 실행할 작업을 순서대로 나열
>> 목록에 있는 각 작업은 딕셔너리로 표현하며 키: 값 형태이다.

 

▶ 실제 실행하는 것이 아닌, 시뮬레이션을 돌려보는 것

>> 실행하는 것처럼 출력

ansible-playbook -C d.yaml

 

 

▶ yaml 설정할 때 설정 파일

[ cd /home/opuser ] >> [ vim .vimrc ]

>> FileType yaml : yaml 파일 타입에 대해서만 적용된다

>> expandtab : tab 을 space로 바꿔라

>> ai 는 자동 들여쓰기

>> shiftwidth 는 자동 들여쓰기 할 때에 이동 칸 수

>> set paste 는 복사 붙여넣기 했을 때 문제 해결

autocmd FileType yaml setlocal ts=2 shiftwidth=2 sts=2 expandtab ai

 

▶ 리스트 데이터란 뜻은 - 로 시작한다

▷ 위 name 은 playbook 을 위한 것

▷ 아래 name 은 task 를 위한 것

▷ host 는 inventory에 있는 것

▷ useradd -c "jang nara" tuser10 으로 만든다는 의미

▷ 쓰지 않는 모든 것들은 default

▷ 삭제할 거면 state: absent

▷ 끝까지가 하나의 single Playbook

--- # yaml 문서의 시작 생략해도 된다
- name: 계정생성을 위한 플레이북
  hosts: all
  tasks: # 태스크의 시작은 리스트로 시작한다
    - name: #계정생성을 위한 태스크
      user:
        name: tuser10
        comment: jang nara
        shell: /bin/bash
        uid: 1500
        group: wheel
        state: present

#    - name: 두번째 계정 생성
    - user:
        name: tuser10
        state: present

 

▷ 문법체크

[opuser@control sample]$ ansible-playbook --syntax-check user.yaml

 

▷ playbook 완료

 

 

#### 복붙 했을 때 계단형상 발생시

>> 미리 set paste 설정 후 붙여넣기

 

 

▷ 멀티 플레이북

 

▷ node1 에서 apache 실행

>> 원하는 상태를 만드는 것이기에 installed 로 설정한다

>> ansible-doc 에서는 install로 지정되어 있는데 딱히 상관은 없다

>> state: latest 더 높은 버전으로 설정해라

>> 들여쓰기 한 것은 종속관계를 의미

---
- name: playbook for http service
  hosts: node1
  tasks:
    - name: installed httpd
      yum:
        name: httpd
        state: latest
    - name: installed filrewalld
      yum:
        name: firewalld
        state: present
    - name: stated httpd
      service:
        name: httpd
        state: started
    - name: stated firewalld
      service:
        name: firewalld
        state: restarted

 

▷ immediate 를 통해서 [ firewall-cmd --reload ] 를 해야한다

>> permanent 를 썼으므로 reload 가 필요하다 

>> firewalld 는 모듈

>> 굳이 - name을 쓰지 않아도 된다 없어도 되나,

>> 시작은 - ( list ) 를 꼭 넣어주자

[ name 은 comment 처럼 사용 할 수도 있다 ]

---
- name: playbook for http service
  hosts: node1
  tasks:
    - name: installed httpd
      yum:
        name: httpd
        state: latest
    - name: installed filrewalld
      yum:
        name: firewalld
        state: present
    - name: stated httpd
      service:
        name: httpd
        state: started
    - name: stated firewalld
      service:
        name: firewalld
        state: restarted
    - firewalld:
        service: http
        permanent: yes
        immediate: yes
        state: enabled

 

>> 방화벽 켜고 문제 없이 실행

 

▶ 설정 내용은 task 위에 써야한다

 

▶ node 를 직접 적어줘도 되고, 그룹으로 적어도 된다
[ 둘 중 하나만 적는다 ]

 

 

▶ 초기 페이지 배포

▷ 소유주와 그룹을 안정하면 root로 된다

>> 설정 파일에서 root 로 설정을 해놨으므로

opuser 는 opuser 로 뜬다

 

▷ 배포

destination 이 필수 요소

 

>> 작업을 한대씩 끝내는 것이 아니라 하나씩 실행하며 끝내나간다

 

 

 

 

 

주석 처리는 # 으로 한줄씩 한다

command 모듈은 멱등성 보장 못하며,
change를 인지 못하지만, 간단한 걸로는 사용한다

localhost 는 inventory에 없어도 등록이 되어 있다고 간주한다

hosts:
 - server1
 - server2
 - server3
>> 한줄로 표기 가능 hosts: [ server1, server2, server3 ]

yum:
 name: httpd
 state: present
>> 한줄 표기 가능 yum: {name:httpd, state: present}

 

▷ 문자열 체크

- name: test playbook
  hosts: node1
  tasks:
    - command: echo "hello ansible"
    - command: echo "hello linux"

>> node1 에 출력되므로 모른다

>> localhost로 hosts를 바꿔도 보이지 않는다

>> node1 에서도 출력이 안됨 >> 몇 번째 콘솔인지 지정이 필요하다

 

▷ register 는 모듈이 아니므로 ansible-doc에서도 안나온다

[ 주로 디버깅을 위한 목적으로 사용한다 ]

>> task 의 실행결과를 변수에 저장한다

>> 하나의 모듈 아래에 register 사용 가능

>> register 는 변수를 지정해 준다

>> myvar 는 바로 위 내용의 register 변수로 지정된다

>> 값만 정해주는 것

>> debug 는 출력하는 모듈

- name: test playbook
  hosts: localhost
  tasks:
    - command: echo "hello ansible"
      register: myvar
    - command: echo "hello linux"
      register: myvar2
    - command: cal
      register: myvar3
    - debug:
        var: myvar
    - debug:
        var: myvar2
    - debug:
        var: myvar3

 

>> 전체 결과는 제이슨(JSON) 형태로 출력됨

>> value 와 key 형식

 

▷ debug 의 default 는 hello world

 

▷ 줄바꿈 처리한다

 

▷한줄로 처리한다

 

 

▷ checksum 값이 다르면 실행한다

[opuser@control src]$ md5sum index.html
7ad4a024ee8f2045583ff149b1b43d39  index.html
[opuser@control src]$ echo "whatwhat" > index.html
[opuser@control src]$ md5sum index.html
246b7a0f66819fa91b13fd7680586d2a  index.html

 

 

변수는 문자로 시작해야 하며
특수문자는 ' _ ' 만 가능하다
>> 숫자로 시작하면 안된다

변수 정의가 가능한 곳
1. inventory 내에서 변수 정의
2. playbook 의 vars 블록에서 정의
3. palybook 의 var_files 로 외부파일에서 정의

 

>> vars 는 모듈이 아니다

>> 변수 취급을 위해선 {{ }} 중괄호 2개 사용

>> var 뒤는 바로 변수로 취급한다

>> 변수명으로 시작할 때에는 " " 가 필요하다

>>> 전체를 다 " " 붙여줘야 한다

- name이 있으므로 - 제거해줘야 한다

 

▶ inventory 내에서의 변수 설정

▷ 그룹변수도 가능 

[ 그룹명:vars ]

▷ 변수가 2개면 그냥 띄어서 쓰면 된다

( 한 칸 이상 탭 or 스페이스로 띄우면 된다 )

 

## gather_facts: no 는 빠르게 실행이 가능하다

## 변수가 아니다

값 2개 이상을 한번에 쓸 때 [ ] 사용

 

>> playbook 이 가장 우선권을 가진다

>>  inventory 에 변수를 설정하면

>>> 복잡하고 관리하기 쉽지 않다

>>> 따라서 group_vars , host_vars 디렉터리 사용 권장

 

>> host_vars 는 디렉터리 명 똑같이 / 호스트와 똑같은 파일이름

[opuser@control sample]$ mkdir host_vars
[opuser@control sample]$ cd host_vars/
[opuser@control host_vars]$ cat node1
package: finger
[opuser@control host_vars]$ cat node2
package: finger-server
service: finger-server

 

>> group_vars 는 디렉터리 명 똑같이 / 그룹명과 똑같은 파일이름

[opuser@control sample]$ mkdir group_vars
[opuser@control sample]$ cd group_vars/
[opuser@control group_vars]$ vim debservers
[opuser@control group_vars]$ cat debservers
service: mariadb

 

 

▩ 실습

node 1 / node 2 / node 3 각각 다른 웹 페이지 출력되도록 설정

>> 각 node 마다 설정을 해야하므로, inventory 나 host_vars 에서 설정하는게 편하다

[webservers]
node1 index_file=node1.html
node2 index_file=node2.html

[dbservers]
node3 index_file=node3.html

 

>> 각자 다른 내용으로 설정

[opuser@control src]$ ls
index.html  node1.html  node2.html  node3.html
[opuser@control src]$ vim node1.html
[opuser@control src]$ vim node2.html
[opuser@control src]$ vim node3.html

 

▶ lineinfile 모듈

▷ create 가 설정되어야 파일이 생성되면서 에러가 뜨지 않는다

[webservers]
node1 index_file=node1.html nodename=node1
node2 index_file=node2.html nodename=node2

[dbservers]
node3 index_file=node3.html nodename=node3

 

 

 

>> index.html 만들어진게 있으면,

>> 그 뒤에 내용이 추가된다

'Ansible' 카테고리의 다른 글

Ansible 총 정리  (1) 2024.02.15
Ansible 변수 추가내용  (0) 2024.02.14
Ansible module  (0) 2024.02.13
Visual Studio Code  (0) 2024.02.08
Ansible 환경 변수 / DB 연동  (0) 2024.02.08
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함