oh my zsh 설치하기 개발 이것저것

터미널을 조금 더 편리하게 사용할 수 있게 해주는 tool 인 

zsh 를 사용하는법을 간단히 적어보려한다.


설치하기

일단, 설치는 리눅스 또는 mac 에서만 가능하다.

https://github.com/robbyrussell/oh-my-zsh 에 접속하면 install guide 가 나온다.

주요 설정은 ~/.zshrc 에서 하면됨


<플러그인>

플러그인은 주로 다양한 코드 하이라이팅 을 지원한다.
아래에서 쓸만한 것이 있는지 찾아보면 된다.

https://github.com/robbyrussell/oh-my-zsh/tree/master/plugins

플러그인 변경은 ~/.zshrc 에서 plugins 부분을 변경하면 됨
여러개를 적용할 수 있다.

<테마>

테마는 쉘의 기본 표시 컬러나 스타일등을 결정한다.
값의 변경은 ~/.zshrc 에서 ZSH_THEME 부분을 변경하면 됨

아래 위키에서 쓸만한 테마가 있는지 찾아보도록 하자.
https://github.com/robbyrussell/oh-my-zsh/wiki/themes

+ 나는 주로 agnoster 를 쓰는데 이것을 사용하려면 
여기에서 powerline font 를 다운로드 받아다가 설치하여
내가 사용하는 터미널 app 에서 폰트 설정을 변경해 주어야 함.


[번역] Ansible 2 튜토리얼 #5 (Final) - Facts & Vault 개발 이것저것

https://serversforhackers.com/c/an-ansible2-tutorial
위 링크를 번역한 글입니다.
==================================================

Facts

Playbook 을 실행하였을때 항상 처음에 "gathering facts" 라고 뜨는것을 알아차리셨을 겁니다.

Ansible은 그 어떤 Task 라도 실행하기전에 시스템 환경정보 (그것의 provisioning 정보) 를 모읍니다. (프로비저닝=provisioning : 사용자의 요구에 맞게 시스템 자원을 할당, 배치, 배포해 두었다가 필요 시 시스템을 즉시 사용할 수 있는 상태로 미리 준비해 두는 것을 말함) 이러한것을 Facts 라고 부르며 그것은 꽤 방대한 시스템 정보를 담고있는 array 를 가지고 있다. (cpu core 개수, 네트워크가 ipv4 인지 ipv6, 디스크 마운트 정보, 리눅스 버전 등)

Facts 는 종종 Task 와 Template 설정 에서 유용하게 쓰입니다.
예를들어 Nginx 는 흔히 Cpu core 개수만큼 worker processor 를 띄우죠.
이것을 알기 위해서는 당신은 아마 nginx.conf.j2 파일을 아래와 같이 작성해야 할겁니다:

user www-data;
worker_processes {{ ansible_processor_cores }};
pid /var/run/nginx.pid;

# And other configurations...
Or if you have a server with multiple CPU's, you can use:

user www-data;
worker_processes {{ ansible_processor_cores * ansible_processor_count }};
pid /var/run/nginx.pid;

# And other configurations...



Ansible facts 는 모두 "ansible_" 로 시작합니다. 그리고 variable 이 사용될수 있는 모든곳에서 사용이 가능하죠:
(즉, Variable 파일, Task, Template 들을 말합니다)

어떤 facts 가 사용가능한지 아래 내용을 로컬 머신에서 실행시켜 보세요:

# Run against a local server
# Note that we say to use "localhost" instead of defining a hosts file here!
ansible -m setup --connection=local localhost

# Run against a remote server
ansible -i ./hosts remote -m setup




Vault


우리는 종종 우리의 Ansible template 에 어쩔수 없이 민감정보를 저장해야할때가 있습니다.
이때 Ansible Valut 를 사용하면 좋지요

Vault 는 Yaml file 을 암호화 할수 있게 해줍니다. 일반적으로 Variable 에서 사용되죠. Vault 는 Template 이나 Files 에 들어있는 파일은 안되고요, 오직 yaml 파일만 됩니다.

암호화된 파일을 만들때, 당신에게 password 를 물어볼 수 있습니다. 그 패스워드는 해당 파일을 나중에 수정하거나 Roles 또는 Playbook 에서 참조할때 사용하게 됩니다.

패스워드를 만들어서 어딘가 안전한 곳에 잘 보관하세요

여기에 새로운 Variable file 을 만드는 예제가 있습니다 :

$ ansible-vault create vars/main.yml
Vault Password:


