기본 콘텐츠로 건너뛰기

Ansible 요약

기본 

설정은 INI 포멧을 사용
  • ANSIBLE_CONFIG 
  • ./ansible_config
  • ~/.ansible.cfg
  • /etc/ansible/ansible.cfg
  • 순서로 설정을 찾는다
ANSIBLE_ 로 시작하는 환경변수는 설정 파라미터로 사용할 수 있다.
  • export ANSIBLE_SUDO_USER=root

설정관리 툴셋

- name: “Show how debug works”
  debug: {{ ansible_distreibution }}


Inventory
  • INI 포멧의 file 이다 
  • -i 또는 --inventory-file 
  • ansible.cfg에 host_file이 기본 설정 
  • group을 정할 수 있다
[webservers]
192.168.0.1
192.168.0.2

group of group
[webservers]
192.168.0.[1:100]
[dbservers]
192.168.0.[1:100]
[restartable]
webservers
webservers


regexp


[webservers]
192.168.0.[1:100]

external variable
192.168.1.2 ansible_ssh_private_key_file=~/.ssh/aaa.pub

command module
  • 쉘변수나 오퍼레이터 <, >, |, & 등은 안됨 
  • C에서 fork 와 유사

- name: Reboot
  command: /sbin/shutdown -r now
  sudo: yes

raw module
  • 컴퓨터 머신에 적용하거나 SSH에서 command를 실행할 때 
  • 파이썬이 설치되지 않은 원격머신에서 Task를 실행할때 또는 네트워킹 장치나, 라우터와 스위치와 같은데 사용될 수 있다

- name: Install vim
  raw: yum -y install vim-command
  sudo: yes

script module
  • 원격 머신에서 스크립트를 실행
- name: List directories in /etc
  script: list_number_of_directories.sh /etc
  sudo: yes

$ls -l /etc | egrep ‘^d’ | wc -l
83


shell module
  • command와 다른점은 /bin/sh를 기본으로 사용. shell 환경을 그대로 쓰기 때문에 환경변수나 쉡 기능을 쓸 수 있음

- name: List files in /tmp and redirect to a file
  shell: /bin/ls -l /tmp > /tmp>list
  sudo: yes

- name: Cat /tmp/list
  shell: /bin/cat /tmp/list

file module
  • 파일 속성을 바꾼다. 
  • touch, create, delete recursive directories 
  • create, delete symlinks. 
- name: permission...
  file: path=/etc/httpd/conf/httpd.conf owner=root group=root mode=0644
  sudo: yes


- name: symlink...
  file: path=/etc/httpd/conf/httpd.conf owner=root group=root mode=0644 state=link
  sudo: yes



template module
  • Ansible은 Jina2 템플릿을 사용함 
  • 장고에서 사용하는 템플릿엔진 
  • 루비와 쉐프에서 사용하는 Erubis와 유사 
  • 설정파일 검사에도 사용될 수 있음 
- name: Create virtual host
  template: src=test.conf dest=/etc/httpd/conf.d/test.conf mode=644 validate=‘httpd -t -f %s'
  sudo: yes

copy module
  • 로컬에서 원격으로 파일 카피 
  • template와 마찬가지로 validate 지원 
- name: Copy file
  copy: src=test2.conf dest=/etc/test2.conf owner=root group=root, mode=644

source control
  • git 
    • before(SHA value), after(SHA value), changed(boolean) 리턴 



고급

Parallel

  • async: 여러 서버에 병렬로 요청 후 완료를 기다릴 최대시간
  • poll: 각 서버 처리상태 체크 폴링주기
- host: all
  task:
    - name: Install malocate
      yum: name=mlocate state=installed

    - name: Run updatedb
       command: /user/bin/updatedb
       async: 300
       poll: 10

Loop
  • with_items: 반복될 값 리스트 
  • item: 반복될때 각 반복별 값
tasks:
    - name: Secure config file
      path: “/etc/{{ item }}"
      mode: 0600
      owner: root
      group: root
      with_items:
        - my.cnf
        - shadow
        - fstab



