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"}   
相关推荐
KellenKellenHao7 小时前
Jenkins调用ansible部署lnmp
servlet·ansible·jenkins
帅帅梓18 小时前
ansible-角色
linux·运维·自动化·ansible
维尔切18 小时前
自动化运维-ansible中的条件判断
运维·自动化·ansible
半梦半醒*1 天前
ansible中配置并行以及包含和导入
linux·运维·ssh·ansible·负载均衡
Akshsjsjenjd1 天前
Ansible 核心功能:循环、过滤器、判断与错误处理全解析
java·数据库·ansible
CZZDg1 天前
部署jenkins并基于ansible部署Discuz应用
运维·ansible·jenkins
王富贵QAQ1 天前
Jenkins-Ansible部署discuz论坛
运维·ansible·jenkins
Akshsjsjenjd2 天前
Ansible 变量与加密文件全解析:从基础定义到安全实践
前端·安全·ansible
半梦半醒*2 天前
ansible判断
linux·运维·centos·ansible·运维开发