运维SRE-17 自动化批量管理-ansible3

---
- hosts:all
  tasks:
    - name: 01 打开冰箱门
	  shell: echo 01 >> /tmp/bingxiang.log
	- name: 02 把大象放进冰箱里
	  shell: echo 02 >> /tmp/bingxiang.log
	- name: 03 关上冰箱门
      shell: echo 03 >> /tmp/bingxiang.log


[root@m01 /server/ans/playbook]# cat 05-nfs-server.yaml 
---
- hosts: db
  tasks:
    - name: 01 部署nfs服务端软件
      yum:
        name: nfs-utils
        state: installed
    - name: 02 修改配置文件
      lineinfile:
        path: /etc/exports
        line: "/data 172.16.1.0/24(rw)"
        state: present
        backup: yes
    - name: 03 创建对应的目录
      file:
        path: /data/
        owner: nfsnobody
        group: nfsnobody
        state: directory
    - name: 04 启动服务rpc-bind
      systemd:
        name: rpcbind
        enabled: yes
        state: started
    - name : 05 启动服务nfs
      systemd:
        name: nfs
        enabled: yes
        state: started
注意:如果从windows传文件记得要用doc2unix转换一下yaml文件格式!

10 Ansible-变量系列

10.1 变量分类

变量
命令行 临时使用,较少用
变量文件vars_files 某一个主机使用,较少使用
主机组共用的变量文件 group_vars 应用范围广泛.
ansible的内置变量(facts变量) 收集主机的基本信息,ip地址,主机名,系统及版本...
register变量 实现命令行$()或``功能

10.2 变量详解

1)vars,var_files,group_vars

  • 剧本中定义变量


    • hosts: all
      vars:
      dir_name: /hbinz_007
      file_name: hbinz007
      tasks:
      • name: 01.mkdir
        file:
        path: "{{dir_name}}"
        state: directory
      • name: 02.touch
        file:
        path: "{{dir_name}}/{{file_name}}"
        state: touch
  • 剧本比较大的时候,把变量放进一个文件中

    cat vars.yml
    dir_name: /hbinz_007
    file_name: hbinz007

    cat 08.vars_files_dir.yaml

    • hosts: all
      vars_files: ./vars.yaml
      tasks:
      • name: 01.mkdir
        file:
        path: "{{ dir_name }}"
        state: directory
      • name: 02.touch
        file:
        path: "{{ dir_name}}/{{ file_name }}"
        state: touch
  • 创建一个变量文件,给某个组共用

    用法:
    需要创建一个group_vars目录.
    目录下面创建以主机组命名的目录.
    存放变量文件vars.yml

    group_vars/ 目录
    lb/vars.yml #存放lb组的变量
    web/vars.yml #存放web组的变量
    data/vars.yml #存放xxx组的变量
    all/vars.yml #所有主机共用的变量

案例01-根据不同的主机组创建对应的目录

group_vars/  目录
	web/vars.yaml  #存放web组的变量
	data/vars.yml #存放xxx组的变量
   all/vars.yml  #所有主机共用的变量

1.在剧本文件的目录下创建group_vars目录,并且里面的目录如下:
tree group_vars/
group_vars/
├── all
│   └── vars.yml
├── data
│   └── vars.yaml
└── web
    └── vars.yaml

hosts文件下定义的: 
[hbinz]
172.16.1.7
172.16.1.31
172.16.1.41
172.16.1.51

[web]
172.16.1.7
[db]
172.16.1.51
[nfs]
172.16.1.31
[backup]
172.16.1.41

[data:children]
backup
db
nfs
-------------------------------------------------
web服务器创建 /app/code/目录
dir_name: /app/code/
data服务端创建 /data/目录
dir_name: /data/

cat 09.vars_group_dir.yml
---
- hosts: all
  tasks:
    - name: 根据主机创建不同的目录
      file:
        path: "{{ dir_name }}"
        state: directory
  • group_vars未来应用场景:使用all统一存放变量
    案例02-使用group_vars的all组定义变量

    cat vars.yml
    dir_name_code: /app/code/
    dir_name_data: /data/

    cat 09.vars_group_vars_dir.yml

    • hosts: all
      tasks:
      • name: 01 {{ dir_name_code }}
        file:
        path: "{{ dir_name_code }}"
        state: directory
      • name: 02 {{ dir_name_data }}
        file:
        path: "{{ dir_name_data }}"
        state: directory
  • 变量基础定义小结

使用方法 具体含义 应用场景
变量写在剧本开头: vars: 简单的较少的可以用这一种
变量写在独立文件中: vars_files:指定变量文件位置 了解即可
变量写在独立文件中,按照组进行分类: group_vars/目录all/vars.yml 掌握在all中创建所有主机/分组用的变量即可。
  1. ansible-facts变量
