集群批量管理-Ansible-剧本与变量

复盘:https://www.processon.com/view/link/61addd266376896056c1b1b2

1.剧本

  • 剧本:
    • playbook 文件,用于长久保存并且实现批量管理,维护,部署的文件. 类似于脚本存放命令和变量,剧本中存放的时候?模块
    • 剧本yaml格式,yaml格式的文件:空格,冒号.
    • 剧本未来我们批量管理,运维必会的内容.

image

  • 剧本书写格式

image

#1. 书写剧本 注意以.yml或.yaml结尾

#2. 执行剧本
ansible-playbook -i hosts 01.show.yml

[root@hadoop1 /server/srcipts/playbook]# cat 01.show.yml 
---
- 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

执行的时候有奶牛:🐮

可以删除软件或修改ansible.cfg配置进行关闭 #nocows = 1去掉注释即可

  • 书写Ans playbook注意事项:
    • 同一个层级的内容对齐的.
    • 不同层级的通过2个空格对齐
    • 不能使用tab键

2.剧本案例

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

1. 创建目录/server/files/
2. /etc/hosts文件发送过去/server/files/
  • 中间转换步骤: 任务的步骤----->模块(命令行)
1. 创建目录/server/files/
-m file  -a 'path=/server/files/ state=directory'
2. 分发
-m copy -a 'src=/etc/hosts dest=/server/files/ '
  • 书写剧本
[root@hadoop1 /server/srcipts/playbook]# cat 02.fenfa.yml
- hosts: all
  tasks:
    - name: 01 创建目录
      file: path=/server/files/ state=directory  # 修正 ptah → path,stae → state
    - name: 02 分发文件
      copy: src=/etc/hosts dst=/server/files/    # 修正 scr → src



#-----------------------------------------------------------专业格式的剧本
[root@hadoop1 /server/srcipts/playbook]# cat 02.fenfa.yml 
- hosts: all
  tasks: 
    - name: 01.创建目录
      file: 
        path: /server/files/ 
        state: directory 

    - name: 02.分发文件
      copy: 
        src: /etc/hosts 
        dest: /server/files/

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

  • 步骤:

    • zabbix-agent软件包(下载)
    • 安装软件包
    • 配置(略)
    • 启动开机自启动
  • 第1个里程碑-找出每个步骤的命令

# 下载软件包
wget --no-check-certificate https://repo.zabbix.com/zabbix/6.0/rhel/7/x86_64/zabbix-agent-6.0.7-1.el7.x86_64.rpm
# 安装软件包
yum install -y zabbix-agent-6.0.7-1.el7.x86_64.rpm
# 启动
systemctl
  • 书写剧本
[root@m01 /server/scripts/playbook]# cat 03.install-zabbix-agent.yml
- hosts: all
  tasks:
    - name: 01. 下载软件包到/tmp/
      get_url:
        url: "https://mirrors.tuna.tsinghua.edu.cn/zabbix/zabbix/6.0/rhel/7/x86_64/zabbix-agent-6.0.7-1.el7.x86_64.rpm"
        validate_certs: no
        dest: /tmp/
    - name: 02. 安装软件包
      yum:
        name: /tmp/zabbix-agent-6.0.7-1.el7.x86_64.rpm
        state: present
    - name: 03. 配置
      debug:
        msg: "进行配置zabbix - agent"
    - name: 04. 启动
      systemd:
        name: zabbix - agent
        enabled: yes
        state: started

2.3.案例03: nfs服务

  • nfs服务端:在backup上部署nfs服务,共享/backup-nfs目录,all_squash,匿名用户:nfsnobody

  • nfs客户端:web挂载 /ans-upload目录挂载nfs服务端共享的/backup-nfs(永久挂载)

  • 第1个里程碑-列出流程

    • 服务端流程:
      • 部署nfs-utils,rpcbind
      • 修改配置文件
      • 创建共享目录并改所有者
      • 启动服务rpcbind,nfs(注意顺序)
    • 客户端流程:
      • 安装nfs-utils
      • 挂载与永久挂载
  • 第2个里程碑-根据步骤流程模块

  • 第3个里程碑-书写剧本

服务端流程:
1. 部署nfs-utils
2. 修改配置文件 /etc/exports
/backup-nfs 172.16.1.0/24(rw,all_squash)
3. 创建共享目录,改所有者
4. 启动服务rpcbind,nfs
客户端:
1. 安装nfs-utils
2. 挂载与永久挂载
[root@m01 /server/scripts/playbook]# cat 04.deploynfs.yml
# nfs服务端部署
- name: nfs服务端部署
  hosts: backup
  tasks:
    - name: 01. 部署nfs-utils,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. 启动服务rpcbind,nfs(注意顺序)
      systemd:
        name: rpcbind
        enabled: yes
        state: started
    - name: 04-2. 启动服务rpcbind,nfs(注意顺序)
      systemd:
        name: nfs
        enabled: yes
        state: started

