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 天前
自动化工具ansible,以及playbook剧本
运维·自动化·ansible
IT乌鸦坐飞机1 天前
ansible部署数据库服务随机启动并创建用户和设置用户有完全权限
数据库·ansible·centos7
遇见火星14 天前
如何使用Ansible一键部署MinIO集群?
ansible
粥周粥14 天前
ANSIBLE
ansible
码农101号14 天前
Linux中ansible模块补充和playbook讲解
linux·运维·ansible
码农101号14 天前
Linux的Ansible软件基础使用讲解和ssh远程连接
ansible
烟雨书信16 天前
ANSIBLE运维自动化管理端部署
运维·自动化·ansible
碎碎-li16 天前
ANSIBLE(运维自动化)
运维·自动化·ansible
@donshu@19 天前
Linux运维-ansible-python开发-获取inventroy信息
linux·运维·ansible
Kendra91922 天前
Ansible
ansible