第七篇:Ansible剧本、变量

剧本⭐⭐⭐⭐

  • playbook文件:用于长久保存并实现批量管理、维护、部署的文件
  • 脚本中存放变量和命令,剧本中存放变量和模块
  • 剧本采用yaml序列化格式:冒号 空格(不按照该格式则报错)
剧本与点对点模式的异同 ans剧本 ans ad-hoc
共同点 批量管理,使用模块 批量管理,使用模块
异同点 重复调用 临时执行
应用场景 部署多步骤任务 部署临时性任务,测试模块

  剧本书写格式

剧本文件以.yml或.yaml结尾

# 执行剧本
ansible-playbook -i hosts /server/scripts/playbook/01.show.yml
可以将主机清单文件/ansible/hosts文件剪切到剧本文件中

  剧本案例

  • 报错分析
    • 需要切换到主机清单文件的目录下
    • -i 指定主机清单的绝对路径

 案例01:批量创建目录/server/files/,且将/etc/hosts文件分发到/server/files/目录中

复制代码
[root@m01 /server/scripts/playbook]# cat 01.show.yaml 
---
- hosts: all
  tasks:
    - name: 01 创建目录/server/files/
      file:
        path: /server/files/
        state: directory

    - name: 02 分发/etc/hosts文件到/server/files/目录中
      copy:
        src: /etc/hosts 
        dest: /server/files/
复制代码

 案例02:批量下载zabbix-agent软件包,安装并启动服务

复制代码
[root@m01 /server/scripts/playbook]# cat 02.show.yaml 
---
- hosts: all
  tasks:
    - name: 01 下载软件包到/app/tools/
      get_url: 
        url: https://mirrors.tuna.tsinghua.edu.cn/zabbix/zabbix/6.0/rhel/7/x86_64/zabbix-agent-6.0.21-release1.el7.x86_64.rpm
        dest: /tmp/
    
    - name: 02 安装zabbix软件包
      yum:
        name: /tmp/zabbix-agent-6.0.21-release1.el7.x86_64.rpm
        state: present

    - name: 03 启动zabbix-agent服务
      systemd:
        name: zabbix-agent
        enabled: yes
        state: started 
复制代码

 案例03:部署sersync服务⭐⭐⭐⭐⭐

  • 备份服务
    • 安装服务
    • 配置配置文件
    • 添加虚拟用户
    • 创建密码文件并修改其权限
    • 创建共享目录并修改权限
    • 启动服务
  • 存储服务
    • 安装服务
    • 启动服务
    • 配置文件
    • 重启服务
    • 创建共享目录并修改权限
    • 挂载
  • 实时同步服务
    • 安装服务
    • 解压压缩包
    • 创建存放该服务的目录
    • 启动服务

Ansible中的变量⭐⭐⭐⭐

Ansible中可以定义变量的地方 说明
剧本中定义变量 仅限于当前的剧本使用(常用)

 

变量文件

 

根据主机清单分组进行变量的定义

常用于多个剧本使用相同的变量

register变量(注册变量)

ip = `hostname -I`

实现脚本中反引号的功能,可以获取命令的结果

facts变量 一般用于获取主机基本信息
inventory主机清单中定义变量 批量修改主机使用(使用较少)

  剧本中定义变量⭐⭐⭐

复制代码
[root@m01 /server/scripts/playbook]# cat 04.show.yaml 
---
- hosts: web
  vars: 
    dir: /yuan/xiao/
  tasks:
    - name: mkdir
      file:
        path: {{ dir }}
        state: directory

# 温馨提示:如果使用的变量是某个选项的开头,则变量引用的时候需要加上双引号
    dir: /yuan/xiao
    file:
      path: "{{ dir }}"    # 该情况需要添加双引号
    file:
      path: /etc-new/{{ dri }}    # 该种情况不需要添加双引号
复制代码

  变量文件⭐⭐⭐

 变量文件(公用变量)⭐⭐⭐

  • 变量文件
