运维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部分即可)

相关推荐
绵绵细雨中的乡音1 小时前
网络基础知识
linux·网络
Peter·Pan爱编程1 小时前
Docker在Linux中安装与使用教程
linux·docker·eureka
cxyll12342 小时前
postman+newman+jenkins接口自动化
自动化·jenkins·postman
kunge20132 小时前
Ubuntu22.04 安装virtualbox7.1
linux·virtualbox
清溪5492 小时前
DVWA中级
linux
MUY09902 小时前
应用控制技术、内容审计技术、AAA服务器技术
运维·服务器
楠奕2 小时前
elasticsearch8.12.0安装分词
运维·jenkins
Sadsvit3 小时前
源码编译安装LAMP架构并部署WordPress(CentOS 7)
linux·运维·服务器·架构·centos
xiaok3 小时前
为什么 lsof 显示多个 nginx 都在 “使用 443”?
linux
java资料站3 小时前
Jenkins
运维·jenkins