facts变量说明 : ansible内置变量,执行剧本,有个默认的任务(task),收集每个主机的基本信息.
# 查看 ansible facts变量内容

常用fact变量
ansible_hostname               #主机名
ansible_memtotal_mb            #内存大小(总计) 单位mb 
ansible_processor_vcpus        #cpu数量
ansible_default_ipv4.address   #默认的网卡ip eth0
ansible_distribution           #系统发行版本名字

CentOS Ubuntu Debian ...
ansible_processor_cores        #核心总数
ansible_date_time.date         #当前时间 年-月-日

案例01-系统巡检-获取所有机器的基础信息保存到/tmp/主机名命令文件中

步骤:
01.创建文件
02.写入内容

cat 10.vars_sys_info.yml 
---
- hosts: all
  tasks:
    - name: 创建文件并写入系统基本信息
      lineinfile:
        path: /tmp/{{ ansible_hostname }}
        create: yes
        line: "主机名:{{ansible_hostname}}\nip地址:{{ansible_default_ipv4.address}}\n内存总计:{{ansible_memtotal_mb}}"
  • facts小结
    • 如果ans中使用到了一些系统的基础信息. eg: ip地址,主机名,时间.
      如果没有这种需求或通过别的方式实现这个需求,可以关闭facts功能,让剧本执行加速. 使用gather_facts: no

      cat 08.vars_files_dir.yaml

      • hosts: all
        gather_facts: no
        vars_files: ./vars.yaml
        tasks:
        • name: 01.mkdir
          file:
          path: "{{ dir_name }}"
          state: directory
        • name: 02.touch
          file:
          path: "{{ dir_name}}/{{ file_name }}"
          state: touch

3)ansible-register变量
eg:创建压缩包压缩包名字包含时间.tar打包压缩,date获取时间

shell:
tar zcf /tmp/etc-`date +%F`.tgz /etc/

1)案例01-创建以主机名命名文件/opt/主机名

步骤:
01.获取主机名:hostname
02.创建文件,使用上一步结果

register:变量名字 #这个变量的内容,叫json格式
register:hostname #json格式,只想要输出标准输出,stdout=standard output标准输出
hostname.stdout #获取命令的结果 `hostname`

cat 12.vars_register.yml
---
- hosts: all
  tasks:
    - name: 01.获取主机名
      shell: hostname
      register: hostname
    - name: 02.输出变量内容
      debug:
        msg: "{{hostname.stdout}}"
按照路径创建文件
---
- hosts: all
  tasks:
    - name: 01.获取主机名
      shell: hostname
      register: hostname
    - name: 输出变量内容
      debug:
        msg: "{{hostname.stdout}}"
    - name: 02.创建文件
      file:
        path: /opt/{{ hostname.stdout }}
        state: touch

register变量输出结果

register: hostname  
hostname.stdout  #正常输出信息
hostname.rc      #取出返回值.
hostname.stderr  #取出错误信息.

10.3变量小结

为何使用变量:
剧本,脚本使用的变量放在一个文件中,剧本开头的。
一般存放:用户名,用户组,目录,端口.....
变量
命令行 临时使用,较少用
剧本文件中vars定义 当前这个剧本生效,涉及多个剧本不方便
变量文件vars_files 所有变量写入到文件中:key:value变量:值,在剧本中通过定义vars_files: 使用,引用变量文件路径./vars.yml 每次使用需要手动在剧本加载.vars_files:./vars.yml
主机组共用的变量文件 group_vars 应用范围广泛,根据主机清单里面的分组创建目录,存放vars.yml 根据主机所属的主机组,自动读取group_vars/组名/vars.yml文件.一般的结构:group_vars/all/vars.yml
ansible内置变量(facts变量) 收集主机的基本信息,ip地址,主机名,系统及版本... 如果想提升ans执行速度可以关闭gather_facts: no
register变量(注册变量) 实现命令行$()或``功能 寄存器变量(注册,临时变量):把命令,模块结果,存放到reg格式变量中,通过变量.stdout取出对应值

11.Ansible-进阶-剧本调试方法

11.1概述

具体方法
debug模块
tags标签
忽略错误

11.2Debug模块

debug模块
msg 相当于echo命令,配合着register一起用
案例01-调试-nfs服务端部署脚本
cat 13-debug-nfs-server.yml 
---
- hosts: db
  tasks:
    - name: 01 部署nfs服务端软件
      yum:
        name: nfs-utils
        state: installed
    - name: 02 修改配置文件
      lineinfile:
        path: /etc/exports
        line: "/data 172.16.1.0/24(rw)"
        state: present
        backup: yes
    - name: 03 创建对应的目录
      file:
        path: /data/
        owner: nfsnobody
        group: nfsnobody
        state: directory
      register: file_jieguo
    - name: 输出,显示这个过程
      debug:
        msg: "{{ file_jieguo }}"
    - name: 04 启动服务rpc-bind
      systemd:
        name: rpcbind
        enabled: yes
        state: started
    - name : 05 启动服务nfs
      systemd:
        name: nfs
        enabled: yes
        state: started

