网站集群批量管理-Ansible(playbook)

1.剧本概述

  1. playbook 文件,用于长久保存并且实现批量管理,维护,部署的文件. 类似于脚本存放命令和变量

  2. 剧本yaml格式,yaml格式的文件:空格,冒号

2. 区别

|-----|--------------|-------------|
| | ans-playbook | ans ad-hoc |
| 共同点 | 批量管理,使用模块 | 批量管理,使用模块 |
| 区别 | 重复调用 | 不是很方便,不容易重复 |
| 场景 | 部署服务,多个步骤的任务 | 测试使用 |

  1. 剧本书写格式
bash 复制代码
##书写剧本
---
- hosts: all
  tasks:
   - name: 这是第1个
     shell: echo '1' >/tmp/xzb66.txt
   - name: 这是第2个
     shell: echo '2'>/tmp/xzb66.txt
   - name: 这是第3个
     shell: echo '3'>/tmp/xzb66.txt
##执行剧本 -i 指定你的/etc/ansible/hosts的文件地址
ansible-playbook -i hosts 01-playbook-yml 

执行的时候有奶牛:

可以删除软件或修改ansible.cfg配置进行关闭 #nocows = 1 去掉注释即可
书写Ans playbook注意事项:

  1. 同一个层级的内容对齐的

  2. 不同层级的通过2个空格对齐

  3. 不能使用tab键

3.剧本案例

案例01: 创建目录并分发文件

bash 复制代码
##1. 创建目录/server/files/
##2. /etc/hosts文件发送过去/server/files/
---
- hosts: all
  tasks:
   - name: 01创建目录
     file:
      path: /server/file/
      state: directory
   - name: 02创建文件
     copy:
      src: /etc/hosts
      dest: /server/file/
##3. 执行剧本,查看结果
ansible-playbook -i hosts 02-playbook.yml

案例02: 分发软件包,安装软件包,启动服务

bash 复制代码
- hosts: all
  tasks:
    - name: 01 下载软件包
      get_url:
        url: https://mirrors.tuna.tsinghua.edu.cn/zabbix/zabbix/6.0/rhel/7/x86_64/zabbix-agent2-6.0.7-1.el7.x86_64.rpm
        validate_certs: no
        dest: /tmp/

    - name: 02 安装软件包
      yum:
        name: /tmp/zabbix-agent2-6.0.7-1.el7.x86_64.rpm
        state: present

    - name: 03 配置
      debug:
        msg: "进行配置zabbix-agent"

    - name: 04 开机自启
      systemd:
        name: zabbix-agent2
        enabled: yes
        state: started
bash 复制代码
##运行剧本
ansible-playbook -i hosts 03-playbook.yml 
##查看结果
ansible all -i hosts -m shell -a 'ps -ef|grep zabbix'

案例03: 部署NFS服务

bash 复制代码
##nfs服务端:在backup上部署nfs服务,共享/backup-nfs目录,all_squash,匿名用户:nfsnobody 
##nfs客户端:web挂载 /ans-upload目录挂载nfs服务端共享的/backup-nfs(永久挂载)
- hosts: backup
  tasks:
    - name: 01 在backup上部署nfs,rpcbind服务端
      yum:
        name: nfs-utils,rpcbind
        state: present
    - name: 02 修改配置文件 
      lineinfile: 
        path: /etc/exports
        line: "backup-nfs 172.16.1.0/24(rw,all_squash)"
        create: true
    - name: 03 创建共享目录并修改所有者
      file:
        path: backup-nfs
        owner: nfsnobody
        group: nfsnobody
        state: directory
    - name: 04-1 启动服务(注意顺序)
      systemd:
        name: rpcbind
        enabled: yes
        state: started
    - name: 04-02 启动服务
      systemd:
         name: nfs
         enabled: yes
         state: started

- hosts: nfs
  tasks:
    - name: 01 部署nfs-utils
      yum:
        name: nfs-utils
        state: present
    - name: 02 挂载
      mount:
        src: 172.16.1.41:/backup-nfs
        path: /ans-upload
        fstype: nfs
        state: mounted
bash 复制代码
##运行剧本,查看结果
ansible-playbook -i hosts 05-playbook-yml
##查看
ansible nfs -i hosts -a 'df -h'

4. Ansible中的变量

  1. 变量无处不在,在ans中大部分地方都可以定义变量

  2. 比较常用的创建变量的地方:剧本中,类似于命令行 ` `(反引号)的 功能,共用的变量文件.

|-----------------------|------------------------------------------------------------|
| 可以定义变量的地方 | 说明 |
| 在剧本文件中定义 | 比较常用. 仅仅限于当前的play使用 |
| register变量(注册变量) | ip=`hostname -I` 实现脚本中反引号的功能,可以获取命令结果 |
| 变量文件(根据主机清单分分组进行定义变量) | 如果多个剧本,使用相同的变量,大型的剧本roles |
| inventory主机清单中定义变量 | 未来可以用于批量修改主机使用,其他很少用了 |
| facts变量 | 一般用于获取主机基本信息:ip,主机名,系统 (centos/ubuntu) 如果不需要可以关闭,用于加速剧本的执行 |