암호를 입력하고나면 기본 에디터(vim 또는 nano)로 파일이 열릴겁니다.

EDITOR 환경변수로 지정된 프로그램을 사용합니다. 보통 vim 이죠.
vim 을 사용하지않으면 환경변수를 바꾸시면 됩니다. 아래처럼요

EDITOR=nano ansible-vault edit vars/main.yml

EDITOR 는 사용자의 profile/bash 설정에서 지정할 수 있습니다.
보통 어떤 리눅스를 이용하느냐에 따라 "~/.profile, ~/.bashrc, ~/.zshrc" 또는 비슷한 파일이 사용되죠.

Ansible Vault 자체는 꽤 직관적입니다. 여기 몇가지 명령어를 보세요:

아래 정도는 해석 하실수 있으리라 믿고 넘어갑니다~ ㅎ

$ ansible-vault -h

Usage: ansible-vault [create|decrypt|edit|encrypt|rekey] \
[--help] [options] file_name

Options:
-h, --help show this help message and exit
For the most part, we'll use ansible-vault create|edit /path/to/file.yml. Here, however, are all of the available commands:

create - Create a new file and encrypt it
decrypt - Create a plaintext file from an encrypted file
edit - Edit an already-existing encrypted file
encrypt - Encrypt an existing plain-text file
rekey - Set a new password on a encrypted file
If you have an existing configuration file to encrypt, use ansible-vault encrypt /path/to/file.yml.



Vault Example: Users

위에서 설명한 Vault 를 이용한 예제를 한번 봅시다.
우리에게 또다른 Role 인 "users" 가 있다고 해봅시다:

cd ~/ansible-example/roles
ansible-galaxy init users


저는 Vault 를 새로운 사용자를 만들거나 그 암호를 입력 할 때 사용합니다. User Role 에서 당신은 사용자 암호와 공용키 등을 사용자의 authorized_keys 파일에 추가하기 위해 Variable file 에 넣어둘 수 있습니다.(SSH 접속을 가능하기 하기위해)

"""
도움말: 공용 SSH key 는 원칙적으로는 공개되어도 상관이 없는 값입니다. - 그 값을 열람하는 사람들이 할수 있는 짓이라고 해봐야, 그들의 서버에 내가 접속할 수 있도록 해주는 정도밖에 없지요. 개별키 없이 공용키 하나로는 시스템 접근을 의도적으로 하지못하게 되어있습니다. 그리고 개별키는 이번 Role 에 포함시키지 않을겁니다.
"""

여기에 variable file 예제가 있습니다. Vault 를 이용해서 생성도 가능하고, 암호화도 가능합니다. 물론 수정은 우리가 알아볼 수 있는 평문으로 할수 있어요!

~/ansible-example/roles/users/variables/main.yml:

admin_password: $6$lpQ1DqjZQ25gq9YW$mHZAmGhFpPVVv0JCYUFaDovu8u5EqvQi.Ih
deploy_password: $6$edOqVumZrYW9$d5zj1Ok/G80DrnckixhkQDpXl0fACDfNx2EHnC
common_public_key: ssh-rsa ALongSSHPublicKeyHere


사용자 암호들도 이미 해쉬값이라는 점에 주목하세요. 이 암호를 user 모듈에서 요구하는데, 이 암호를 만드는 법을 아래 Ansible Documentation 링크에서 확인해볼 수 있습니다.
일단 우분투 에서 하는법을 빠르게 살펴볼까요?

# The whois package makes the mkpasswd
# command available on Ubuntu
$ sudo apt-get install -y whois

# Create a password hash
$ mkpasswd --method=SHA-512
Password:


이렇게 하면 user 모듈에서 사용할 수 있는 해쉬값 암호를 얻을 수 있을겁니다.

"""
도움말:
이 variable 파일 내 암호들은 해쉬값이지만, 이 값들을 담고있는 yml 파일을 저는 암호화 하고 싶습니다.
왜냐면 종종 이 파일들은 해쉬되지 않은 API 토큰이나 SSH 개인키 등도 가지고 있을 수 있거든요...
이런경우에는 암호화가 몹시 중요해지죠.
"""

일단 사용자 암호화 공용키를 Variables file 에 넣고나면 우리는 파일을 암호화 하고이 암호화된 변수들을 Task 에서 활용할수 있게됩니다.

ansible-vault encrypt roles/users/variables/main.yml
> INPUT PASSWORD


이제 우리는 암호화된 variable 들을 이용하여 새로운 사용자를 만드는데 사용할 task 파일을 수정하는데 사용할 수 있습니다.

