layout: post
title: Ansible-playbook的基础应用
date: 2018-01-13
tags: [“Ansible”,”自动化运维工具”]


一、playbook简介

Playbooks 是 Ansible的配置,部署,编排语言.他们可以被描述为一个需要希望远程主机执行命令的方案,或者一组IT程序运行的命令集合.其实就是AD-HOC的集合。

Playbooks 可用于声明配置,更强大的地方在于,在 playbooks 中可以编排有序的执行过程,甚至于做到在多组机器间,来回有序的执行特别指定的步骤.并且可以同步或异步的发起任务.

我们使用 adhoc 时,主要是使用 /usr/bin/ansible 程序执行任务.而使用 playbooks 时,更多是将之放入源码控制之中,用之推送你的配置或是用于确认你的远程系统的配置是否符合配置规范.

Playbooks 的格式是YAML(详见:YAML 语法),语法做到最小化,意在避免 playbooks 成为一种编程语言或是脚本,但它也并不是一个配置模型或过程的模型.

‘plays’ 好似音符,playbook 好似由 ‘plays’ 构成的曲谱,通过 playbook,可以编排步骤进行多机器的部署,比如在 webservers 组的所有机器上运行一定的步骤, 然后在 database server 组运行一些步骤,最后回到 webservers 组,再运行一些步骤,诸如此类.

“plays” 算是一个体育方面的类比,你可以通过多个 plays 告诉你的系统做不同的事情,不仅是定义一种特定的状态或模型.你可以在不同时间运行不同的 plays.

二、playbook的语法

0、为了演示,我们现在服务器上做一些配置

  1. 1、我们先修改几出配置文件
  2. vim /etc/ansible/ansible.cfg
  3. host_key_checking = False #取消这一项的注释
  4.  
  5. 2ansibleINVENTORY配置
  6. [root@ansible /]# vim /etc/ansible/hosts
  7. 添加如下配置
  8.  
  9. [webserver]
  10. 172.18.30.[1:2]
  11.  
  12. [loadbalance]
  13. 172.18.30.2
  14.  
  15. [mysql]
  16. 172.18.30.3
  17.  
  18. [middle]
  19. 172.18.30.4
  1、我们要实现配置文件的copy,从主控机器到被控机器
  1. 我们在/app目录下编写plays脚本
  2. [root@ansible /]# touch /app/cp_httpd_cfg.yml
  3. [root@ansible /]# vim /app/cp_httpd_cfg.yml
  4. --- #表示脚本的开始
  5. - hosts:webserver #表示要对哪些主机进行操作
  6. remote_user:root #表示使用远程哪个用户来执行
  7. tasks: #任务列表
  8. - name:cp_httpd_cfg_file #表示钥执行任务的名字
  9. copy:src=/app/httpd.conf dest=/etc/httpd/conf/ backup=yes #表示要调用的模块名,和模块的参数
  10.  
  11. 现在我们创建一个测试的httpd脚本
  12. [root@ansible app]# touch httpd.conf
  13. [root@ansible app]# echo "This is a test file" >> httpd.conf
  14.  
  15. 现在我们执行这段脚本
  16. [root@ansible app]# ansible-playbook ./cp_httpd_cfg.yml
  17.  
  18. PLAY [webserver] ****************************************************************************************************************************
  19.  
  20. TASK [Gathering Facts] **********************************************************************************************************************
  21. ok: [172.18.30.1]
  22. ok: [172.18.30.2]
  23.  
  24. TASK [cp_httpd_cfg_file] ********************************************************************************************************************
  25. changed: [172.18.30.1]
  26. changed: [172.18.30.2]
  27.  
  28. PLAY RECAP **********************************************************************************************************************************
  29. 172.18.30.1 : ok=2 changed=1 unreachable=0 failed=0
  30. 172.18.30.2 : ok=2 changed=1 unreachable=0 failed=0
  31.  
  32. 如果代码执行失败,操作会回滚
  33.  
  34. 现在我们查看一下被控机器是否文件传输正确
  35. @172.18.30.1
  36. [root@localhost conf]# cd /etc/httpd/conf
  37. [root@localhost conf]# ll
  38. 总用量 32
  39. -rw-r--r-- 1 root root 20 1 13 21:48 httpd.conf
  40. -rw-r--r-- 1 root root 11753 10 20 00:44 httpd.conf.9664.2018-01-13@21:48:46~
  41. -rw-r--r-- 1 root root 13077 10 20 04:39 magic
  42.  
  43. 源文件被备份了,因为我们使用backup选项,如果有不清楚的模块选项,可以通过ansible-doc -s 模块 来查看

2、handler的用法

handler是一个task列表,这些task与前述的task并没有本质上的不同,用于当关注的资源发生变化时,才会采取一定的操作

