ansible(二)

一、ansible playbook应用概述

  • 概述
    playbook是ansible用于配置,部署和管理被控节点的剧本。他就是组织多个task的容器,他的实质就是一个文件,有着特定的组织格式,它采用的语法格式是YAML(Yet Another Markup Language);

  • 组成
    playbook是由一个或多个play组成的列表,play的主要功能是为ansible中的task定义好一个角色,指定剧本对应的服务器组,组成一个完整的流程控制集合。

  • 应用场景
    执行一些简单的任务,使用ad-hoc命令可以方便的解决问题,但是有时一个设施过于复杂,需要大量的操作的时候,执行ad-hoc命令是不合适的,这时最好使用playbook。
    就像执行shell命令写shell脚本一样,也可以理解为批处理任务,不过playbook有自己的语法格式。
    使用playbook可以方便的重用这些代码,可以移植到不同的机器上,像函数一样,最大化的利用代码。在使用ansible的过程中会发现,所处理的大部分操作都是编写playbook。可以把常见的应用都写成playbook,之后管理服务器便简单许多。

二、ansible playbook语法

  • YMAL格式是类似于JSON的文件格式,便于理解和阅读,同时便于书写。首先学习下YMAL的个格式。

    • 文件的第一行应该以"---"(三个连字符)开始,表名YMAL文件的开始
    • 在同一行中,#之后的内容表示注释,类似于shell,python和ruby
    • YMAL中的列表元素以"-"开头然后紧跟着一个空格,后面为元素内容
    • 同一个列表中的元素应该保持相同的缩进,否则会被当成错误处理
    • play中hosts,variables,roles,tasks等对象的表示方法都是键值中间以":"分隔表示,":"后面还要增加一个空格
    ---
    #安装与运行MySQL服务
    - hosts: slave1
      remote_user: root
      task:
    
        - name: install mysql-server package
          yum: name=mysql-server state=present
        - name: startint mysqld service
          service: name=mysql state=started

    我们的文件名称应该是以.yml结尾,像我们上面的例子就是mysql.yml。其中,由三部分组成

    host部分:使用hosts指示使用哪个主机或主机组来运行下面的tasks,每个playbook都必须指定hosts,hosts也可以使用通配符格式。主机或主机组在inventory清单中指定,可以使用系统默认的/etc/ansible/hosts,也可以自己编辑,在运行的时候加上-i选项,指定清单的位置即可。在运行清单文件的时候--list-hosts选项会显示哪些主机将参与执行task的过程。

    remote_user:指定远端主机中的哪个用户来登录远端系统,在远端系统执行task的用户,可以任意指定,也可以使用sudo,但是用户必须要有执行相应task的权限

    tasks:指定远端主机将要执行的一系列动作。tasks的核心为ansible的模块,tasks包含name和要执行的模块,name是可选的,只是为了便于用户阅读,不过还是建议加上,模块是必须的,同时也要给予模块相应的参数。
    使用ansible-play运行playbook文件,得到如输出以下信息,输出内容为json格式。并且由不同颜色组成,便于识别,一般而言

    • 绿色代表执行成功,系统保持原样
    • 黄色代表系统状态发生改变
    • 红色代表执行失败,显示错误输出

    执行有三个步骤:1、收集facts 2、执行tasks 3、报告结果

  • 基础组件

    • hosts:运行执行任务(task)的目标主机
    • tasks:任务列表,整个playbook的核心内容
    • variables:变量,变量替换{{variable_name}}
    • remote_user:在远程主机上执行任务的用户
    • name:任务名称,每个任务都需要有一个name名称
    • notify:表名notify所在的task任务发生改变时,他会出发一个事件,此事件会在下方的handlers中进行定义
    • templates:使用模版语言的文本文件
    • 缩进:使用空格进行缩进
  • ansible-playbook命令语法:

ansible-playbook <filename.yml>...[options]
[options]:
-C, --check:并不在远程主机上执行,只是测试
-i PATH, --inventory=PATH:资产的文件路径
--flush-cache:清楚fact缓存
--list-hosts:列出匹配的远程主机,并不执行任何动作
-t,TAGS, --tags=TAGS:运行指定的标签任务
--skip-tags:跳过指定的notify
  • 远程主机通过playbook安装nginx
[root@ansible ~]# vi nginx_install.yaml
---
- hosts: 192.168.100.102
  remote_user: root
  tasks:
   - name: nginxa
     yum: name=pcre-devel,pcre,zlib-devel state=present
   - name: nginxb
     shell: cd /root; wget ftp://192.168.100.100/tools/nginx-1.12.2.tar.gz;tar zxvf /root/nginx-1.12.2.tar.gz -C /usr/src;cd /usr/src/nginx-1.12.2/;./configure --prefix=/usr/local/nginx;make;make install




  • 利用playbook编写文件为远端主机安装http并配置其网页
---
- hosts: 192.168.100.103
  remote_user: root
  vars:
  - pack: httpd
  - serv: httpd
  tasks:
  - name: install httpd
    yum: name={{ pack }} state=present
  - name: copy html
    copy: src=/tmp/index.html dest=/var/www/html/
    notify:
      - restart httpd
  - name: start httpd services
    shell: systemctl start httpd;systemctl enable httpd
  handlers:
  - name: restart httpd
    service: name=httpd state=restarted

[root@ansible ansible]# echo "haohaoxuexi">/tmp/index.html
[root@ansible ansible]# ansible-playbook httpd.yml


[root@ansible ansible]# echo "tiantianxiangshang">/tmp/index.html
[root@ansible ansible]# ansible-playbook httpd.yml


  • ansible循环基于列表items多值进行循环创建用户
---
[root@ansible ansible]# vim loop.yml
- hosts: 192.168.100.103
  remote_user: root
  tasks:
  - name: create users
    user: name={{ item }} state=present
    with_items:
    - test11
    - test21
    - test31


  • ansible匹配节点的ip地址,批量修改主机名
[root@ansible ansible]# vim hostname.yml
---
- hosts: web
  remote_user: root
  tasks:
  - name: show hostname
    shell: hostname
  - name: show ip
    command: ip a
  - hostname: name=web{{ ansible_default_ipv4.address.split('.')[-1] }}


李泽信 发布于 2022-9-6 15:39

个人资料

搜索

日历

时间进度

    今日剩余 59.6%
    本周剩余 37.1%
    本月剩余 22.0%
    本年剩余 52.2%

访问统计