11.3 tags标签

一般用于调试剧本,给剧本每个task可以设置个标签
运行剧本的时候可以运行指定标签
运行剧本可以排除某些标签

[root@m01 /server/ans/playbook]# cat 14-tags-nfs-server.yml 
---
- hosts: db
  tasks:
    - name: 01 部署nfs服务端软件
      yum:
        name: nfs-utils
        state: installed
      tags:
        - install
    - name: 02 修改配置文件
      lineinfile:
        path: /etc/exports
        line: "/data 172.16.1.0/24(rw)"
        state: present
        backup: yes
      tags:
        - conf
        - conf_file
    - name: 03 创建对应的目录
      file:
        path: /data/
        owner: nfsnobody
        group: nfsnobody
        state: directory
      tags:
        - conf
        - conf_dir
    - name: 04 启动服务rpc-bind
      systemd:
        name: rpcbind
        enabled: yes
        state: started
      tags:
        - start_srv
    - name : 05 启动服务nfs
      systemd:
        name: nfs
        enabled: yes
        state: started
      tags:
        - start_srv

运行指定的标签
ansible-playbook -i hosts --tags conf 14-tags-nfs-server.yml
ansible-playbook -i hosts --tags conf_file,conf_dir 14-tags-nfs-server.yml

运行剧本的时候排除指定的标签.
ansible-playbook -i hosts --skip-tags install,conf_file 14-tags-nfs-server.yml

11.4忽略错误

用于运行剧本的时候,强制让某个任务(模块)运行即使出错了,也不要中断我们的剧本

cat 15-ignore-tags-nfs-server.yml 
---
- hosts: db
  tasks:
    - name: 01 部署nfs服务端软件
      yum:
        name: nfs-util
        state: installed
      ignore_errors: yes
      tags:
        - install
    - name: 02 修改配置文件
      lineinfile:
        path: /etc/exports
        line: "/data 172.16.1.0/24(rw)"
        state: present
        backup: yes
      tags:
        - conf
        - conf_file
    - name: 03 创建对应的目录
      file:
        path: /data/
        owner: nfsnobody
        group: nfsnobody
        state: directory
      tags:
        - conf
        - conf_dir
    - name: 04 启动服务rpc-bind
      systemd:
        name: rpcbind
        enabled: yes
        state: started
      tags:
        - start_srv
    - name : 05 启动服务nfs
      systemd:
        name: nfs
        enabled: yes
        state: started
      tags:
        - start_srv

ansible-playbook -i hosts 15-ignore-tags-nfs-server.yml

11.5调试方法小结

具体方法 应用场景
debug模块 执行剧本的时候输出剧本的执行流程,一般配合register一起使用. 输出facts变量.自定义变量.
tags 标签 给一些模块加上标签,运行剧本的时候可以运行指定标签的内容,排除指定标签.
忽略错误 运行剧本的时候忽略一些模块的错误,让剧本继续运行.

12.Ansible-进阶-进阶应用

  • include
  • handler
  • when判断
  • 循环

12.1 include功能-熟悉

include文件包含.把一个任务分成多个剧本来实现,书写个总剧本文件,通过include_tasks: 引用子剧本文件.

⚠ 子剧本文件中只需要些模块部分(task部分即可)

相关推荐
Wanliang Li16 分钟前
Linux电源管理——CPU Hotplug 流程
linux·嵌入式硬件·嵌入式·armv8·电源管理·cpuhotplug
fnd_LN23 分钟前
Linux文件目录 --- mkdir命令,创建目录,多级目录,设置目录权限
linux·运维·服务器
会飞的土拨鼠呀33 分钟前
Flannel是什么,如何安装Flannel
运维·云原生·kubernetes
木与子不厌35 分钟前
微服务自定义过滤器
运维·数据库·微服务
达帮主41 分钟前
7.C语言 宏(Macro) 宏定义,宏函数
linux·c语言·算法
行思理1 小时前
Linux 下SVN新手操作手册
linux·运维·svn
初学者丶一起加油1 小时前
C语言基础:指针(数组指针与指针数组)
linux·c语言·开发语言·数据结构·c++·算法·visual studio
嘤嘤怪呆呆狗2 小时前
【开发问题记录】使用 Docker+Jenkins+Jenkins + gitee 实现自动化部署前端项目 CI/CD(centos7为例)
前端·vue.js·ci/cd·docker·gitee·自动化·jenkins
沛沛老爹2 小时前
CI/CD是什么?
运维·git·ci/cd
张某人想退休2 小时前
Postman最新接口自动化持续集成
自动化·jenkins·postman