ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

ansible-playbook 基本使用

2021-07-20 15:33:34  阅读:249  来源: 互联网

标签:基本 name Handlers 主机 192.168 ansible playbook


ansible自动化运维(五)——ansible palybook使用

文章目录

Playbook介绍

根本上说playbook和shell脚本没有任何的区别,playbook就像shell一样,也是把一堆的命令组合起来,然后加入对应条件判断等等,在shell脚本中是一条一条的命令,而在playbook中是一个一个的task任务构成,每个task任务可以看做shell中的一条命令;shell脚本一般只是在当前服务器上执行,而playbook则是在不止一个服务器上执行,因此playbook需要在其中指定运行该playbook的服务器名。

playbook的语法结构

playbook使用yml标记语言,这是一种标记语言,这种标记语言在文件的最开始需要使用三个“-”来说明文件开始,然后使用缩进来说明代码块的范围。下面通过一个简易的实例,来说明playbook的语法。

  • 1.大小写敏感
  • 2.使用缩进表示层级关系
  • 3.缩进时不允许使用Tab键,只允许使用空格。
  • 4.缩进的空格数目不重要,只要相同层级的元素左侧对齐即可

基本语法结构

---                             #标记文件的开始
- hosts: webservers             #指定该playbook在哪个服务器上执行
  vars:                         #表示下面是定义的变量,
    http_port: 80               #变量的形式,key: value,这里http_port是变量名,80是值
    max_clients: 200
  remote_user: root             #指定远程的用户名,这里缩进和vars保持了一致,说明变量的代码块已经结束。

tasks:              #下面构成playbook的tasks,每个task都有 - name: 开始,name指定该任务的名称。
- name: ensure apache is at the latest version  #指定该任务的名称。
    yum: pkg=httpd state=latest                   #yum说明要是用的模板名称,后面指定对应的参数,这两行结合起来就相当于一个shell命令。
- name: write the apache config file            #每个task之间可以使用空行来做区分。
    template: src=/srv/httpd.j2 dest=/etc/httpd.conf

#需要说明的是缩进的意义和python中缩进的意义是一样,是来区分代码块的。

实例

检查Mysql运行状态
[root@test2 playbook]# cat test.yml
---
 - hosts: all
   remote_user: root
   gather_facts: no             #不收集对应主机的信息,这样运行会快点。
   tasks:
     - name: check the mysql stauts
       service: name=mysqld state=running
通过ansible-playbook --syntax-check检测语法
[root@master playbook]# ansible-playbook --syntax-check test.yml 
[WARNING]: Unable to parse /etc/ansible/inventory as an inventory source
[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that
the implicit localhost does not match 'all'
[WARNING]: Could not match supplied host pattern, ignoring: test

playbook: test.yml ## 出现这个没报错即可使用

空运行:-C参数 会报告改操作对主机的更改内容,但不会实际操作主机。

运行结果如下:[root@master~ playbook]# ansible-playbook test.yml


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


TASK: [check the mysql stauts] ************************************************
ok: [192.168.58.30]




PLAY RECAP ********************************************************************
192.168.58.30        : ok=1    changed=0    unreachable=0    failed=0

限定主机范围执行

虽然playbook中定义了执行的主机,但是有时候我们可能仅想在定义的主机中的部分机器上执行,这时候怎么办?修改playbook中的hosts的范围,但是每次改变主机就修改一次,比较麻烦,我们可以使用–limit参数,指定该playbook在指定的主机上执行。有以下inventory文件,我们想在dbservers上执行上面测试用的playbook内容。

[all]
192.168.58.20
192.168.58.40

[mysql]
192.168.58.30

运行结果如下:

[root@test2 playbook]# ansible-playbook test.yml --limit mysql


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


TASK: [check the mysql stauts] ************************************************
ok: [192.168.58.30]


PLAY RECAP ********************************************************************
192.168.58.30               : ok=1    changed=0    unreachable=0    failed=0


[root@test2 playbook]#
查看当前playbook在哪些主机上执行
[root@test2 playbook]# ansible-playbook test.yml --list-hosts


playbook: test.yml


  play #1 (all): host count=3
192.168.58.20
192.168.58.30
192.168.58.40

  • ansible-playbook的一些其他技巧

  • –inventory=path,指定inventory文件,默认是在/etc/ansible/hosts下面。

  • –verbose,显示详细的输出,使用-vvvv显示精确到每分钟的输出。

  • –extra-vars=vars:定义在playbook使用的变量。

  • –forks:指定并发的线程数,默认是5.

  • –connection=type:指定远程连接主机的方式,默认是ssh,设置为local时,则只在本地执行playbook、

  • –check:检测模式,playbook中定义的所有任务将在每台主机上检测,但是并不执行。

ansibleplaybook中的handlers

在系统中,我们修改了服务器的配置文件,这时候就需要重启操作服务,就可以使用到handlers。

handlers:                               #下面定义了两个handlers
    - name: restart mysql
      service:  name=mysql state=restarted
    - name: restart httpd
      service: name=httpd state=restarted


- name: template configuration file
  template: src=template.j2 dest=/etc/httpd/conf/httpd.conf  #修改了配置文件然后依次启动mysql和httpd服务。
  notify:                               #使用notify来声明引用handlers。
     - restart mysql
     - restart htttpd

在使用handlers时需要注意以下几点:

  • Handlers只有在其所在的任务被执行时,才会被运行;如果一个任务中定义了notify调用Handlers,但是由于条件判断等原因,该任务未被执行,那么Handlers同样不会被执行。

  • Handlers只会在每一个play的末尾运行一次;如果想在一个playbook中间运行Handlers,则需要使用meta模块来实现。例如:-meta: flush_handlers.

  • 如果一个play在运行到调用Handlers的语句之前失败了,那么这个Handlers将不会被执行。我们可以使用meta模块的–force-handlers选项来强制执行Handlers,即使Handlers所在的play中途运行失败也能执行。

标签:基本,name,Handlers,主机,192.168,ansible,playbook
来源: https://blog.csdn.net/xumneg111/article/details/118932829

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有