4.1 剧本中使用变量

批量创建/oldboy/xzb/upload/
- hosts: all
  vars:
    dir: /oldboy/xzb996/upload/
  tasks:
    - name: 创建目录
      file:
        path: "{{dir}}"
        state: directory

##运行剧本,查看结果
ansible-playbook -i hosts 05-vars-yml

提示:

  1. 使用变量的时候如果变量是某个选项的开头,则变量引用的时候需要加上双引号

  2. 在剧本play中定义变量应用:仅仅在当前play生效,一般用来存放路径,用户名,ip地址,类似于之前使用的脚本,注意引号使用

dir: /oldboy/xzb/upload/
file:
  path: "{{ dir }}"#这种要添加,变量是开头.
file:
  path: /oldboy-new/{{ dir }}  #这种可以不加引号,变量不是开头.

4.2 共用变量-变量文件

##创建变量文件
dir: /tmp/
file: xzb.txt
user: xzb996
##创建剧本
- hosts: all
  vars_files: ./vars.yml  ##也可以写变量文件的绝对路径
  tasks:
    - name: 变量文件
      file:
        path: "{{dir}}/{{user}}-{{file}}"
        state: touch

##运行剧本,查看结果
ansible-playbook -i hosts 06-vars.yml

4.3 共用变量-根据主机组使用变量

group_vars/

lb/vars.yml #存放lb组的变量

web/vars.yml #存放web组的变量

data/vars.yml #存放xxx组的变量

all/vars.yml #所有主机共用的变量

未来一般使用all分组即可,把所有变量存放在一起,供剧本使用

bash 复制代码
##在剧本的统计目录下创建group_vars/all/vars.yml
[root@ansible_xing /server/scripts/playbook]# mkdir -p /group_vars/all/
vim vars.yml
user: www
nfs_dir: /nfs_backup
web_mount_dir: /web_nfs
nfs_server: 172.16.1.41
rsync_pass: 1
##创建剧本
[root@ansible_xing /server/scripts/playbook]# vim 07-group-vars.yml
- hosts: all
  tasks:
   - name: 测试group变量
     debug:
       msg: "变量内容 {{user}} {{rsync_pass}}"

- hosts: backup
  tasks:
   - name: 测试web组是否被识别到
     debug:
        msg: "web组识别的变量内容为{{user}} {{rsync_pass}}"
bash 复制代码
##运行剧本
ansible-playbook -i hosts 07-group-vars.yml 

4.4 register变量注册变量

  1. 本质上就是用来实现脚本中的反引号功能. ip=`hostname -I`

  2. 用户通过命令获取的内容都存放到Register变量中

bash 复制代码
- hosts: all
  tasks:
   - name: get data
     shell: date +%F
     register: result

   - name: print result 变量内容
     debug: 
       msg: "register变量的全部内容是{{result.stdout}}"
bash 复制代码
##运行脚本查看结果
ansible-playbook -i hosts 08-reg-vars.yml 

4.5 facts变量

  1. 运行剧本的时候ans会收集每个主机的基本信息,这些信息形成的变量叫做facts变量.

  2. facts变量setup模块获取,可以通过ansible -i hosts nfs -m setup查看.

bash 复制代码
##常用fact变量
ansible_hostname               #主机名 
ansible_memtotal_mb            #内存大小(总计) 单位mb 
ansible_processor_vcpus        #cpu数量 
ansible_default_ipv4.address   #默认的网卡ip eth0
ansible_distribution           #系统发行版本名字
bash 复制代码
- hosts: all
  tasks:
    - name: 显示系统信息
      debug:
        msg: |
           你的系统是:{{ansible_hostname}}
           内存大小:{{ansible_memtotal_mb}}
           cpu数量:{{ansible_processor_vcpus }}
           默认网卡ip:{{ansible_default_ipv4.address}}
           系统发行版本:{{ansible_distribution}}
bash 复制代码
##运行脚本,查看结果
ansible-playbook -i hosts  09-facts.yml
相关推荐
Linux运维技术栈13 小时前
Ansible(自动化运维)环境搭建及ansible-vault加密配置
运维·自动化·ansible
花晓木19 小时前
ansible安装文档
ansible
vvw&1 天前
如何在 Ubuntu 22.04 上安装 Ansible 教程
linux·运维·服务器·ubuntu·开源·ansible·devops
☆凡尘清心☆2 天前
CentOS-stream-9安装ansible
linux·centos·ansible
墨水\\2 天前
Ansible---playbook剧本
ansible
墨水\\3 天前
Ansible部署及基础模块
服务器·网络·ansible
七七powerful3 天前
ansible play-book玩法
linux·服务器·ansible
Karoku0665 天前
【自动化部署】Ansible循环
linux·运维·数据库·docker·容器·自动化·ansible
W u 小杰5 天前
Ansible基本用法
服务器·网络·ansible
运维小文5 天前
ansible剧本快速上手
linux·运维·python·自动化·ansible·幂等性·剧本