Introduction to the shell playbook

四、playbook

4.1 yaml文件介绍

- yaml就是一种文件格式,用于定义一组数据格式

案例:用yaml文件描述tom的信息

    name: tom
    age: 35
    gender: Male
    spouse:
        name: jerry
        age: 32
        gender: Femal
    children:
        - name: bajie
          gender: Male
          age: 15
        - name: bajie
          gender: Male
          age: 15  

- 字段:一级和二级字段

yaml文件的特点

- 易读
- 扩展性好
- 和程序交互性好

4.2 ansile使用yaml文件的元素

- 变量
- 主机清单
- 循环
- 判断

4.2.1 变量

自定义变量的变量名:

- 仅仅可以是数字、字母、下划线
- 而且只能以字母为开头

内置变量

- setup模块来获得

通过命令行的方式来使用变量

    [root@master ~]# ansible-playbook a.yml --extra-vars "name=tom"



4.3 如何编写playbook

为什么要用playbook

- 通过playbook可以实现一些复杂的操作,比如:安装epel,然后安装nginx的依赖包,然后编译安装nginx,启动nginx,这一系列的操作可以定义成一个yaml文件,通过调用这个yaml文件,可以自动批量的完成全部工作。

playbook中包含的内容

- play:一个play就是一组要执行的操作
- inventory:要对哪些主机进行操作
- tasks:具体要完成操作
- template:通过template可以动态生成服务的配置文件
- handler:检查一个事件,并触发另一个事件
- roles:通过roles可以实现文件的复用

案例:编译yaml文件实现批量自动安装apache,然后启动apache

首先创建yaml文件

    [root@master ~]# vim install_nginx.yml

    - hosts: myservers
      tasks:
      - name: install epel repo
        yum: name=epel-release state=latest
      - name: install nginx
        yum: name=nginx state=latest
      - name: start nginx 
        service: name=nginx state=started

然后执行yaml文件来创建服务

    [root@master ~]# ansible-playbook install_nginx.yml

4.3.1 hosts参数

- 就是用来指定被管理主机的ip或者组名

4.3.2 remote_user参数

- 让远程主机以特定的用户身份来运行

    - hosts: myservers
      remote_user: root
      tasks:
      - name: install epel repo
        yum: name=epel-release state=latest
      - name: install nginx
        yum: name=nginx state=latest
      - name: start nginx
        service: name=nginx state=started

4.3.3 tasks参数

用了指定需要完成具体的操作

通常由两部分构成一个操作

- name:指定一个输出的名称
- 模块 和 参数:指定要做的事情

      tasks:
      - name: install epel repo
        yum: name=epel-release state=latest
      - name: install nginx
        yum: name=nginx state=latest
      - name: start nginx 
        service: name=nginx state=started

task的执行流程

- 如果有多个task操作,那么首先在第一个被管理阶段上执行第一个任务;所有阶段的这个任务执行完成后,才会开始在所有节点执行第二个任务,以此类推;
- 一旦某个指定执行任务失败,那么所有的阶段都会停止继续执行,甚至会执行回滚操作

案例:在所有的节点上,创建用户组gp002,然后再创建用户user002,要求user002的组为gp002

    - name: create user
      hosts: all
      remote_user: root
      tasks:
      - name: create group
        group: name=gp002 state=present
      - name: create user
        user: name=user002 group=gp002

4.3.4 handler参数

作用

- 用来监控一个task操作是否执行了,一旦这个监控的task执行,那么立刻触发一个特定的操作

使用方法:

- 第一步:定义handler事件和要执行的操作
- 第二步:在需要监控的对象下面通过notify指定handler的名称

案例:安装nginx,将本地的nginx配置文件发生到远程节点,作为nginx服务的配置文件

1)在本地生成nginx的配置文件

    [root@master ~]# yum install nginx -y
    [root@master ~]# cp /etc/nginx/nginx.conf ./ -a
    [root@master ~]# vim /root/nginx.conf
    将nginx的端口改为8800

