Ansible Playbook自动化运维全攻略

一、Ansilbe Playbook剧本

Ansible Playbook 的核心作用是通过声明式 YAML 文件实现自动化配置管理、应用部署和基础设施编排。它采用基础设施即代码(IaC)方式确保环境一致性,具备幂等性(可安全重复执行)、良好的可复用性以及跨平台支持特性。这种方案能显著提升运维效率(例如实现批量部署分钟级完成),有效减少人工错误,同时支持版本控制和审计追踪。它适用于云环境、服务器集群及网络设备等场景的标准化运维管理。

1.YAML

YAML是一种轻量级的人类可读数据序列化格式,采用直观的缩进结构和键值对表示方式。它支持常见数据类型如字符串、数字、布尔值、列表以及嵌套对象,广泛应用于配置文件和数据交换场景。YAML的主要优势在于其简洁易读的语法、出色的跨语言兼容性,以及通过注释提升代码可维护性的特性。

2.配置VIM编辑器
bash 复制代码
vim ~/.vimrc
#设置自动缩进和扩展制表符,缩进宽度为2空格
set ai et ts=2
#可视化当前编辑行
set cursorline
#可视化当前编辑列
set cursorcolumn

二、Playbook基础语法

1.ping模块
bash 复制代码
vim ping.yml
---
- name: test ping       #剧本名称
  hosts: all            #作用主机(组)
  tasks:                #任务
    - name: ping        #任务1名成
      ping:             #所用模块
ansible-playbook --syntax-check ping.yml      #检查文件语法
ansible-playbook ping.yml                     #执行剧本
2.file模块
bash 复制代码
---
- name: test file
  hosts: test
  tasks:
    - name: create dir
      file:                    #file模块
        path: /tmp/test/       #创建路径
        state: directory       #创建类型为目录
        mode: '0755'           #目录权限
3.copy模块
bash 复制代码
---
- name: test | and >
  hosts: test
  tasks:
    - name: test |               #任务1
      copy:                      #使用copy模块
        dest: /tmp/test.txt      #目标文件
        content: |               #追加文本
          hello nihao!
          hahahaha
    - name: test >
      copy:
        dest: /tmp/test.txt
        content: >
          nihao xxxx
          xxxxxxxxxx
4.user模块
bash 复制代码
---
- name: create user
  hosts: test
  tasks:
    - name: add user
      user:
        name: one
        uid: 1011
        group: test
        password: "{{'123'|password_hash('sha512')}}"
        state: present
- name: delete user 
  hosts: test
  tasks:
    - name: del user
      user:
        name: two
        state: absent
        remove: true
5.yum模块
bash 复制代码
--- 
- name: manage packages
  tasks:
    - name: install pkg
      yum:
        name:
          - nginx
          - vsftpd
        state: present
    - name: update pkg
      yum:
        name: '*'             #所有软件
        state: latest         #软件版本更新

二、Ansible变量

1.facts变量

在Ansible中,facts变量是由目标主机自动采集的系统信息,包含网络配置、硬件参数和系统版本等数据。通过内置的setup模块获取后,这些信息会以JSON格式存储,并可通过全局变量ansible_facts访问。这些数据常用于条件判断和动态配置任务。

默认情况下,Playbook执行时会自动收集facts数据。此外,用户还可以通过/etc/ansible/facts.d/目录添加自定义facts。要查看完整的facts信息,可以使用命令"ansible -m setup 主机名",这有助于实现基于主机特性的差异化运维操作。

2.查看facts变量

常用参数:

filter:用于过滤指定信息

bash 复制代码
ansible test -m setup -a "filter=ansible_bios_version"
bash 复制代码
---
- name: copy file with facts
  hosts: webservers
  tasks:
    - name: use facts
      copy:
        content: "hostname: {{ ansible_hostname }}\nbios_version: {{ ansible_bios_version }}"
        dest: /tmp/facts.txt
3.Ansible自定义变量

定义位置:

Inventory文件中定义变量

Inventory文件组的变量

Inventory文件主机的变量

剧本中组的变量

剧本中主机的变量

vars定义的变量

vars_files导入的变量

注册变量

roles中单独定义的变量

block中定义的变量

任务中定义的变量

命令行定义的变量

三、Ansible Playbook进阶

1.错误处理机制

当playbook中有多个任务时,一旦中间某个任务出现错误,后续任务都会终止执行。使用ignore_errors可以应用与tasks级别作用与忽略指定任务,也可以作用于全局所有任务。

bash 复制代码
---
- name: test error
  hosts: test
  #ignore_errors: true        全局级
  tasks:
    - name: start nginx
      service: 
        name: nginx
        state: started
        enabled: true
      ignore_errors: true       #任务级
    - name: touch file
      file:
        path: /tmp/test.txt
        state: touch