여기 task 파일이 있습니다. 한번 보시죠.

~/ansible-example/roles/users/tasks/main.yml:

- name: Create Admin User
  user:
    name: admin
    password: '{{ admin_password }}'
    groups: sudo
    append: yes
    shell: /bin/bash

- name: Add Admin Authorized Key
  authorized_key:
    user: admin
    key: '{{ common_public_key }}'
    state: present

- name: Create Deploy User
  user:
    name: deploy
    password: '{{ deploy_password }}'
    groups: www-data
    append: yes
    shell: /bin/bash

- name: Add Deployer Authorized Key
  authorized_key:
    user: deploy
    key: '{{ common_public_key }}'
    state: present

이 Task 들은 user 모듈을 이용하여 새로운 사용자를 만들고 그 암호로 variable 파일에 있던 암호값들을 사용합니다.

그리고 또한 authorized_key 모듈을 사용하여 SSH 공개키를 각 서버에 authorized SSH key 로 등록합니다.

암호화된 변수들은 기존의 일반적인 변수처럼 task 파일에서 사용되었습니다. 하지만 이 Role 을 실행하기 위해서는 Ansible 이 묻는 Vault 암호를 정확히 입력해야만 할 것입니다. 왜냐면 암호화된 Variable 을 복호화 해야하니까요.

이제 Role 을 실행하기 위해 Playbook file 인 server.yml 을 수정해봅시다:

---
# Local connection here, yadda yadda yadda
- hosts: local
connection: local
sudo: yes
roles:
- nginx
- user


이 Playbook 을 실행할때는 우리가 암호화된 파일을 가진 Role 을 돌리는 것이기 떄문에 Ansible 이 Vault 암호를 묻도록 다음과 같이 해줘야 합니다.:

ansible-playbook --ask-vault-pass -i ./hosts server.yml


요약

지금까지 우리가 이제까지 살펴본 것들을 한번 적어보았습니다.


- Ansible 설치
- Ansible inventory 파일 설정
- Ansible ad-hoc 명령어 여러 서버에 동시 실행
- 여러개 Task 를 핸들러를 사용하여 실행하는법을 Playbook 을 만들어 실습
- 이제까지 만든 Task 를 Role 로 한층 더 추상화 하였음 (의존성 설정 포함)
   https://github.com/Servers-for-Hackers/ansible-nginx 참고
- Task 를 register (등록) 하는법을 보았고 이것을 활용하여 다른 task 에게 성공시 실행 등과 같은 의존성이 걸리는 방법을 알아봄
- 더 많은 템플릿, 파일 그리고 변수를 우리 Task 에 활용하는법을 알아봄
- Ansible Facts 를 어떻게 통합하는지 알아봄
-
Ansible Vault 로 보안이 필요한 변수를 안전하게 암호화하는 법을 알아봄

우리는 지금까지 꽤 많은 기초지식을 다뤄보았습니다.
하지만 Ansible 은 더 많은 기능이 있답니다 !!! 한번 찾아보셔요~

------------------------------------

이 다음부터는 별 관련 내용이 아니므로 해석을 생략하겠습니다~
지금까지 Ansible Tutorial 번역을 읽어봐 주셔서 감사합니다 !!


- 끝


[번역] Ansible 2 튜토리얼 #4 - Roles 개발 이것저것

https://serversforhackers.com/c/an-ansible2-tutorial
위 링크를 번역한 글입니다.
==================================================

역할(=Roles)

Role 은 여러개의 연관된 Task 를 체계화 하고, 그에 쓰이는 데이터를 묶는데 좋습니다. 예를 들어, Nginx 를 설치하려면 package repository 를 등록해야하고, package 를 깔고, 설정 변경이 필요합니다. 우리가 위에서 Playbook 으로 그 작업을 하는것을 보았겠지만, 우리가 거기서 더 설치 설정을 변경하기 시작하면 playbook 은 좀 할게 많아질 겁니다.

게다가 현실적인(우리가 실제로 해야하는) 설정은 종종 변수, 파일, 동적 템플릿 등과 같은 추가 데이터를 필요로 합니다. 이러한 도구는 플레이북에서도 사용할수 있지만, 우리는 관련 Task 와 데이터를 하나의 구조로 체계화할 수 있는 Role 을 사용하여 좀더 빠르게, 예쁘게 만들어 볼겁니다.

Role 은 아래와 같이 폴더구조로 되어있습니다.

roles
rolename
- files
- handlers
- meta
- templates
- tasks
- vars


각 폴더 안에서 Ansible 은 main.yml 파일을 자동으로 읽어들일겁니다.