tasks:
    - name: Make key directory file:
      path: /root/.sshkeys
      ensure: directory
      mode: 0700
      owner: root
      group: root
    - name: Upload public keys copy:
      src: "{{ item }}"
      dest: /root/.sshkeys
      mode: 0600
      owner: root
      group: root
      with_fileglob:
        - keys/*.pub
        - name: Assemble keys into authorized_keys file assemble:
      src: /root/.sshkeys
      dest: /root/.ssh/authorized_keys
      mode: 0600
      owner: root
      group: rootL9


Conditional
  • when: 조건절
- name: Install
  host: all
  tasks:
    - name: Install via yum
      yum:
      name: ..
      state: installed
      when: ansible_os_family == “RedHat"

    - name: Install via apt
        apt:
        name: ..
        state: installed
        when: ansible_os_family == “Debian"

    - name: Unexpected OS
      debug:
      msg: “OS {{ ansible_os_family }} is not supported"
      fail: yes
      when: ansible_os_family != “Debian” and ansible_os_family != “Debian"


Delegation

설정을 타겟 머신이아닌 다른 호스트에서 실행한다
  • delegate_to: 실행할 호스트 
  • get_url: 설정 다운로드 주소 

- name: 전체 웹서버에서 설정 가져오기
  hosts: webservers
  tasks:
- name:
  get_url:
  dest: “configs/{{ ansible_hostname }}"
  force: yes
  url: “http://{{ ansible_hostname }}/diagnostic/config"
  delegate_to: localhost


Variables

  • hostvars
    • 현재 play의 모든 호스트의 변수에 접근가능함
    • setup 모듈이 아직 실행전 이라면, hostvars의 변수들만 사용할 수 있다
    • ${hostvars.hostname.fact}, ${hostvars.server1.ansible_distribution} 처럼 사용
    • {{ hastvars.[any_variable].default_ipv4.address }} 처럼도 중간에 변수 사용가능
---
- name: Setup..
  hosts: nameservers
  tasks:
- name:
  set_fact:
  dns_master: “{{ hostvars.nameserver1.ansible_default_ipv4.address }}”
- name:
  template:
  dest: /etc/named.conf src: templates/named.conf.j2


  • groups
    • inventory 그룹의 호스트 리스트
ex1

- name:
  hosts: dbservers
  user: root
  tasks:
    ...

- name: 사용자 생성
  with_items: groups.appservers
  mysql_user:
  name: aaa
  password: bob
  host: “{{ hostvars.[item].ansible_eth0.ipv4.address }}"
  state: present

ex2

known_host.j2
{% for host in groups['all'] %}
{{ hostvars[host]['ansible_hostname'] }}
{{ hostvars[host]['ansible_ssh_host_key_rsa_public'] }}
{% endfor %}

known_hosts.yml
---
hosts: all
tasks:
- name:
  hosts: all
  tasks:
     - name:
       template:
          src: templates/known_hosts.j2
          dest: /etc/ssh/ssh_known_hosts
          owner: root
          group: root
          mode: 0644


  • group_names
    • 현재 호스트의 모든 그룹이름
    • 디버깅이나 조건부 그룹 선택이나 Task 스킵에 유용
- name: Setup SSH
  hosts: sshservers
  tasks:
- name: Secure
  set_fact:
  sshconfig: files/ssh/sshd_config_secure
  when: "'secure' in group_names"

- name: Non-secure
  set_fact:
  sshconfig: files/ssh/sshd_config_default
  when: "'secure' not in group_names"

- name: Copy over the config
  copy:
  src: "{{ sshconfig }}"
  dest: /tmp/sshd_config




  • first_available_file
    • 파일 리스트 중에 첫번째 파일
    • 첫번째 파일이 없으면 두번째.. 끝까지
    • item 과 같이 사용
- name
  copy
  dest: /etc/apache.conf
  src: “”{{ item }}"
  first_available_file:
    - “files/apache/{{ ansible_os_family }}={{ unusable_architecture }}.cfg"
    - “files/apache/default-{{ ansible_architecture }}.cfg"
    - “files/apache/default.cfg"


  • 환경변수
    • shell 모듈과 함께 사용
- name: Upload
  shell: >
     was s3 put-object
       --bucket=my-test-bucket
       --key={{ ansible_hostname }}/fstab
       --body=/etc/fstab
       --region=eu-west-1
      environment:
        AWS_ACCESS_KEY_ID: XXXXXXXXXXXXXXXXXXX
        AWS_SECRET_ACCESS_KEY: XXXXXXXXXXXXXXXXXXXXX

External Data Lookup
  • with_*: 
  • with_fileglob 

Results
  • file 
---
- name: 
  hosts: 
  user: root
  tasks:
    - name: 
      file:
        dest: /tmp
        state: directory
      register: tmp

    - name: 
      file:
        dest: /tmp/subtmp
        mode: "{{ tmp.mode }}"
        state: directory

Processing Data
  • Jinja2 기본 템플릿으로 데이터 변환이 안될때 
  • <변수명> ‘|’ <filter> 예, “item | lower" 
  • 필터종류 
    • min, max, random 
    • changed, failed, skipped 
    • default(X), replace(X,Y), join(X) 
    • unique 
    • b64decode 
---
- name: 
  hosts: all
  vars:
    users:
  tasks:
    - name: Create accounts
      user: name={{ item|lower }} state=present
      with_items:
        - Fred
        - John
        - DanielH



댓글