运维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部分即可)
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值