이제 우리가 위에서 사용했던 nginx.yml 파일을 쪼개서, 각 폴더에 작성하여 더 깔끔하고 완성된 provisioning 도구로 만들어 보겠습니다.


Role 작성하기

우리는 새 Role 을 작성하는데 ansible-galaxy 명령어를 사용할 수 있습니다. 이 도구(ansible-galaxy)는 Role 을 공용 Repository 에 저장하는데 사용할수 있지만, 저는 주로 제 로컬 환경에서 bootstrap(초기화 작업) 용으로 사용합니다.

그럼 이를 어떻게 설정할 수 있을지 한번 봅시다.

# Head to our previously created directory
cd ~/ansible-example

# 파이썬 가상환경 activate (이미 활성화 되었다면 필요 없음)
source .venv/bin/activate

# Create a roles directory
mkdir roles
cd roles

# nginx 라는 새 Role 을 초기화 한다
ansible-galaxy init nginx


폴더명이 "roles" 인 것은 Ansible 의 규칙이다. Ansible 이 playbook 을 읽고 실행할때 참조할 대상이라는 의미이므로 항상 "roles" 라는 이름을 사용해야 한다.

"roles" 폴더 안에서 ansible-galaxy init nginx 명령어를 날리는 것은 새로운 role 을 작성할 하위 폴더들과 파일들을 자동으로 생성하게 된다.

이제 우리가 새로만든 Nginx role 의 부분부분을 하나씩 훑어보도록 하자.
참고해야할 path는 ~/ansible-example/roles/nginx 이다.

------------------------------------
Files

파일 디렉토리 안에 우리는 서버에 복사해야할 파일을 둘 수 있습니다. Nginx 의 경우, 저는 H5BP's Nginx component configurations 를 종종 복사해두지요. 그냥 git 에서 다운로드 받아서 제가 원하는대로 수정한 뒤, files 디렉토리 안에 두면 됩니다.

~/ansible-example
- roles
- - nginx
- - - files
- - - - h5bp

잠시후에 H5BP configuration files 이 서버에 copy 모듈에 의해 복사되는걸 보게 될겁니다.

------------------------------------
Handlers

핸들러 디렉토리 안에는 우리가 nginx.yml 플레이북 에서 작성했던 핸들러들을 모두 둘 수 있습니다.

handlers/main.yml:

- name: Start Nginx
service:
name: nginx
state: started

- name: Reload Nginx
service:
name: nginx
state: reloaded


이렇게 세팅을 해두면 우린 다른 yaml 설정 시, 자유롭게 참조할수 있게 됩니다.

------------------------------------

Meta

Meta 디렉토리 안에 있는 main.yml file 은 Role 의 메타 정보를 담고 있습니다. 의존관계 정보를 포함해서 말이죠

Role 이 다른 Role 에 의존적이라면, 그것을 이곳에서 지정할 수 있습니다. 예를들어, 제 Nginx Role 은 SSL Role 에 의존적입니다. SSL Role 은 SSL certificates(인증서) 를 설치하기위한 Role 이고요.

아래처럼 설정할수 있습니다.
---
dependencies:
- { role: ssl }


만약 제가 nginx Role 을 실행하게되면, 그것은 SSL Role 을 먼저 실행시킬겁니다.

그게 아니라면 우리는 이 파일을 생략하고, Role 을 의존성이 없도록 정의하면 됩니다. 아래처럼 말이죠:

---
dependencies: []

------------------------------------

Template


Template files 은 Python's Jinja2 템플릿 엔진에 기반한 템플릿 변수들을 담을 수 있습니다. 모든 파일은 그래서 .j2 의 확장자를 가져야 합니다. 파일명은 아무렇게나 지정할수 있지만요 ㅎㅎ 위의 Files 디렉토리에서 처럼 main.yml file 을 템플릿 폴더에는 두지 않을겁니다.

자, 그럼 여기에 Nginx server ("virtual host") 설정 예제가 있습니다. 여기에서 나중에 vars/main.yml 파일안에 지정할 몇개의 변수들을 가져다 사용할 것이라는 점을 기억하세요.

이 예제 파일은 아래 path 에 저장될 겁니다.

templates/serversforhackers.com.conf.j2:


server {
# Enforce the use of HTTPS
listen 80 default_server;
server_name {{ domain }};
return 301 https://$server_name$request_uri;
}

