기본
설정은 INI 포멧을 사용
- ANSIBLE_CONFIG
- ./ansible_config
- ~/.ansible.cfg
- /etc/ansible/ansible.cfg
- 순서로 설정을 찾는다
- export ANSIBLE_SUDO_USER=root
설정관리 툴셋
Inventory
group of group
regexp
- Puppet: manifest
- Chef: cookbook
- Ansible: playbook
- playbook은 yml 사용
- Chef나 Puppet은 Ruby를 사용
- facts 라는 것은 시스템 환경변수를 말한다
- 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
[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) 리턴
고급
- 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
댓글
댓글 쓰기