2)编写yaml文件,在远处主机安装nginx,并使用这个配置文件

    - hosts: myservers
      tasks:
      - name: install epel repo
        yum: name=epel-release state=latest
      - name: install nginx
        yum: name=nginx state=latest
      - name: send nginx config file
        copy: src=/root/nginx.conf dest=/etc/nginx/nginx.conf
        notify:
        - restart nginx service
      - name: start nginx 
        service: name=nginx state=started
      handlers:
      - name: restart nginx service
        service: name=nginx state=restarted

3)执行yaml文件,检查远程主机端口

    [root@master ~]# ansible-playbook install_nginx.yml

4.3.5 案例:部署tomcat服务

梳理思路:操作有4个

1. 安装jdk:java-1.8.0-openjdk
2. 下载tomcat:http://mirror.hust.edu.cn/apache/tomcat/tomcat-8/v8.5.51/bin/apache-tomcat-8.5.51.tar.gz
3. 解压tomcat
4. 启动tomcat

    - name: install tomcat
      hosts: all
      tasks:
      - name: 安装openjdk
        yum: name=java-1.8.0-openjdk state=present
      - name: 下载tomcat
        get_url: url=http://mirror.hust.edu.cn/apache/tomcat/tomcat-8/v8.5.51/bin/apache-tomcat-8.5.51.tar.gz dest=/tmp
      - name: 解压tomcat
        unarchive: src=/tmp/apache-tomcat-8.5.51.tar.gz dest=/usr/local/ copy=no
      - name: 启动tomcat
        shell: cd /usr/local/apache-tomcat-8.5.51/bin/ && nohup ./startup.sh &

从yum中找openjdk的安装包

    [root@master ~]# yum list all | grep "openjdk"

使用变量的方式定义

    - name: install tomcat
      hosts: all
      vars:
        version: 8.5.51
        dir: /usr/local/
      tasks:
      - name: 安装openjdk
        yum: name=java-1.8.0-openjdk state=present
      - name: 下载tomcat
        get_url: url=http://mirror.hust.edu.cn/apache/tomcat/tomcat-8/v{
    
    {
    
     version }}/bin/apache-tomcat-{
    
    {
    
     version }}.tar.gz dest=/tmp
      - name: 解压tomcat
        unarchive: src=/tmp/apache-tomcat-{
    
    {
    
     version }}.tar.gz dest={
    
    {
    
     dir }} copy=no
      - name: 启动tomcat
        shell: cd {
    
    {
    
     dir }}apache-tomcat-{
    
    {
    
     version }}/bin/ && nohup ./startup.sh &
4.3.7 vars参数

vars是用来在playbook中使用变量的。

playbook使用变量有4种方式:

- 直接在yaml文件中定义和使用变量
- 使用ansible的内置变量
- 在主机清单中定义变量
- 主机组变量

第一种变量:yaml中自定义变量

- 定义变量方法:vars
- 使用变量方法:{
    
    {
    
     xx }}

    嗯嗯- hosts: all
      remote_user: root
      vars:
      - package: mariadb-server
      - serviceName: mariadb
      - configFile: /tmp/my.cnf
      tasks:
      - name: install maraidb
        yum: name={
    
    {
    
     package }} state=latest
      - name: create my.cnf
        copy: src={
    
    {
    
     configFile }} dest=/etc/my.cnf
        notify:
        - restart sql
      - name: start sql
        service: name={
    
    {
    
     serviceName }} state=started
      handlers:
      - restart sql
        service: name={
    
    {
    
     serviceName }} state=restarted

第二种变量:使用ansible中的内置变量

1)获取内置变量:setup模块

案例:获取主机的完全限定名称变量

    [root@master ~]# ansible tomcatservers -m setup | grep "ansible_fqdn"
            "ansible_fqdn": "node2", 
            "ansible_fqdn": "node1", 

2)使用内置变量

案例:在每个主机上创建一个用户,用户名是当前主机的主机名(主机名就是fqdn)

    - name: create user
      hosts: tomcatservers
      tasks:
      - name: create new user
        user: name={
    
    {
    
     ansible_fqdn }} state=present

第三种变量:清单文件主机变量

- 在主机清单中,为每个和自己设置一个变量

案例:通过主机清单设置id值

1)在主机清单中定义变量

    [tomcatservers]
    192.168.31.65 id=5 state=no
    192.168.31.66 id=3 state=yes