server {
listen 443 ssl default_server;

root /var/www/{{ domain }}/public;
index index.html index.htm index.php;

access_log /var/log/nginx/{{ domain }}.log;
error_log /var/log/nginx/{{ domain }}-error.log error;

server_name {{ domain }};

charset utf-8;

include h5bp/basic.conf;

ssl_certificate {{ ssl_crt }};
ssl_certificate_key {{ ssl_key }};
include h5bp/directive-only/ssl.conf;

location / {
try_files $uri $uri/ /index.php$is_args$args;
}

location = /favicon.ico { log_not_found off; access_log off; }
location = /robots.txt { log_not_found off; access_log off; }

location ~ \.php$ {
include snippets/fastcgi.conf;
fastcgi_pass unix:/var/run/php7.1-fpm.sock;
}
}



이 3개 변수는 이제 variables 섹션에서 정의할 겁니다.

------------------------------------
Variables

우리가 Task 로 모든 설정을 통합하기전에 Variable 을 한번 봅시다. "vars" 폴더는 main.yml 파일을 갖고 있습니다. 그냥 단순히 우리가 사용할 변수들 목록이예요. 이것은 우리가 손쉽게 설정값 영향 범위의 설정(= configuration-wide settings) 변경을 할 수 있도록 해줍니다.

여기에 vars/main.yml file 샘플이 있습니다.:

---
domain: serversforhackers.com
ssl_key: /etc/ssl/sfh/sfh.key
ssl_crt: /etc/ssl/sfh/sfh.crt


이 3개의 변수는 우리가 현재 작성중인 Role 안의 어느곳에서라도 사용될 수 있습니다. 일단 위에서 보여준 것처럼 template 에서 쓸 수 있고요, Task 에도 사용될 겁니다.

만일 variable 에 민감정보가 있다면, ansible-vault 로 해당 파일을 암호화 할수도 있습니다. 나중에 아래에서 추가 설명할거예요.

------------------------------------

Tasks


자, 그럼 이제 드디어 이제껏 세팅한 모든 것들을 모아 일련의 Task 들을 만들어 볼 차례 입니다.

Role 을 실행시키는 메인 파일이 바로 "tasks/main.yml" 입니다.
그럼 우리의 경우, 그게 어떻게 생겼을지 한번 봅시다:

- name: Add Nginx Repository
apt_repository:
repo: ppa:nginx/stable
state: present

- name: Install Nginx
apt:
pkg: nginx
state: installed
update_cache: true
notify:
- Start Nginx

- name: Add H5BP Config
copy:
src: h5bp
dest: /etc/nginx
owner: root
group: root

- name: Disable Default Site Configuration
file:
dest: /etc/nginx/sites-enabled/default
state: absent

# `dest` in quotes as a variable is used!
- name: Add SFH Site Config
register: sfhconfig
template:
src: serversforhackers.com.j2
dest: '/etc/nginx/sites-available/{{ domain }}.conf'
owner: root
group: root

# `src`/`dest` in quotes as a variable is used!
- name: Enable SFH Site Config
file:
src: '/etc/nginx/sites-available/{{ domain }}.conf'
dest: '/etc/nginx/sites-enabled/{{ domain }}.conf'
state: link

# `dest` in quotes as a variable is used!
- name: Create Web root
file:
dest: '/var/www/{{ domain }}/public'
mode: 775
state: directory
owner: www-data
group: www-data
notify:
- Reload Nginx

# `dest` in quotes as a variable is used!
- name: Web Root Permissions
file:
dest: '/var/www/{{ domain }}'
mode: 775
state: directory
owner: www-data
group: www-data
recurse: yes
notify:
- Reload Nginx


이번엔 Task 관련 내용이 좀 많아졌습니다. Nginx 를 설치하는데 복잡도가 좀 커졌죠.
태스크 들은 작성한 순서대로 아래와 같은 일들을 하게될 겁니다:

이정도는... 해석하실수 있으시죠? ㅎㅎㅎ

- Add the nginx/stable repository
- Install & start Nginx
- Add H5BP configuration files
- Disable the default Nginx configuration by removing the symlink to the default file from the sites-enabled directory
- Copy the serversforhackers.com.conf.j2 virtual host template into the Nginx configuration, rendering the template as it does
- Enable the Nginx server configuration by symlinking it to the sites-enabled directory
- Create the web root directory
- Change permission (recursively) for the project root directory, which is one level above the web root created previously


copy, template, & file 모듈들을 포함하여 몇가지 처음보는 모듈들이 있네요 (용법도요...ㅋ) 각 모듈에 인자값을 줌으로써, "state: absent" 로 파일이 없음을 전제한다던가(있으면 삭제함), "state: link" 로 symlink 를 생성한다던가 하는등에 흥미로운 동작들을 하네요.