notify这个action可用于在每个play的最后被触发,这样可以避免多次有改变发生时每次都执行指定的操作,仅在所有的变化发生完成后一次性地执行指定操作。在notify中列出的操作称为handler,也即notify中调用handler中定义的操作。

  1. 源码安装tengine
  2. [root@ansible playbook]# vim source_install_tengine.yml
  3. ---
  4. - hosts: webserver
  5. remote_user: root
  6. tasks:
  7. - name: mk_dir
  8. shell: mkdir -p /app/ansible/sourcefile/
  9.  
  10. - name: add_user
  11. user: name=nginx shell=/sbin/nologin system=yes createhome=no
  12.  
  13. - name: copy_sourcefile_to_dest
  14. copy: src=/app/ansible/sourcefile/tengine-2.2.1.tar.gz dest=/app/ansible/sourcefile/tengine-2.2.1.tar.gz
  15.  
  16. - name: install_the_necessary_packeg
  17. yum : name=gcc,glibc,openssl,openssl-devel,zlib state=latest
  18.  
  19. - name: remove_old_tengine
  20. shell: rm -rf /app/ansible/sourcefile/tengine-2.2.1
  21.  
  22. - name: untar_source_file
  23. shell: tar -xf /app/ansible/sourcefile/tengine-2.2.1.tar.gz -C /app/ansible/sourcefile/
  24.  
  25. - name: Config_tengine_env
  26. shell: cd /app/ansible/sourcefile/tengine-2.2.1 ; ./configure --prefix=/usr/local/nginx
  27.  
  28. - name: make_files
  29. make: chdir=/app/ansible/sourcefile/tengine-2.2.1
  30.  
  31. - name: make_install_cpfile
  32. make: chdir=/app/ansible/sourcefile/tengine-2.2.1 target=install
  33.  
  34. - name: copy_cfg_file
  35. copy: src=/app/ansible/conf/nginx.conf dest=/usr/local/nginx/conf/
  36. notify: restart nginx #如果拷贝的文件改变了则执行这个任务
  37.  
  38. handlers: #在主题中使用notify来调用handlers
  39. - name: restart nginx
  40. shell: /usr/local/nginx/sbin/nginx '' ps aux ' grep -v grep ' grep nginx ' grep master ' awk '{print $2}'' xargs kill -HUP
  41.  
  42. [root@ansible playbook]# ansible-playbook ./source_install_tengine.yml #执行这段剧本

3、tags标签的用法

如果你有一个很大的playbook,而你只想run其中的某个task,这个时候tags是你的最佳选择。

1)、最常见的使用形式:

[root@ansible playbook]# vim http_test.yml" class="reference-link">
  1. [root@ansible playbook]# vim http_test.yml

  • hosts: websrvs
    remote_user: root
    tasks:
    • name: Install httpd
      yum: name=httpd state=present
    • name: Install configure file
      copy: src=/app/ansible/conf/httpd.conf dest=/etc/httpd/conf/
      tags: conf
    • name: start httpd service
      tags: service
      service: name=httpd state=started enabled=yes

我设置了两个tags,我们现在执行一下这个剧本,分别调用两个tags,看看效果

  1. [root@ansible playbook]# ansible-playbook -t conf -C http_test.yml
  2.  
  3. PLAY [webserver] ****************************************************************************
  4.  
  5. TASK [Gathering Facts] **********************************************************************
  6. ok: [172.18.30.1]
  7. ok: [172.18.30.2]
  8.  
  9. TASK [Install configure file] ***************************************************************
  10. changed: [172.18.30.1]
  11. changed: [172.18.30.2]
  12.  
  13. PLAY RECAP **********************************************************************************
  14. 172.18.30.1 : ok=2 changed=1 unreachable=0 failed=0
  15. 172.18.30.2 : ok=2 changed=1 unreachable=0 failed=0

我们可以看出,执行剧本,只对 Install configure file 这个task进行了操作,而其他连个动作并未执行操作。

现在我们调用service这个 tag

  1. [root@ansible playbook]# ansible-playbook -t service -C http_test.yml
  2.  
  3. PLAY [webserver] ****************************************************************************
  4.  
  5. TASK [Gathering Facts] **********************************************************************
  6. ok: [172.18.30.1]
  7. ok: [172.18.30.2]
  8.  
  9. TASK [start httpd service] ******************************************************************
  10. changed: [172.18.30.1]
  11. changed: [172.18.30.2]
  12.  
  13. PLAY RECAP **********************************************************************************
  14. 172.18.30.1 : ok=2 changed=1 unreachable=0 failed=0
  15. 172.18.30.2 : ok=2 changed=1 unreachable=0 failed=0

tags的位置要求并不大。

我再执行剧本用 -C选项表示测试,并不会真实的操作。

 

文档更新时间: 2018-12-20 16:02   作者:张尚