jenkins에서 proxy 설정, update-center 작업을 수작업으로 일반적으로 작업한다. 

절차는 다음과 같다.


1. Use browser for metadata download 설정

Manage Jenkins -> Configure Global Security -> Plugin Manager -> Use browser for metadata download를  check on한다.


2. plugin 관리에서 Proxy 서버를 추가

http://jenkins장비:8080/pluginManager/advanced에서 proxy 설정 넣어야 한다.



이런 작업을 ansible로 자동화 할 수 있다. (1:1로 매핑하기 보다는 잘 동작하게)

- name: Configure Proxy
environment:
no_proxy: "localhost"
jenkins_script:
url: "http://localhost:8080"
script: "{{ lookup('template', 'proxy.groovy') }}"
validate_certs: False
timeout: 120

- name: Change Update-Center protocol
replace:
path: "{{ jenkins_home }}/hudson.model.UpdateCenter.xml"
regexp: 'https://updates.jenkins.io/update-center.json'
replace: 'http://updates.jenkins.io/update-center.json'



templates/proxy.groovy 파일

import jenkins.model.*

def instance = Jenkins.getInstance()

final String name = 'proxy.daumkakao.io'
final int port = 3128
final String noProxyHost = [
'localhost', '127.0.0.1', '127.0.0.0/8',
'...'
].join('\n')

final def proxyConfig = new hudson.ProxyConfiguration(
name, port, null, null, noProxyHost)

instance.proxy = proxyConfig
instance.save()


Posted by '김용환'
,



Jenkins UI에서 플러그인 설치하려 할 때 다음 에러가 난다.

java.net.SocketTimeoutException: connect timed out


jenkins plugin 앤서블에서는 에러가 발생한다.

"details": "HTTP Error 403: Forbidden", 

"msg": "Cannot get CSRF"


이 이유는 바로 proxy 설정 때문에 발생하는 것이다.



Proxy 설정을 잘 주어 젠킨스 플러그인을 설치한다.  jenkins_plugin은 localhost:8080을 호출하기 때문에 no_proxy를 주어야 한다.


 - name: Install jenkins plugins.

  jenkins_plugin:

    owner: "{{default_user}}"

    group: "{{default_group}}"

    jenkins_home: "{{ jenkins_home }}"

    name: "{{ item }}"

    state: latest

  environment:

    no_proxy: "localhost"

    http_proxy: "{{proxy_env.http_proxy}}"

    https_proxy: "{{proxy_env.http_proxy}}"

  with_lines: cat "../../templates/jenkins/plugins/plugins.lst"



Posted by '김용환'
,


git 프로젝트를 다운받을 때 github key를 사용해 다운로드 한다. 


앤서블을 사용하는 첫 번째 방법 - ~/.ssh/config 파일을 수정한다

Host github.com

  IdentityFile ~/.ssh/github_rsa


- name: Download config
git:
repo: git@github.com:uj/config.git
dest: "{{program_path}}/config"
force: yes
clone: yes



앤서블을 사용하는 두 번째 방법 - 직접 key 파일을 가르키게 한다.


- name: Download thin-backup source
git:
repo: git@github.com:uj/config.git
dest: "{{program_path}}/config"
force: yes
clone: yes
accept_hostkey: yes
key_file: /home/www/.ssh/github_rsa


Posted by '김용환'
,


DNS는 하나 이상의 레코드를 호스트 이름과 연결해 동작한다. 가장 일반적으로 사용되는 DNS 레코드 타입은 A 레코드와 CNAME 레코드다. A 레코드는 호스트 이름을 IP 주소에 연결하는 것이고, CNAME 레코드는 호스트 이름을 다른 호스트 이름으로 앨리어스로 지정한 것을 말한다.

DNS 프로토콜은 TXT 레코드라는 호스트 이름과 연결할 수 있는 다른 타입의 레코드를 지원한다. TXT 레코드는 호스트 이름에 연결할 수 있는 임의의 문자열이다. TXT 레코드를 호스트 이름과 연결하면 누구나 DNS 클라이언트를 사용해 텍스트를 검색할 수 있다.


예를 들어 github.com 도메인을 소유하고 있기에 해당 도메인의 모든 호스트 이름과 관련된 TXT 레코드를 생성할 수 있다. TXT 레코드를 이 책의 ISBN 번호가 포함된 github.com 호스트 이름과 연결했다. 

dig 커맨드라인 툴을 사용해 TXT 레코드를 조회할 수 있다.

$ dig +short github.com TXT

"MS=ms44452932"

"docusign=087098e3-3d46-47b7-9b4e-8a23028154cd"

"v=spf1 ip4:192.30.252.0/22 ip4:208.74.204.0/22 ip4:46.19.168.0/23 include:_spf.google.com include:esp.github.com include:_spf.createsend.com include:servers.mcsv.net ~all"

"MS=6BF03E6AF5CB689E315FB6199603BABF2C88D805"

"MS=ms58704441"



dnstxt 조회는 DNS 서버에 호스트와 관련된 TXT 레코드를 쿼리한다. 플레이북에서 이와 같은 태스크를 생성한다.