여러분은 어떤 더 추가적인 유용한 기능들이 있을지 모듈의 documentation 을 살펴보시길 권합니다.

------------------------------------
Role 을 돌려봅시다

한개 혹은 그 이상의 Role 들을 서버에 돌리기 위해서 우린 다른 playbook 을 재활용 할겁니다. 그 playbook은 "roles" 디렉터리와 같은 폴더에 존재해야 합니다. 우리가 "cd" 로 접근하여 "ansible-playbook" 명령어를 날릴 path 이죠.

(여기에서 만일 이 튜토리얼을 지금껏 똑같이 따라해 오셧다면, Role 을 실행하기 전에 meta/main.yml 에서 ssl 의존성을먼저 제거하세요)

먼저 Roles 를 지정하고 어느 호스트에 실행시킬지를 결정하는 "master" yaml file 을 만듭니다 :

파일 path 는
~/ansible-example/server.yml 이고요,
"roles" 디렉토리와 같은 폴더에 위치합니다:

---
# run locally here, yadda yadda yadda
- hosts: local
connection: local
roles:
- nginx


자, 모든 변수를 하나의 playbook 에 때려박는 대신에, 심플하게 Role 만을 지정하였습니다. 이제 Role 이 자잘한 세부작업은 알아서 해줄거니까요

그럼 이제 우린 Role(들)을 실행시킬 수 있게 되었습니다.

ansible-playbook -i ./hosts server.yml

여기 이제 Nginx 라는 Role 을 실행시킬 Playbook 을 돌렸을때 출력값이 있네요
한번 보시죠 :

PLAY [all] ********************************************************************

GATHERING FACTS ***************************************************************
ok: [127.0.0.1]

TASK: [nginx | Add Nginx Repository] ******************************************
changed: [127.0.0.1]

TASK: [nginx | Install Nginx] *************************************************
changed: [127.0.0.1]

TASK: [nginx | Add H5BP Config] ***********************************************
changed: [127.0.0.1]

TASK: [nginx | Disable Default Site] ******************************************
changed: [127.0.0.1]

TASK: [nginx | Add SFH Site Config] *******************************************
changed: [127.0.0.1]

TASK: [nginx | Enable SFH Site Config] ****************************************
changed: [127.0.0.1]

TASK: [nginx | Create Web root] ***********************************************
changed: [127.0.0.1]

TASK: [nginx | Web Root Permissions] ******************************************
ok: [127.0.0.1]

NOTIFIED: [nginx | Start Nginx] ***********************************************
ok: [127.0.0.1]

NOTIFIED: [nginx | Reload Nginx] **********************************************
changed: [127.0.0.1]

PLAY RECAP ********************************************************************
127.0.0.1 : ok=8 changed=7 unreachable=0 failed=0


와우... !! 우리는 모든 다양한 컴포넌트들을 한데모아 논리적이고 명료한 Role 로 작성하였고, 이제 예쁘게 설치 + 설정 까지 완료된 Nginx 를 얻었네요!!!





[번역] Ansible 2 튜토리얼 #3 - Playbook 과 Handler 개발 이것저것

https://serversforhackers.com/c/an-ansible2-tutorial
위 링크를 번역한 글입니다.
==================================================

플레이북 (Playbooks)

Playbook 은 여러개의 task 를 실행할수 있고, 직접 명령어를 날릴때 놓칠 수 있는 몇가지 심화된 기능을 제공합니다. 우리 task 를 한번 playbook 으로 옮겨볼까요

Ansible의 Playbook 과 Role 은 Yaml 을 사용합니다.

nginx.yml 파일을 만들기
# hosts could have been "remote" or "all" as well
- hosts: local
connection: local
become: yes
become_user: root
tasks:
- name: Install Nginx
apt:
name: nginx
state: installed
update_cache: true

이 Task 는 정확히 우리가 아까 타이핑 했던 명령어와 동일한 작업을 합니다. local 연결을 하는것까지 포함해서 말이죠.

이것은 hosts 파일에 "[local]" 하위에 있는 서버들만 사용할겁니다

만약 local 연결을 사용하지 않을거면 아래와 같이 합니다.

---
- hosts: remote
become: yes
become_user: root
tasks:
- name: Install Nginx
apt:
name: nginx
state: installed
update_cache: true



이것은 hosts 파일의 [remote] 하위의 서버들을 이용합니다.
become 과 become_user 를 사용하는 것은 root 권한으로 Playbook 파일을 실행하도록 하기 위해서 입니다.

