æè¿ãç§ã¯Ansibleãšå€ãã®ä»äºããããã®éçšã§åŠãã ããšãå ±æããããšã«ããŸããã 以äžã«ãAnsibleã«ã€ããŠç¥ã£ãŠããã¹ã15ã®é ç®ã®ãªã¹ãã瀺ããŸãã äœãèŠéããŸãããïŒ ã³ã¡ã³ããæ®ããŠãå人çãªãã³ããå ±æããŠãã ããã
1-ããŒã«ã®ãã©ã¡ãŒã¿ãŒãæž¡ãããšãã§ããŸã
ãã¬ã€ããã¯ãæŽçãã圹å²ãäœæããããšããå§ãããŸãã Jenkinsãã€ã³ã¹ããŒã«ããããŒã«ãäœæãããšããŸãã ãã®ããŒã«ã®ãã£ã¬ã¯ããªæ§é ã¯æ¬¡ã®ããã«ãªããŸãã
jenkins/ files/ templates/ tasks/ handlers/ defaults/
defaultsãã£ã¬ã¯ããªã¯ãããŒã«ã®ããã©ã«ãå€æ°ãä¿åããããã«äœ¿çšãããŸãã ãã®äžã«ã¯main.ymlãã¡ã€ã«ããããŸãïŒ
jenkins_port: 8080 jenkins_context_path: /jenkins jenkins_home: /jenkins
次ã®ããã«ãããŒã«ã«ããŸããŸãªãã©ã¡ãŒã¿ãŒãæž¡ãããšã§ãããã©ã«ãå€æ°ããªãŒããŒã©ã€ãã§ããŸãã
roles: - { role: jenkins, jenkins_port: 8181, jenkins_home: '/jenkins1' } - { role: jenkins, jenkins_port: 8080, jenkins_home: '/jenkins2' }
2-ã³ãã³ãã¢ãžã¥ãŒã«ãã¹ãçã«ããæ¹æ³
ã¹ãçæ§ã¯ãæåã®ã¢ããªã±ãŒã·ã§ã³ã®çµæãå€æŽããã«ç¹°ãè¿ãå®è¡ã§ããç¹å®ã®æäœã®ããããã£ã§ãã ãã®æŠå¿µã¯ãã»ãšãã©ã®Ansibleã¢ãžã¥ãŒã«ã«ååšããŸããç®çã®æçµç¶æ ãæå®ããAnsibleãã¿ã¹ã¯ãå®äºããå¿ èŠããããã©ããã決å®ããŸãã ããã©ã«ãã§ã¯ããã®ååã¯ã³ãã³ãã¢ãžã¥ãŒã«ã«ã¯é©çšãããŸããã ãã¬ã€ããã¯ã«ã¿ã¹ã¯ãããå Žåãåžžã«å®äºããŸãã
- command: /usr/bin/create-database.sh
ã¹ãçæ§ãå®çŸããã«ã¯ã createså±æ§ã䜿çšã§ããŸãã ååšããå ŽåãAnsibleã¯ããã¡ã€ã«ã§æå®ããããã³ãã¬ãŒããååšããªãå Žåã«ã®ã¿ã³ãã³ããå®è¡ããŸãã ãŸãã¯ãæå®ããããã¡ã€ã«ãååšããå Žåã«ã®ã¿ã¿ã¹ã¯ãå®è¡ããremovesã䜿çšã§ããŸãã
- command: /usr/bin/create-database.sh creates=/path/to/database
Ansibleã«ã¯å€ãã®ã¢ãžã¥ãŒã«ããããæãäžè¬çãªæäœã§ã¯ã³ãã³ãã¢ãžã¥ãŒã«ã䜿çšããå¿ èŠããªãããšã«åžžã«çæããŠãã ããã ããšãã°ã ãã¡ã€ã«ã·ã¹ãã ã®äœæ ã iptablesã«ãŒã«ã®å€æŽã cronãžã§ãã®ç®¡çã®ããã®ã¢ãžã¥ãŒã«ããããŸãã ããã©ã«ãã§ã¯ããããã®ã¢ãžã¥ãŒã«ã¯ãã¹ãŠiçã§ãããããåžžã«åªå ããå¿ èŠããããŸãã
3-Ansibleã»ããã¢ããã¢ãžã¥ãŒã«ã䜿çšããŠãã¹ãã«é¢ããæ å ±ãåéãã
ãããããAnsibleããã¬ã€ããã¯ãäœæãããšãã«æåã«è¡ãããšã¯æ¬¡ã®ãããªãã®ã§ããããšãããããŸããã
TASK [setup] ******************************************************************* ok: [servername]
ããã¯ãAnsibleãæåã®ã¿ã¹ã¯ãå®è¡ããåã«ç¹å¥ãªã»ããã¢ããã¢ãžã¥ãŒã«ãåŒã³åºãããã§ãã ã»ããã¢ããã¢ãžã¥ãŒã«ã¯ãã¹ãã«æ¥ç¶ããIPã¢ãã¬ã¹ããã£ã¹ã¯å®¹éãããã»ããµã¢ãŒããã¯ãã£ãå©çšå¯èœãªã¡ã¢ãªãªã©ãããããçš®é¡ã®äºå®ãåéããŸãã ãã¹ãã«é¢ããæ å ±ããã°ããåéããæ¹æ³ãšããŠããã®ã¢ãžã¥ãŒã«ãæåã§åŒã³åºããšäŸ¿å©ã§ãã ãããè¡ãã«ã¯ã次ã®ã³ãã³ããå®è¡ããã ãã§ãïŒ
$ ansible localhost -m setup localhost | SUCCESS => { "ansible_facts": { "ansible_all_ipv4_addresses": [ "10.27.12.77", "192.168.33.1" ], ( ) }
4-ãã¬ã€ããã¯ã®ãã¹ãŠã®ã¿ã¹ã¯ã衚瀺ã§ããŸã
ãã¬ã€ããã¯ãäœãããã®ãèŠããŠããããã§ããïŒ --list-tasksãã©ã°ã䜿çšããŠansible-playbookãå®è¡ãããšãAnsibleã¯äœ¿çšå¯èœãªãã¹ãŠã®ã¿ã¹ã¯ã衚瀺ããŸãã
$ ansible-playbook install-jenkins.yml --list-tasks PLAY: #1 tasks: TASK: meta TASK: open-jdk : Install open jdk 1.8 TASK: mount-partition : Creating the filesystem for the device {{ device }} (if needed) TASK: mount-partition : Mounting the device {{ device }} on path {{ path }} TASK: jenkins : Ensure Jenkins repo is installed. TASK: jenkins : Add Jenkins repo GPG key. TASK: jenkins : Ensure Jenkins is present. TASK: jenkins : Ensures that the home directory exists TASK: jenkins : include TASK: jenkins : Ensure Jenkins is started and runs on startup. TASK: jenkins : Wait for Jenkins to start up before proceeding. TASK: jenkins : Get the jenkins-cli jarfile from the Jenkins server.
5-æ©å¯æ å ±ãä¿åããå Žåã¯ãansible-vaultã䜿çšããŸã
ã¿ã¹ã¯ã®1ã€ã«æ©å¯æ å ±ïŒããŒã¿ããŒã¹ãžã®ã¢ã¯ã»ã¹ãªã©ïŒãå¿ èŠãªå Žåã¯ããã®æ å ±ããã¬ãŒã³ããã¹ãã§ã¯ãªããæå·åããã圢åŒã§ä¿åããããšããå§ãããŸãã
Ansibleã«ã¯ãæå·åããããã¡ã€ã«ãäœæããã³ç®¡çã§ããansible-vaultã³ãã³ãã©ã€ã³ãŠãŒãã£ãªãã£ãä»å±ããŠããŸãã ãããã£ãŠãæå·åããããã¡ã€ã«ãããŒãžã§ã³ç®¡çã·ã¹ãã ã«ãã³ããããã§ãã解èªãã¹ã¯ãŒããæã€ãŠãŒã¶ãŒã®ã¿ããããèªã¿åãããšãã§ããŸãã
# . . ansible-vault encrypt secrets.yml # . . ansible-vault create secrets.yml # . , . # ! . ansible-vault decrypt secrets.yml # # (- vim, $EDITOR) ansible-vault edit secrets.yml # ansible-vault edit secrets.yml
secrets.ymlãã¡ã€ã«ããã¬ã€ããã¯ã«ã€ã³ããŒããããšãæå·åããããã¡ã€ã«ã®èªã¿æ¹ãããããªããããAnsibleã¯ãã¹ããããããŸãã ã³ãã³ãã©ã€ã³åŒæ°--ask-vault-passãæå®ããå¿ èŠããããŸããããã¯ãæå·åããããã¡ã€ã«ã®ãã¹ã¯ãŒããæäŸããããAnsibleã«ä¿ããŸãã
ansible-playbook playbook.yml -i hosts --ask-vault-password
ãã1ã€ã®æ¹æ³ã¯ããã¹ã¯ãŒãããã¡ã€ã«ã«ä¿åãïŒãããã¯ãããªãã§ãã ããïŒã -vault-password-fileåŒæ°ã䜿çšããŠãã¡ã€ã«ãžã®ãã¹ãæå®ããããšã§ã ã ãã®ãã¡ã€ã«ãå®è¡å¯èœãªå ŽåãAnsibleã¯ãããå®è¡ããåºåããã¹ã¯ãŒããšããŠäœ¿çšããŸãã
ansible-vaultã®è©³çŽ°ã«ã€ããŠã¯ããã¡ããã芧ãã ããã
6-with_itemsã䜿çšããããšããå§ãããŸã
with_itemsã䜿çšãããš ãAnsibleã¯çŸåšã®å埩ã®å€ãå«ãå€æ°{{item}}ãäœæããŸãã äžéšã®ã¢ãžã¥ãŒã«ã¯ã³ã¬ã¯ã·ã§ã³ãéåžžã«ããŸãåŠçããåããã©ã¡ãŒã¿ãŒãç°ãªããã©ã¡ãŒã¿ãŒã§è€æ°åå®è¡ãããããã¯ããã«é«éã§ãã
# () - name: install required packages using the apt module apt: package={{ item }} update_cache=yes sudo: True with_items: - git - memcached - nginx # () - name: install git apt: package=git update_cache=yes sudo: True - name: install memcached apt: package=memcached update_cache=yes sudo: True - name: install nginx apt: package=nginx update_cache=yes sudo: True
7-ããŒã«ã«ã¢ã¯ã·ã§ã³ã®ä»çµã¿
ãªã¢ãŒããã¹ãã§å®è¡ãã代ããã«ãããŒã«ã«ãã¹ãã§ã¿ã¹ã¯ãå®è¡ããå¿ èŠãããå ŽåããããŸãã ããã¯ããµãŒããŒãèµ·åãããŸã§åŸ æ©ããå ŽåïŒéå§ããã°ããã®å ŽåïŒããŸãã¯ãã©ã³ãµãŒããŒã«ã«ããŒããè¿œå ããïŒãŸãã¯åé€ããïŒå Žåã«åœ¹ç«ã¡ãŸãã
tasks: - name: take out of load balancer pool local_action: > command /usr/bin/take_out_of_pool {{ inventory_hostname }} - name: update application yum: name=acme-web-stack state=latest - name: add back to load balancer pool local_action: > command /usr/bin/take_out_of_pool {{ inventory_hostname }}
以äžã®äŸã¯ãEC2ã€ã³ã¹ã¿ã³ã¹ãéå§ããå©çšå¯èœã«ãªããŸã§åŸ æ©ããæ¹æ³ã瀺ããŠããŸãã
- name: Launching EC2 Instance # instance options here register: ec2 - name: Waiting for ec2 instances to listen on port 22 wait_for: state=started host={{ item.public_dns_name }} port=22 with_items: ec2.instances
8-ã¿ã¹ã¯ãäžåºŠã ãå®äºããããã«Ansibleã«äŒããããšãã§ããŸã
è€æ°ã®ãã¹ããããå Žåã§ããã¿ã¹ã¯ã1åã ãå®äºããå¿ èŠãããå ŽåããããŸãã äŸãšããŠãåãããŒã¿ããŒã¹ã«æ¥ç¶ããã¢ããªã±ãŒã·ã§ã³ãåããè€æ°ã®ãµãŒããŒããããããŒã¿ããŒã¹ã移è¡ããã¿ã¹ã¯ããããšããŸãã ãã®å Žåããã®ã¿ã¹ã¯ãå®äºããå¿ èŠãããã®ã¯1åã ãã§ãã
ãããå®çŸããã«ã¯ãAnsibleã«ã³ãã³ãã1åã ãå®è¡ããããã«æ瀺ããrun_onceãã©ã¡ãŒã¿ãŒã䜿çšã§ããŸãã
- name: run the database migrations command: bundle exec rake db:migrate run_once: true
9-ãã³ãã©ãŒã¯ç¹å¥ãªã¿ã€ãã®ã¿ã¹ã¯ã§ã
ãã³ãã©ãŒã¯ãå¥ã®ã¿ã¹ã¯ããéç¥ãããå Žåã«ã®ã¿å®è¡ãããäžæã®ååãæã€ã¿ã¹ã¯ã§ãã ãµãŒãã¹ã®åèµ·åãã·ã¹ãã ã®åèµ·åã«éåžžã«äŸ¿å©ã§ãã
éç¥ããããã³ãã©ãŒã¯ãéç¥ãããåæ°ã«é¢ä¿ãªãããã¬ã€ããã¯ã®æåŸã«1åå®è¡ãããŸãã ãã³ãã©ãŒã䜿çšããŠãããã宣èšãã notifyã䜿çšããŠåŒã³åºãããšãã§ããŸãã
ãã¡ã€ã«ã®å 容ãå€æŽããããšãã«2ã€ã®ãµãŒãã¹ãåèµ·åããæ¹æ³ã®äŸã次ã«ç€ºããŸããããã¡ã€ã«ãå€æŽãããå Žåã®ã¿ã§ãïŒäŸã¯Ansible docsããåãããŠããŸãïŒã
- name: template configuration file template: src=template.j2 dest=/etc/foo.conf notify: - restart memcached - restart apache
ãã³ãã©ãŒã¯ããã¬ã€ããã¯ã®ã©ããã§å®£èšããå¿ èŠããããŸãã
handlers: - name: restart memcached # service, service: name=memcached state=restarted - name: restart apache service: name=apache state=restarted
10-ãã€ãã©ã€ã³ã®å é
Ansibleãããã«é«éã«å®è¡ããããã®ãã³ãïŒ
- ãã€ãã©ã€ã³ãæå¹ã«ãã
ãã€ãã©ã€ã³ãæå¹ã«ãããšãã¹ã¯ãªãããã³ããŒãã代ããã«ãã€ããä»ããŠSSHã»ãã·ã§ã³ã«æž¡ãããšã«ããããªã¢ãŒããµãŒããŒã§ã¢ãžã¥ãŒã«ãå®è¡ããããã«å¿ èŠãªSSHæäœã®æ°ãåæžãããŸãã ãã®çµæãããã«ããçç£æ§ãå€§å¹ ã«åäžããŸãã
ãã ãã泚æããå¿ èŠããããŸãã sudoersãã¡ã€ã«ïŒ/ etc / sudoersïŒå ã®ãã¹ãŠã®ãªã¢ãŒããã¹ãã§requirettyãªãã·ã§ã³ãç¡å¹ã«ãªã£ãŠããå Žåã®ã¿ããã€ãã³ã°ãæ©èœããŸãã
[ssh_connection] pipelining = True
- ãã¡ã¯ãã³ã¬ã¯ã·ã§ã³ãç¡å¹ã«ãããããã¡ã¯ããã£ãã·ã³ã°ãæå¹ã«ããŸã
ã¿ã¹ã¯ã§Ansible Factsã䜿çšããªãå Žåã¯ããã¡ã¯ãåéã¹ãããããªãã«ããŠé床ãäžããããšãã§ããŸãã ãããè¡ãã«ã¯ãåã«Gather_factsïŒFalseãªãã·ã§ã³ããã¬ã€ããã¯ã«è¿œå ããŸãã
- hosts: servername gather_facts: False tasks: - name: ... # ...
äžæ¹ãAnsibleãã¡ã¯ãïŒã»ããã¢ããã¢ãžã¥ãŒã«ã«ãã£ãŠèªåçã«åéãããïŒã䜿çšããå¿ èŠãããå Žåã¯ããããããã£ãã·ã¥ããŠãåŸç¶ã®å®è¡ãé«éåã§ããŸãã 詳现ãç¥ãããå Žåã¯ã ããã§Ansibleã®ããã¥ã¡ã³ãã§è©³çŽ°ã説æããŠããŸã ã
11-Ansibleã«ã¯ããã€ãã®éç¥ã¢ãžã¥ãŒã«ããããŸã
Ansibleã䜿çšããŠãã«ãŒã°ãªãŒã³å±éãèªååããŸããïŒ ãã¬ã€ããã¯ãå®è¡ããŠæ°ããAWSã€ã³ã¹ã¿ã³ã¹ãæäŸããŸããïŒ éç¥ã¢ãžã¥ãŒã«ã®ããããã䜿çšããŠãããã«ã€ããŠããŒã ã«ç¥ãããŠãã ããã äŸãšããŠã以äžã®ã¿ã¹ã¯ã¯Slackã«éç¥ãéä¿¡ããŸãã
- hosts: servername tasks: - name: Send notification message via Slack local_action: module: slack # To retrieve your slack token, open your team settings and look for the # Incoming Webhooks plugin token: <your>/<token>/<goes here> msg: "Hello team! I just finished updating our production environment." channel: "#general" username: "ansible-bot"
éç¥ã¢ãžã¥ãŒã«ã¯ãircãtwillioãhipchatãjabberãªã©ã§ãå©çšã§ããŸãã
12-EC2ã€ã³ã¹ã¿ã³ã¹ã¯ã¿ã°ã«ãã£ãŠèªåçã«ã°ã«ãŒãåãããŸã
Amazon Web Servicesããã³Ansible EC2åçã€ã³ãã³ããªã¹ã¯ãªããã䜿çšããå Žåããã¹ãŠã®ã€ã³ã¹ã¿ã³ã¹ã¯ãã¿ã€ããããŒãã¢ãã¿ã°ãªã©ã®ç¹æ§ã«åºã¥ããŠã°ã«ãŒãåãããŸãã EC2ã¿ã°ã¯ãã€ã³ã¹ã¿ã³ã¹ã«é¢é£ä»ããããkey = valueã§ããã奜ããªããã«äœ¿çšã§ããŸãã ã©ãã«ã䜿çšããŠéçš/ã¹ããŒãžã³ã°ãµãŒããŒãã°ã«ãŒãåãããã«ãŒã°ãªãŒã³å±éäžã«WebãµãŒããŒãŸãã¯ãã¢ã¯ãã£ããªããµãŒããŒã瀺ããŸãã
EC2 Dynamic Inventoryã¹ã¯ãªããã¯ãã¿ã°ã§ãã¹ããã°ã«ãŒãåãããšãã«ã次ã®ãã³ãã¬ãŒãïŒæ¬åŒ§ãªãïŒã䜿çšããŸãã
tag_[TAG_NAME]_[TAG_VALUE]
ãããã£ãŠã env = stagingã¿ã°ã䜿çšããŠãã¹ãŠã®ããŒãã§ã¿ã¹ã¯ãå®äºãããå Žåã¯ãããããã¬ã€ããã¯ã«è¿œå ããã ãã§ãã
hosts: tag_env_staging tasks: - name: This task will be run on all servers with env == staging # ...
ãããããã«é¢çœãããã«ã¯ã圱é¿ãåãããã¹ããæå®ããŠAnsible ãã³ãã¬ãŒãã䜿çšã§ããŸãã ããšãã°ãæ¬çªããŒã¿ããŒã¹ãµãŒããŒã§ç¹å®ã®ã¿ã¹ã¯ãå®è¡ããå ŽåïŒé©åã«ããŒã¯ãããŠããå ŽåïŒã次ã®ããã«ã¯ãã¹ãã¿ãŒã³ïŒïŒïŒïŒã䜿çšã§ããŸãã
hosts: tag_env_production&:tag_type_db tasks: - name: This task will be run on all servers with tags 'env=production' and 'type=db' # ...
13-ããã©ã€ã©ã³ãã¢ãŒãã§ã¿ã¹ã¯ãå®è¡ã§ããŸã
Ansibleã¯ããã¬ã€ããã¯ã®ãã©ã€ã©ã³ã¢ãŒãïŒãã§ãã¯ã¢ãŒããšãåŒã°ããŸãïŒã§ã®å®è¡ããµããŒãããŠããŸãã
ãã®ã¢ãŒãã§ã¯ãAnsible ã¯ãã¹ãã«å€æŽãå ããŸãããããã®ãã©ã°ãªãã§ãã¬ã€ããã¯ãèµ·åãããå Žåã«ã©ã®ãããªå€æŽãè¡ãããããåã«éç¥ããŸãã
äžéšã®ã·ããªãªã§ã¯äŸ¿å©ã§ãããã¿ã¹ã¯ã«æ¡ä»¶ã䜿çšãããŠããå Žåã¯é©åã«æ©èœããªãå ŽåããããŸãã
14-ã¿ã¹ã¯ã¯ã¹ãããããšã«å®äºã§ããŸã
å Žåã«ãã£ãŠã¯ããã¬ã€ããã¯ã®ãã¹ãŠã®ã¿ã¹ã¯ãå®äºããããªãããšããããŸãã
ããã¯ãæ°ãããã¬ã€ããã¯ãäœæããŠãã§ãã¯ã¢ãŠãããå Žåã®äžè¬çãªãœãªã¥ãŒã·ã§ã³ã§ãã
Ansibleã¯ã-- stepãã©ã°ã䜿çšããŠãå®è¡ããã¿ã¹ã¯ã決å®ããæ¹æ³ãæäŸããŸãã
ããã«ãããã¿ã¹ã¯ãå®äºããïŒyïŒãã¹ãããããïŒnïŒããŸãã¯ïŒcïŒç¢ºèªããã«ç¶è¡ããããéžæã§ããŸãã
15-ã¿ã°ã«åºã¥ããŠã¿ã¹ã¯ãå®è¡ã§ããŸã
ã¿ã¹ã¯ãŸãã¯ãã¬ã€ããã¯ã«1ã€ä»¥äžã®ã¿ã°ãè¿œå ã§ããŸãã
ãããè¡ãã«ã¯ã tagså±æ§ã䜿çšããŠãã¿ã°ä»ããããããšã«æ³šæããŠãã ããã
åŸã§ãã©ã°ã䜿çšããŠãå®è¡ããã¿ã°ãŸãã¯ã¹ãããããã¿ã°ã決å®ã§ããŸãã
--tags tagname ïŒãŸãã¯åã«-t ïŒããã³--skip-tags tagnames ïŒ
# 'dependencies' $ ansible-playbook --tags=dependencies playbook.yml # , , 'optional' $ ansible-playbook --skip-tags=optional playbook.yml
è€æ°ã®ã¿ã°ãã³ã³ãã§åºåã£ãŠæå®ã§ããŸãã
æšå¥šäºé
Ansibleã®ããã¥ã¡ã³ã
Ansible UpïŒRunning Bookãããªã³ã»ãããã·ã¥ã¿ã€ã³