网站集群批量管理-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
相关推荐
Hy行者勇哥5 天前
用Cursor智能编写Ansible/Terraform脚本,打通CI/CD链路
ci/cd·ansible·terraform
芷栀夏7 天前
飞牛NAS怎么部署Immich?家庭照片自动备份与远程访问教程
服务器·nginx·ansible
悠然南风17 天前
Ansible常见模块总结及LDAP Role 编写与调试
ansible
祺风挽楠1 个月前
ansible编辑
网络·ansible
芳心粽伙饭1 个月前
Ansible课后作业
ansible
烁3471 个月前
Ansible初识
ansible
烁3471 个月前
Ansible安装部署调试
ansible
烁3471 个月前
Ansible命令
ansible
小义_1 个月前
【Ansible】(三)基础配置与连接设置
云原生·ansible
炸炸鱼.1 个月前
Ansible 企业级实战:Playbook 与 Roles 完全指南
网络·ansible