우리는 이제 조금 더 실행하기 단순해진 ansible-playbook 명령어를 Yaml 형식의 playbook 파일에 사용해야 합니다.

$ ansible-playbook -i ./hosts nginx.yml

PLAY [local] ******************************************************************

GATHERING FACTS ***************************************************************
ok: [127.0.0.1]

TASK: [Install Nginx] *********************************************************
ok: [127.0.0.1]

PLAY RECAP ********************************************************************
127.0.0.1 : ok=2 changed=0 unreachable=0 failed=0


우리는 이것이 실행되는 동안 Ansible이 실행시키는 Task 결과등을 포함한 유용한 피드백을 얻을 수 있습니다. 여기 모든 것들이 ok 라고 뜨는게 보이는데 아무것도 바뀐것은 없네요. 왜냐면 저는 Nginx 를 이미 한번 설치 했으니까요 ㅎㅎ


핸들러(Handlers)

Handler 는 Task 와 똑같습니다. (Task 가 하는 모든일을 할수 있죠), 다만, 그것은 다른 Task에 의해 call 되었을 때만 실행됩니다. 약간 Event System 같은거라고 생각하시면 됩니다. Handler 는 특정 이벤트가 일어났을때 실행됩니다.

이것은 그래서 한 Task 가 실행된 뒤, "두번째" 실행되어야 하는 작업이 있을때 유용합니다. 예를들어 어떤 새로운 서비스를 설치한뒤, Handler로 설정을 변경하고 서비스를 실행하는 작업등이 있습니다.

# Example shows using the local machine still
# Remove 'connection' and set hosts to 'remote' for a remote connection
- hosts: local
connection: local
become: yes
become_user: root
tasks:
- name: Install Nginx
apt:
name: nginx
state: installed
update_cache: true
notify:
- Start Nginx

handlers:
- name: Start Nginx
service:
name: nginx
state: started

여기에서는 설치 Task에 "notify" 속성값을 지정하였습니다. 이것은 "Start Nginx"라는 이름을 가진 Handler 에게 Task 가 끝나는대로 알림을 보내지요.

그러면 우리는 "Start Nginx" 라는 Handler 를 만듭니다. 그리고 이 Handler 는 알림이 왔을때 "Start Nginx" Task 가 되지요.

이 특별한 Handler 는 Service 모듈을 사용합니다. 이는 시스템 서비스들을 키고 끄고 재시작 하는 등의 액션을 할 수 있습니다. 이번에 우리는 Nginx 를 시작할겁니다.

Ansible 이 우리에게 어떤 변화를 주고싶어하는지에 대한 내용이 아니라, 우리가 원하는 결과적인 서비스의 상태를 정의하도록 했다는 점에 주목하세요. 우리는 그저 Ansible에게 우리가 원하는 결과만 알려주면, 알아서 필요한 변경사항을 반영해줍니다.


Playbook 을 다시한번 돌려볼까요?

$ ansible-playbook -i ./hosts nginx.yml

PLAY [local] ******************************************************************

GATHERING FACTS ***************************************************************
ok: [127.0.0.1]

TASK: [Install Nginx] *********************************************************
ok: [127.0.0.1]

NOTIFIED: [nginx | Start Nginx] ***********************************************
ok: [127.0.0.1]

PLAY RECAP ********************************************************************
127.0.0.1 : ok=2 changed=0 unreachable=0 failed=0


우리는 비슷한 출력을 얻게됩니다. 하지만 이번에는 Handler 가 실행되었죠

Notifier 는 Task 가 실행될 때에만 실행됩니다. 만약 Nginx 가 이미 설치되어있다면, Install Nginx Task 는 실행되지 않을 것이고 notifier도 실행되지 않겟죠.

우리는 Playbook 으로 여러개 Task를 돌릴 수 있습니다. 변수들을 만들고, 다른 설정들을 추가해서 말이죠. 심지어는 다른 playbook 까지 포함시킬수 있습니다.



여러개 Task 만들어보기 (More Tasks)

다음으로 우리는 Task 를 좀 더 추가할 수 있습니다.이 Playbook 에 몇가지 Task 를 추가하여 또다른 기능들을 한번 알아봅시다.

# Example shows using the local machine still
# Remove 'connection' and set hosts to 'remote' for a remote connection
- hosts: local
connection: local
become: yes
become_user: root
vars:
- docroot: /var/www/serversforhackers.com/public
tasks:
- name: Add Nginx Repository
apt_repository:
repo: ppa:nginx/stable
state: present
register: ppastable