# nfs客户端部署
- name: nfs客户端部署
  hosts: web
  tasks:
    - name: 01. 部署nfs-utils
      yum:
        name: nfs-utils
        state: present
    - name: 02. 挂载nfs
      mount:
        src: 172.16.1.41:/backup-nfs
        path: /ans-upload
        fstype: nfs
        state: mounted
  • 理清服务作用,服务使用流程.
  • 书写剧本核心: 列出步骤根据步骤找出模块
  • 书写剧本.
  • 书写剧本前拍摄快照,边书写剧本边测试,最后测试完成,恢复快照,重新跑一次.(分步测试,联合测试)

3. Ansible中的变量

image

3.1. 剧本中使用变量⭐⭐⭐⭐⭐

批量创建/oldboy/lidao/upload/
vars : variable 变量的内容,变量.
dir就是变量,变量的内容:右边的内容.
cat 05.vars.yml
- hosts: all
  vars:
    dir: /oldboy/lidao/upload/
  tasks:
    - name: mkdir
      file:
        path: "{{ dir }}"
        state: directory

⚠ 温馨提示:

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

1 dir: /oldboy/lidao/upload/
2 
3 file:
4 path: "{{ dir }}"             #这种要添加,变量是开头.
5 file:
6 path: /oldboy-new/{{ dir  }}  #这种可以不加引号,变量不是开头.

在剧本play中定义变量应用:

  1. 仅仅在当前play生效.
  2. 一般用来存放路径,用户名,ip地址,类似于之前使用的脚本.
  3. 注意引号使用.

3.2.共用变量-变量文件

# cat 05.vars.yml content
- hosts: all
  vars_files: ./vars.yml
  tasks:
    - name: file
      file:
        path: "{{ dir }}/{{ user }}-{{ file }}"
        state: touch

# cat vars.yml content
dir: /tmp/
file: lidao.txt
user: lidao996kkk

3.3. 共用变量-根据主机组使用变量 ⭐⭐⭐⭐⭐

  • group_vars根据主机清单的分组去匹配.
  • 变量文件.
  • 主机组创建变量文件.

group_vars

xxxx-check.yml
group_vars/
   lb/vars.yml  #存放lb组的变量
   web/vars.yml #存放web组的变量
   data/vars.yml #存放xxx组的变量
   all/vars.yml  #所有主机共用的变量
   未来一般使用all分组即可,把所有变量存放在一起,供剧本使用.
  • 创建属于oldboy用户的文件
[root@m01 /server/scripts/playbook]# cat group_vasrs/all/vars.yml 
user: www
nfs_dir: /nfs_backup
web_mount_dir: /web_nfs
nfs_server: 172.16.1.41
rsync_pass: 1
[root@m01 /server/scripts/playbook]# cat 07.group_vars.yml
- hosts: all
 tasks:
    - name: 测试group变量
     debug:
       msg: "变量内容 {{user}} {{rsync_pass}}"
- hosts: web
 tasks:
    - name: 测试web组是否识别group变量
     debug:
       msg: "web组识别的变量变量内容 {{user}} {{rsync_pass}}"

⚠ 温馨提示: group_vars应用提示

一般使用group_vars中的all分组即可

3.4.register变量注册变量 ⭐⭐

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

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

  • 某个Register变量的信息

{
    'stderr_lines': [],
    u'changed': True,
    u'end': u'2022-08-24 16:38:27.887829',
    'failed': False,
    u'stdout': u'2022-08-24',
    u'cmd': u'date +%F',
    u'rc': 0,
    u'start': u'2022-08-24 16:38:27.860574',
    u'stderr': u'',
    u'delta': u'0:00:00.027255',
    'stdout_lines': [u'2022-08-24'],

    'ansible_facts': {u'discovered_interpreter_python': u'/usr/bin/python'}
}
[root@m01 /server/scripts/playbook]# cat   08.regvars.yml
- hosts: all
 tasks:
    - name: get date
     shell: date +%F
     register: result
    - name: print result 变量内容
     debug:
       msg: |
             "register变量的全部内容是:{{ result.stderr }}"
             "register变量的精确的内容是:{{ result.stdout }}"

register注册变量:

变量.stdout 获取输出即可.

json形式数据.
key: value
键: 值
变量: 内容

date +%F

stdout部分是我们想要的内容.

register变量result.
result.stdout  #std standard output 标准输出

符号说明 :

​ msg:中的 | 表示下面的内容是多行. | 也可以用于其他模块中

  • 剧本:课堂案例

  • 变量

    • 书写nfs部署剧本:服务端,客户端
    • 书写rsync部署剧本:服务端,客户端(定时任务 + 脚本)
    • 书写sersy
  • 尽量使用变量

posted @ 2025-05-25 22:46  殇ベ墨~  阅读(26)  评论(0)    收藏  举报