# 变量文件
[root@m01 /server/scripts/playbook]# cat vars.yaml 
dir: /tmp/
file: yuan.txt
user: yuanxiaojiang
  • 剧本
复制代码
# 剧本
[root@m01 /server/scripts/playbook]# cat 05.show.yaml 
---
- hosts: all
  vars_files: ./vars.yaml
  tasks:
    - name: create file
      file:
        path: "{{ dir }}{{ user }}--{{ file }}"
        state: touch
复制代码

 根据主机组使用变量(公用变量)⭐⭐⭐

# 在主机清单文件的统计目录下创建/group_vars/目录
/group_vars/
    web/vars.yaml    # 存放web组的变量
    data/vars.yaml    # 存放data组的变量
    all/vars.yaml    # 存放所有主机的变量
    # 注意:如果目录不使用/group_vars则报错
  •  变量文件
[root@m01 /server/scripts/playbook]# cat ./group_vars/all/vars.yaml 
user: yuanxiaojiang
web_mount_dir: /web_nfs
nfs_server: 172.16.1.31
  • 剧本
复制代码
[root@m01 /server/scripts/playbook]# cat test_group_vars.yaml 
---
- hosts: all
  tasks:
    - name:
      debug:
        msg: 变量内容为user:{{ user }} web_mount_dir:{{ web_mount_dir }} nfs_server:{{ nfs_server }}

- hosts: web
  tasks:
    - name: 测试web组是否能识别group变量
      debug:
        msg: 变量内容为user:{{ user }} web_mount_dir:{{ web_mount_dir }} nfs_server:{{ nfs_server }}
复制代码

  register变量(注册变量)⭐⭐

  • 本质:实现脚本中的反引号功能
  • 用户通过命令获取的内容都存放在register变量中
  • register中存放的是json格式数据
复制代码
---
- hosts: web
  tasks:
    - name: get time
      shell: date +%F
      register: result

    - name: print result
      debug:
        msg: |
            "register变量的标准输出:{{ result.stdout }}"
            "register变量的全部内容:{{ result }}"
复制代码

  facts变量

  • facts变量:运行剧本时从被管理机上收集的系统信息
  • facts变量通过setup模块获取:ansible all -m setup -i /server/scripts/playbook/hosts
  • facts变量应用场景:
    • 通过facts变量获取系统的基本信息
    • 通过facts变量获取系统的基本信息并进行判断
  • 关闭facts:在剧本中加上(gather_facts: no)

 常用的facts变量

ansible_hostname    # 主机名
ansible_memtotal_mb    # 系统内存大小(单位mb)
ansible_swaptotal_mb    # 系统交换内存大小(单位mb)
ansible_processor_vcpus    # cpu数量
ansible_date_time.date    # 当前日期
ansible_processor_cores    # 默认网卡ip(默认是eth0)
ansible_default_ipv4.address    # 默认的网卡ip eth0
ansible_distribution    # 系统发行版本名名字

 案例: 批量修改系统/etc/motd文件

登录的时候输出系统基本信息:主机名、内存总大小、IP地址、发行版本、cpu数、核心数
复制代码
# jinja2
    用于python的模板引擎,允许动态生成文件
    文件后缀:.j2

# 1. 创建包含变量的模板文件
    [root@m01 /server/scripts/playbook]# cat ./templates/motd.j2
    主机名: {{ ansible_hostname }}
    ip地址: {{ ansible_default_ipv4.address }}
    内存大小: {{ ansible_memtotal_mb }}
    CPU数量: {{ ansible_processor_vcpus }}
    核心总数: {{ ansible_processor_cores }}
    发行版本: {{ ansible_distribution }}

# 2. 发送模板文件替代/etc/motd
[root@m01 /server/scripts/playbook]# cat change_moth.yaml
---
- hosts: web
  tasks:
    - name: 分发/motd文件
      template:
        src: templates/motd.j2 
        dest: /etc/motd
        backup: yes
复制代码

 

posted @   猿小姜  阅读(15)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示