2.触发执行任务

使用handlers定义任务组 这些任务仅在收到notify通知时才会执行,即使收到多次notify,handlers任务也只执行一次,只有当主任务状态为changed时才会触发handlers,handlers会在所有常规任务完成后统一执行。

bash 复制代码
---
- name: Handlers
  hosts: test
  tasks:
    - name: nginx  # 任务名称
      template:    # 使用template模块
        src: nginx.conf.j2  # 源模板文件
        dest: /etc/nginx/nginx.conf  # 目标路径
        owner: root  # 文件属主
        group: root  # 文件属组
        mode: 0644   # 文件权限
      notify:        # 触发条件:当文件内容变化时
        - restart nginx  # 调用名为"restart nginx"的handler

  # Handlers定义(仅在notify触发时执行)
  handlers:
    # Handler1:重启Nginx服务
    - name: restart nginx  # handler名称(需与notify对应)
      service:             # 使用service模块
        name: nginx        # 服务名称
        state: restarted   # 操作类型:重启
        enabled: yes       # 设置开机自启
3.when条件判断

满足某些条件时才执行任务,多任务时使用and或者or进行连接,表达逻辑关系。

bash 复制代码
---
- name: test when
  hosts: test
  tasks:
    - name: modify /etc/motd
      copy: 
        src: motd
        dest: /etc/motd
      when: >   #多条件合并成1行
        ansible_distribution == "Rocky"
        and
        ansible_distribution_major_version == "8.6"
4.register注册变量

Ansible的register指令是捕获任务结果的核心机制,它能将命令输出和模块返回值存储为变量,用于后续任务的动态判断。该指令在实现幂等性操作和流程控制方面发挥着重要作用,常见应用场景包括服务状态检测、文件存在性校验以及API响应处理。使用时需注意结合when条件判断和debug模块,灵活调用注册变量中的数据。

bash 复制代码
---
- name: test register
  hosts: test
  ignore_errors: true
  tasks:
    - name: started nginx
      service:
        name: nginx
        state: started
      register: result
    - name: debug out
      debug:
        msg: "nginx started error"
      when: result.failed
4.block任务块

可以通过block关键字,将多个任务组合在一起。

rescue:block中的任务都执行成功则rescue中的任务不执行。

always:always中的任务总会执行。

bash 复制代码
---
- name: test block
  hosts: web
  tasks:
    block:
      - name: install nginx
        package:
          name: nginx
          state: present
        register: install_result
      - name: start nginx
        service:
          name: nginx
          state: started
          enabled: yes
        register: service_result
    rescue:
      - name: error
        debug:
          msg: "Nginx部署失败!安装状态码:{{ install_result.rc|default('未执行') }} 服务状态码:{{ service_result.rc|default('未执行') }}"
    always:
      - name: end
        debug:
          msg: "执行完毕"
5.loop循环

相当于Shell中的for循环,变量名固定为item。

bash 复制代码
---
- name: create users  # 描述此Playbook的主要功能
  hosts: web         # 目标主机组
  tasks:
    - name: test loop  # 任务名称
      user:           # 使用user模块管理用户账户
        name: "{{item.iname}}"  # 用户名:从循环变量获取
        password: "{{item.ipass|password_hash('sha512')}}"  # 密码:使用sha512加密
        state: present  # 确保用户存在
      loop:            # 循环结构:批量处理多个用户
        - {"iname":"one", "ipass":"123456"}  
        - {"iname":"two", "ipass":"654321"}   
相关推荐
m0_488777659 小时前
Kubernetes基础
云原生·容器·kubernetes·yaml
tyatyatya11 小时前
Ansible自动化配置,从入门到实战
运维·自动化·ansible
lbb 小魔仙2 天前
【Linux】Ansible 自动化运维实战:2000+ 节点配置标准化教程
linux·运维·ansible
扑火的小飞蛾4 天前
【Ansible学习笔记01】 批量执行 shell 命令
笔记·学习·ansible
oMcLin4 天前
如何在 Red Hat Linux 服务器上使用 Ansible 自动化部署并管理多节点 Hadoop 集群?
linux·服务器·ansible
linux修理工7 天前
vagrant ubuntu 22.04 ansible 配置
ubuntu·ansible·vagrant
biubiubiu07068 天前
Ansible自动化
运维·自动化·ansible
秋4279 天前
ansible配置与模块介绍
ansible
秋4279 天前
ansible剧本
linux·服务器·ansible
码农101号10 天前
Ansible - Role介绍 和 使用playbook部署wordPress
android·ansible