- name: look up TXT record

debug: msg="{{ lookup('dnstxt', 'github.com') }}"






Posted by '김용환'
,





ansible-playbook 커맨드를 실행하기 전에 플레이북을 확인할 수 있는 플래그가 있다.


1. 문법 체크


--syntax-check 플래그는 플레이북 문법이 유효한지 확인하지만 실행하지 않는다.


$ ansible-playbook --syntax-check playbook.yml





2. 호스트 나열하기


--list-hosts 플래그는 플레이북이 실행될 호스트를 출력하지만 플레이북을 실행하지 않는다.


$ ansible-playbook --list-hosts playbook.yml






3. 태스크 나열하기 


--list-tasks 플래그는 플레이북이 실행될 태스크를 출력하지만 플레이북을 실행하지 않는다.


$ ansible-playbook --list-tasks playbook.yml






4. 체크 모드


-C 플래그와 --check 플래그는 앤서블을 체크 모드를 실행한다(때때로 드라이 런(dry-run)이라 한다) 


즉 플레이북의 각 태스크가 호스트 수정 여부를 알려주지만 서버에 어떠한 변경이 발생하지 않는다.



$ ansible-playbook -C playbook.yml

$ ansible-playbook --check playbook.yml



체크 모드를 사용할  때의 어려움 중 하나는 플레이북의 처음 부분이 실행될 때만 플레이북의 뒷 부분이 성공할 수 있다는 점이다.





5. diff (파일 변경을 표시한다)

-D 플래그와 -diff 플래그는 원격 머신에서 변경된 모든 파일의 출력 비교 정보를 표시한다. 


정상적으로 실행되었다면 앤서블이 파일을 변경하는 방법을 표시하기 위해 -D 플래그와 -diff 플래그를 --check와 함께 사용하면 도움이 된다.


$ ansible-playbook -D --check playbook.yml

$ ansible-playbook --diff --check playbook.yml



앤서블이 파일(예시: copy, template, lineinfile과 같은 모듈을 사용)을 수정하면 다음처럼 .diff 포맷의 변경 사항을 표시한다.


-loglevel = "error"

+loglevel = "warning"





Posted by '김용환'
,



앤서블에서 실행할 태스크를 제어할 수 있다.


가끔 앤서블이 플레이북의 모든 태스크를 실행하는 것을 원치 않을 수 있다. 


특히 플레이북을 처음 작성하고 디버깅할 때 더욱 그렇다. 앤서블은 실행할 태스크를 제어할 수 있는 커맨드 라인 옵션을 제공한다.




1) step


--step 플래그는 다음처럼 각 태스크를 실행하기 전에 앤서블 프롬프트를 표시한다.


Perform task: install packages (y/n/c):


태스크를 실행하거나(y) 건너 뛰거나(n) 프롬프트를 표시하지 않고 나머지 플레이북을 계속 실행하도록 앤서블에 알릴 수 있다(c).


$ ansible-playbook --step playbook.yml






2) start-at-task



--start-at-task <태스크 이름> 플래그는 처음부터가 아닌 지정된 태스크에서 플레이북을 실행하기 시작하도록 앤서블에 알려준다. 


태스크 중 하나에 버그가 있어서 태스크 중 하나가 실패해서 실패한 태스크를 수정해 해당 태스크부터 시작해 플레이북을 다시 실행하고 싶을 때 유용할 수 있다.



$ ansible-playbook --start-at-task="install packages" playbook.yml




3) tags



앤서블에서는 하나 이상의 태그를 태스크 또는 플레이에 추가할 수 있다. 예를 들어 foo라는 태그가 붙은 플레이와 bar와 quux라는 태그가 붙은 플레이가 있다.



- hosts: myservers

  tags:

   - foo

  tasks:

   - name: install editors

     apt: name={{ item }}

     with_items:

       - vim

       - emacs

       - nano


   - name: run arbitrary command

     command: /opt/myprog

     tags:

       - bar

       - quux





-t <태그 이름> 플래그와 --tags <태그 이름> 플래그를 사용해 특정 태그를 포함한 플레이와 태스크만 실행하도록 앤서블에 알린다. --skip-tags <태그 이름> 플래그를 사용해 앤서블에 특정 태그를 포함한 플레이와 태스크를 건너 뛰라고 알린다.



태그를 실행하거나 건너뛰기

$ ansible-playbook -t foo,bar playbook.yml

$ ansible-playbook --tags=foo,bar playbook.yml

$ ansible-playbook --skip-tags=baz,quux playbook.yml


Posted by '김용환'
,




vagrant의  multi-VM environment 설정 예시이다.




# -*- mode: ruby -*-

# vi: set ft=ruby :


# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!

