Ansible---Playbook剧本

文章目录

  • Playbook
    • [案例1 Playbook剧本基本用法](#案例1 Playbook剧本基本用法)
    • [案例2 Playbook剧本定义、引用变量](#案例2 Playbook剧本定义、引用变量)
    • 案例3.when条件判断
    • 迭代
    • [剧本Roles 模块](#剧本Roles 模块)

Playbook

  1. Tasks:任务是 Playbooks 的核心,它们是 Playbook 中的一项指令,告诉 Ansible 在远程主机上执行什么操作。每个任务都调用一个 Ansible 模块,并传递参数来执行特定的动作,例如安装软件包、复制文件、启动服务或设置文件权限。
  2. Variables:变量允许您在 Playbook 中创建可重用的值,这些值可以在多个任务中使用,从而使您的 Playbook 更加灵活和可维护。变量可以是从简单字符串到复杂数据结构的任何内容,它们可以在 Playbook 中直接定义,也可以从外部文件或命令行参数中加载。
  3. Templates:模板是带有变量替换功能的文本文件,通常用于生成配置文件。Ansible 使用 Jinja2 模板引擎来处理模板文件,允许您在模板中插入变量和表达式,这些将在 playbook 运行时被替换为实际值。
  4. Handlers:处理器是当特定条件满足时触发的任务。通常,当任务报告状态为 "changed" 时,会通知一个或多个处理器。这通常用于重启服务或触发系统级操作,只有当实际发生变化时才需要执行这些操作。
  5. Roles:角色是一种组织 Playbook 的方法,它将变量、任务、模板、文件和处理器组合在一起,以便在多个 Playbook 之间重用。角色可以根据不同的环境或不同的服务器类型来组织任务,使得大型项目更加模块化和易于管理。

这些组件共同构成了 Ansible Playbook 的结构,使得 Ansible 成为自动化 IT 操作和应用程序部署的强大工具。通过组合这些组件,您可以创建复杂的自动化工作流程,以部署和配置您的应用程序和基础设施。

案例1 Playbook剧本基本用法

bash 复制代码
vim test1.yaml

在 YAML 格式中,缩进用于表示文档的结构和层次。YAML 文件中的缩进通常使用空格而不是制表符,并且每个层级的缩进应该是一致的。在 Ansible Playbook 中,通常每个缩进级别使用 2 个空格。

下面 playbook 示例中,- name: yum httpd 是一个 playbook 的开始,hosts: web1tasks:handlers: 都是与 - name: yum httpd 同一层级的键。tasks:handlers: 下的条目应该缩进 2 个空格,表示它们是 taskshandlers 的子项。确保了每个层级都有正确的缩进:

perl 复制代码
---
# Playbook 名称
- name: yum httpd
  hosts: web1
  tasks:
    - name: Stop firewalld service  # 停止 firewalld 服务
      service:
        name: firewalld
        state: stopped
    - name: sete***=0  # 设置 SELinux 为 permissive 模式
      shell:
        setenforce 0
    - name: an_zhuang_httpd  # 使用 yum 模块安装 httpd 包
      yum:
        name: httpd
    - name: gei_httpd_pei_zi  # 获取 httpd 配置文件
      copy:
        src: /opt/httpd.conf
        dest: /etc/httpd/conf/httpd.conf
      notify: "restart httpd"  # 当任务完成时,通知重启 httpd 服务
    - name: start httpd  # 启动 httpd 服务
      service:
        name: httpd
        state: started
        enabled: true
  handlers:
    - name: restart httpd  # 当任务完成时,重启 httpd 服务
      service:
        name: httpd
        state: restarted

注我httpd的配置文件将端口号改为8080了

playbook命令

ansible-playbook test1.yaml --syntax-check 检查yaml文件的语法是否正确

ansible-playbook test1.yaml --list-task 检查tasks任务

ansible-playbook test1.yaml --list-hosts 检查生效的主机

ansible-playbook test1.yaml --start-at-task='install httpd' 指定从某个task开始运行

案例2 Playbook剧本定义、引用变量

perl 复制代码
vars:                 #定义变量
格式  key: value

将案例1的httpd软件安装定义成变量的模式如下,将httpd改成了nginx

bash 复制代码
---
---
# Playbook 名称
- name: yum httpd
  hosts: web1
  vars:
    - sname: nginx  # 定义一个变量 sname,其值为 nginx
  tasks:
    - name: Stop firewalld service  # 停止 firewalld 服务
      service:
        name: firewalld
        state: stopped
    - name: sete***=0  # 设置 SELinux 为 permissive 模式
      shell:
        setenforce 0
    - name: yum install epel-release  # 安装 epel-release 包
      yum:
        name: epel-release
    - name: an_zhuang_{{sname}}  # 使用 yum 模块安装 {{sname}} 包
      yum:
        name: "{{sname}}"
#    - name: gei_httpd_pei_zi  
#      copy:
#        src: /opt/httpd.conf
#        dest: /etc/httpd/conf/httpd.conf
      notify: "restart {{sname}}"  # 当任务完成时,通知重启 {{sname}} 服务
    - name: start {{sname}}  # 启动 {{sname}} 服务
      service:
        name: "{{sname}}"
        state: started
        enabled: true
  handlers:
    - name: restart {{sname}}  # 当任务完成时,重启 {{sname}} 服务
      service:
        name: "{{sname}}"
        state: restarted

案例3.when条件判断

使用when 可以让满足条件的主机执行命令,如下

perl 复制代码
---
---
---
- name: Create test1 file on remote host
  hosts: web1
  tasks:
    - name: Create test1 file
      file:
        path: /opt/test1
        state: touch
      when: ansible_default_ipv4.address == "192.168.20.10"

  	

这会让IP地址为192.168.20.10地址的主机在opt目录下创建一个test1文件

192.168.20.10的主机上创建了一个test1文件

迭代

一种循环结构,类似于loop

Ansible 中的迭代结构是 with_items,它允许您遍历一个列表、字典或字符串,并在每个迭代中执行一个任务。这相当于 Python 中的 for 循环。
例如

perl 复制代码
---
- name: 在opt目录上创建mydir目录,并且在mydir目录下创建myfile.txt文件
  hosts: web1
  tasks:
    - name: 创建目录和文件
      file:
        path: "{{item.path}}"
        state: "{{item.state}}"
      with_items:
        - { path: '/opt/mydir', state: 'directory' }
        - { path: '/opt/mydir/myfile.txt', state: 'touch' }

剧本Roles 模块

在 Ansible 中,角色(roles)是一种用于组织 playbook 的方法,它允许您将任务的集合、变量、处理器(handlers)和文件等组织成独立的、可重用的组件。roles 非常适合于构建和配置服务,尤其是当您需要在不同主机上重复执行相同的配置时。

一个 role 通常包含以下目录结构:

  • roles/<role_name>/tasks:包含主任务列表。
  • roles/<role_name>/handlers:包含处理程序,通常用于重启服务或执行其他操作。
  • roles/<role_name>/vars:包含角色级别的变量。
  • roles/<role_name>/defaults:包含角色的默认变量。
  • roles/<role_name>/meta:包含角色的依赖关系和其他元数据。
  • roles/<role_name>/templates:包含 Jinja2 模板文件。
  • roles/<role_name>/files:包含静态文件,如配置文件或脚本。
  • roles/<role_name>/templates:包含 Jinja2 模板文件。
  • roles/<role_name>/tasks/main.yml:主任务文件,通常会 include 其他任务文件。
    下面我将使用Roles模块创建一个LAMP用于展示
bash 复制代码
mkdir -p /opt/roles/httpd/{files,templates,tasks,handlers,vars,defaults,meta} 
mkdir -p /opt/roles/mysql/{files,templates,tasks,handlers,vars,defaults,meta} 
mkdir -p /opt/roles/php/{files,templates,tasks,handlers,vars,defaults,meta} 


编写httpd模块

bash 复制代码
vim /opt/roles/httpd/tasks/main.yml
perl 复制代码
---
- name: install apache
  yum:
    name: "{{fw}}"
- name: start apache
  service:
    name: "{{fwkg}}"
    enabled: true
    state: started
bash 复制代码
vim /opt/roles/httpd/vars/main.yml
perl 复制代码
fw: httpd
fwkg: httpd


编写mysql模块

bash 复制代码
vim /opt/roles/mysql/tasks/main.yml
bash 复制代码
- name: "安装拓展源"
  yum:
    name: epel-release
- name: "安装Mysql数据库"
  yum:
    name: "{{fw}}"
- name: "启动数据库"
  service:
    name: "{{fwgl}}"
    state: started
    enabled: true
bash 复制代码
vim /opt/roles/mysql/vars/main.yml
perl 复制代码
fw:
  - mariadb
  - mariadb-server
fwgl: mariadb


编写php模块

bash 复制代码
vim /opt/roles/php/tasks/main.yml
perl 复制代码
- name: 安装PHP
  yum:
    name: "{{fw}}"
- name: 启动PHP
  service:
    name: "{{fwgl}}"
    state: started
    enabled: true
bash 复制代码
vim /opt/roles/php/vars/main.yml
perl 复制代码
fw: php
wfgl: php


编写roles

bash 复制代码
vim /opt/site.yml
perl 复制代码
---
- hosts: web1
  roles:
   - httpd
   - mysql
   - php

启动剧本

bash 复制代码
ansible-playbook site.yml
相关推荐
紫晓宁1 天前
jmeter结合ansible分布式压测--3压测执行
分布式·jmeter·ansible
紫晓宁2 天前
jmeter结合ansible分布式压测--1数据准备
分布式·jmeter·ansible
紫晓宁2 天前
jmeter结合ansible分布式压测--2jmter环境准备
分布式·jmeter·ansible
SG.xf6 天前
ansible中的任务执行控制
ansible
赶紧回家去8 天前
Ansible基本使用
运维·ansible
我就是全世界9 天前
ansible详细介绍和具体步骤
ansible
福大大架构师每日一题9 天前
27.9 调用go-ansible执行playbook拷贝json文件重载采集器
golang·json·ansible·prometheus
SG.xf9 天前
Ansible
运维·ansible
避凉闲庭9 天前
ansible开局配置-openEuler
linux·运维·ansible·脚本·openeuler·免密登录·批量化
运维小白。。12 天前
Ansible 批量部署
ansible