- name: Install Nginx
apt:
pkg: nginx
state: installed
update_cache: true
when: ppastable|success
notify:
- Start Nginx

- name: Create Web Root
file:
path: '{{ docroot }}'
mode: 775
state: directory
owner: www-data
group: www-data
notify:
- Reload Nginx

handlers:
- name: Start Nginx
service:
name: nginx
state: started

- name: Reload Nginx
service:
name: nginx
state: reloaded



이제 Task 가 아래와 같이 3개가 되었네요

Add Nginx Repository - 최신 stable Nginx 버전을 얻기위해 Nginx stable PPA 를 apt_repository module 로 추가
Install Nginx - Apt module 로 Nginx 를 설치.
Create Web Root - web root 폴더 생성
여기서 register 와 when 이라는 새로운 용어가 나오네요. 이것은 Ansible 이 어떤 특정한 일이 생겼을때 Task 를 실행하라는 뜻입니다.


"Add Nginx Repository" Task 는 "ppastable" 라고 등록(register) 하였습니다. 그리고 우리는 그것을 "Install Nginx Task" 에게 등록된 "ppastable" Task 가 성공적으로 끝났을때에만 실행하도록 조건을 주었죠. 즉, 이런식으로 우리는 Ansible 이 특정 조건일때 Task 실행을 멈추도록 할 수 있습니다.

ppa repository 가 추가되었을때에만 Nginx 를 설치하는 형식의 이러한 예제는 사실 현재 우분투에서 더이상 필요하지 않습니다. repository 를 추가하는 것에 실패했을때, Ansible 실행을 중단하고 오류 메세지를 보여주는 것도 마찬가지고요. 다만, 그냥 이런 기능도 있구나~ 하시면 됩니다 ㅎㅎ

여러분은 모듈 액션의 결과또한 등록이 가능합니다. 그리고 그 등록한 변수를 이용하여 실행 조건을 분기시킬수 있지요. 예를들어, shell 모듈로 실행한 결과를 등록하여, 당신은 명령어 실행후의 stdout 에 접근할 수 있습니다.

우리는 또한 변수를 사용합니다. 문서의 root 레벨 변수는 var 섹션에 정의된값들 입니다. 그것은 정의된 폴더를 만드는 파일 모듈의 목적 인자값으로 쓰입니다.

path 설정은 2중 중괄호를 사용하는 점을 기억하세요 {{ var_name }} 처럼요. (이것은 Jinja2 템플릿 스타일 입니다.) Ansible 이 Jinja2 템플릿 변수를 파싱할 수 있도록 하기 위해 해당 라인은 반드시 외따옴표 혹은 쌍따옴표 로 둘러싸여 있어야 합니다. 예를들어 '{{ docroot }}' 식으로 말이죠. 따옴표를 사용하지 않으면 에러가 날겁니다.

이 playbook 은 일반적인 명령어로 실행할 수 있습니다.

ansible-playbook -i ./hosts nginx.yml

이렇게 우리는 몇가지 명령어와, Ansible 모듈 을 살펴 보았고, 서로 관련있는 여러개 Task 로 이루어진 playbook 까지 만들어보았습니다.

그럼 이제부터는 Playbook을 Role 로 구성하는 방법을 한번 알아보겠습니다. Role 은 파일과 템플릿 등의 관련된 아이템 들을 체계적으로 정리할 수 있도록 도와주고, 한편으로는 더 복잡한 Task 와 동작들을 다룰수 있게 해줍니다.
.
.
.
.





[ubuntu 18.04] Broadcom 와이파이 (wireless network) 드라이버 복구하기 개발 이것저것

난 아주 오래된 HP 노트북을 하나 가지고 있다.
모니터도 나가서 사실 그냥 .... 서버용으로 쓸라고 우분투를 깔았음.

그래서 우분투 최신버전 18.04 를 설치 했는데 와이파이가 안되더라!
일단 LAN선을 꽂고 잠시 삽질을 했다.

이런저런 정보들을 찾아보다가 결국 아래 방법으로 해결.

======================

1. 터미널을 연다

2. 아래 명령어를 입력하고 Wireless LAN 접속용 하드웨어가 있는지 목록을 본다.
lshw -C network

3. 드라이버 패키지 설치
sudo apt-get install firmware-b43-installer
4. 시스템 재시작

======================

<참고 링크>

1 2 3 4 5 6 7 8 9 10 다음


통계 위젯 (블랙)

5148
465
163608

GoogleAdsenseResponsive

Cluster map