VAGRANTFILE_API_VERSION = "2"


Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|


  config.ssh.insert_key = false


  config.vm.define 'db' do |db|


    db.vm.box = "ubuntu/bionic64"

    db.vm.network "private_network", ip: "192.168.33.11"

    db.ssh.forward_agent = true


    db.vm.provider "virtualbox" do |vb|

      vb.customize ["modifyvm", :id, "--memory", "1024"]

    end

  end


  config.vm.define 'web' do |web|


    web.vm.box = "ubuntu/bionic64"

    web.vm.network "private_network", ip: "192.168.33.10"

    web.ssh.forward_agent = true


    web.vm.provider "virtualbox" do |vb|

      vb.customize ["modifyvm", :id, "--memory", "1024"]

    end


    web.vm.provision "ansible" do |ansible|

      ansible.limit = 'all'

      ansible.playbook = "mezzanine-across-hosts.yml"

    end


  end


end





vagrant ssh db 또는 vagrant ssh web 이렇게 접근할 수 있다. 

Posted by '김용환'
,







profile_tasks 플러그인을 사용하면


각 태스크의 실행 시간과 플레이북의 전체 실행 시간에 대한 요약을 생성한다.



- 태스크가 시작된 날짜와 시간


- 이전 태스크의 실행 시간(괄호 안에 표시)


- 플레이의 누적 실행 시간



Saturday 22 April 2019  20:05:51 -0700 (0:00:01.465)       0:01:02.732 ********

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

install nginx ---------------------------------------------------------- 57.82s

Gathering Facts --------------------------------------------------------- 1.90s

restart nginx ----------------------------------------------------------- 1.47s

copy nginx config file -------------------------------------------------- 0.69s

copy index.html --------------------------------------------------------- 0.44s

enable configuration ---------------------------------------------------- 0.35s



Posted by '김용환'
,


앤서블의 호스트 지정 패턴

플레이북의 host 매개 변수에 보통 단일 호스트 또는 그룹을 지정하는데..

hosts: web

단일 호스트 또는 그룹을 지정하는 대신 패턴을 지정할 수도 있다. 이미 all 패턴을 봤었다. all  패턴은 알려진 모든 호스트들에 대해 플레이를 실행할 것이다.

hosts: all

콜론을 사용해 두 그룹의 합집합을 지정할 수 있다. 다음처럼 모든 dev 머신 및 staging 머신을 지정할 수 있다.

hosts: dev:staging

\콜론과 앰퍼샌드(:&)를 사용하여 교집합을 지정할 수 있다. 예를 들어 staging 환경에서 모든 데이터베이스 서버를 지정하려면 다음처럼 지정할 수 있다.

hosts: staging:&database


표 9-1은 앤서블이 지원하는 패턴을 보여준다. 정규식 패턴은 항상 물결 기호(~)로 시작한다.



액션

사용 예시

모든 호스트

all

모든 호스트

*

합집합

dev:staging

교집합

staging:&database

배제

dev:!queue

와일드카드

*.example.com

번호로 지정한 서버의 범위

web[5:10]

정규식

~web\d+\.example\.(com|org)





앤서블은 여러 패턴 조합을 지원한다. 예를 들면 다음과 같다.

hosts: dev:staging:&database:!queue




또한 호스트의 임의 조합을 예시처럼 지정할 수 있다. $ ansible-playbook -l 'staging:&database' playbook.yml


Posted by '김용환'
,


ansible-vault 커맨드 간단 정리



커맨드

설명

ansible-vault encrypt file.yml

일반 텍스트 파일인 file.yml을 암호화한다

ansible-vault decrypt file.yml


암호화된 file.yml 파일을 해독한다

ansible-vault view file.yml

암호화된 file.yml 파일의 내용을 출력한다

ansible-vault create file.yml

암호화된 새로운 파일 file.yml을 생성한다

ansible-vault edit file.yml

암호화된 파일 file.yml 파일을 수정한다

ansible-vault rekey file.yml

암호화된 파일 file.yml의 암호를 변경한다




앤서블 2.4 버전부터는 커맨드 라인에서 --vault-id를 사용해 볼트 암호 사용을 권장하고 있다.


암호가 ~/password.txt 텍스트 파일에 저장되어 있고 --vault-id 플래그를 사용해 암호 파일의 위치를 ansible-playbook 에게 전달한다.

ansible-playbook --vault-id ~/password.txt secrets.yml


암호화 파일을 해독하려면 --vault-id @prompt 플래그를 사용한다.

ansible-playbook --vault-id @prompt secrets.yml



앤서블 2.4 버전 이전에는 앤서블 실행시 하나의 볼트 암호만 사용할 수 있었었지만 2.4 버전 이후부터 다중 볼트 암호를 사용하여 지원해 --vault-id를 여러 번 제공할 수 있다. 그러나 --vault-id 옵션은 Ansible 2.4 이전 버전을 지원하지 않는다.

여러 볼트 암호가 제공된 경우 기본적으로 앤서블은 커맨드 라인에서 제공된 순서대로 각 볼트 암호를 시도하여 볼트 내용을 해독할 것이다.

예를 들어 특정 파일에 읽은 'dev' 암호를 사용해 'prod' 암호를 입력하라는 메시지를 표시하려면 다음과 같이 사용할 수 있다.

 

ansible-playbook --vault-id dev@dev-password --vault-id prod@prompt secrets.yml



자세한 정보는 https://docs.ansible.com/ansible/latest/user_guide/vault.html에..



Posted by '김용환'
,