2)在yaml文件中使用变量

    - hosts: tomcatservers
      tasks
      - name: user vars
        shell: echo "{
    
    {
    
     id }}">/tmp/{
    
    {
    
     state }}.log

- 此时在每个被管理节点的tmp下,都会生成一个t.log,但是其中的值不同,一个是5一个是3

第四种变量:主机组变量

- 和主机变量相同,也是定义在主机清单中

案例:为tomcatservs主机组添加四个变量

    [tomcatservers]
    192.168.31.65 id=5 state=no
    192.168.31.66 id=3
    
    [tomcatservers:vars]
    node=workNode
    addrs=beijing
    type=webServer
    pro=https
    

思考:什么时候用主机变量?什么时候用主机组变量?

4.3.8 循环

思考:怎么在所有主机都安装gcc gcc-c++ pcre-devel ncurses-devel zlib-devel

答案:

- shell模块:-m shell -a “yum isntall  xxxxxx”

ansible的循环依赖两部分

- 内置变量:item
- tasks的子选项:with_items

案例:循环创建5个用户

    - hosts: all
      tasks:
      - name: create user
        user: name=user{
    
    {
    
     item }} state=present
        with_items:
        - 1
        - 2
        - 3
        - 4
        - 5

4.3.9 判断

- ansible实现判断是用tasks的when字句实现的判断的
- 通常都是在when中对自定义和内置变量进行判断

案例:在node2上创建用test007

    - hosts: all
      tasks:
      - name: create user
        user: name=test007 state=present
        when: ansible_fqdn == "node1"
      - name: install zsh
        yum: name=zsh state=present

4.4 template

- template称之为模板
- 模板通常用来动态生成配置文件

案例:在所有节点安装nginx,两个节点的nginx分别监听在810和820的端口上,两个nginx的虚拟主机名分别为www.当前节点名称.com,两个节点的keepalived的超时时间分别是30和80.

1)创建存储模板的目录

    [root@master ~]# mkdir /root/template
    [root@master ~]# cp /etc/nginx/nginx.conf /root/template/nginx.conf.j2 -a

- nginx.conf.j2是用于作为模板的配置文件

2)编辑配置文件模板

    [root@master ~]# vim /root/template/nginx.conf.j2 

修改模板文件的4个位置

    keepalive_timeout   {
    
    {
    
     keepalive_timeout }};
    listen       {
    
    {
    
     listen_port }} default_server;
    listen       [::]:{
    
    {
    
     listen_port }} default_server;
    server_name  www.{
    
    {
    
     ansible_fqdn }}.com;

3)通过主机变量向模板传递参数

    [root@master ~]# vim /etc/ansible/hosts 

    [myservers]
    192.168.31.65 keepalive_timeout=30 listen_port=810
    192.168.31.66 keepalive_timeout=80 listen_port=820

4)编写yaml安装nginx,并基于模提供配置信息

    - hosts: all
      tasks:
      - name: 安装epel源
        yum: name=epel-release state=present
      - name: 安装nginx
        yum: name=nginx state=latest
      - name: 基于模板生成配置文件,并发送
        template: 
          src=/root/template/nginx.conf.j2 
          dest=/etc/nginx/nginx.conf
        notify:
        - restart nginx
      - name: 启动服务
        service: name=nginx state=started enabled=on
      handlers:
      - name: restart nginx
        service: name=nginx state=restarted

5)执行yaml文件,并检查结果

- 略

4.5 tag

    - hosts: all
      vars:
      - listen_port: 888
      tasks:
      - name: 安装epel源
        yum: name=epel-release state=present
      - name: 安装nginx
        yum: name=nginx state=latest
      - name: 基于模板生成配置文件,并发送
        tags:
        - sendFile
        template: 
          src=/root/template/nginx.conf.j2 
          dest=/etc/nginx/nginx.conf
        notify:
        - restart nginx
      - name: 启动服务
        service: name=nginx state=started enabled=on
      handlers:
      - name: restart nginx
        service: name=nginx state=restarted 

执行

    [root@master ~]# ansible-playbook i.yaml --tags='sendFile'

Guess you like

Origin blog.csdn.net/lq_hello/article/details/106077710