Ansible---Playbook剧本

慈云数据 6个月前 (05-13) 技术支持 88 0

文章目录

  • Playbook
    • 案例1 Playbook剧本基本用法
    • 案例2 Playbook剧本定义、引用变量
    • 案例3.when条件判断
    • 迭代
    • 剧本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剧本基本用法

      vim test1.yaml
      

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

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

      ---
      # 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剧本定义、引用变量

      vars:                 #定义变量
      格式  key: value
      

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

      ---
      ---
      # 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 可以让满足条件的主机执行命令,如下

      ---
      ---
      ---
      - 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 循环。

      例如

      ---
      - 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//tasks:包含主任务列表。
      • roles//handlers:包含处理程序,通常用于重启服务或执行其他操作。
      • roles//vars:包含角色级别的变量。
      • roles//defaults:包含角色的默认变量。
      • roles//meta:包含角色的依赖关系和其他元数据。
      • roles//templates:包含 Jinja2 模板文件。
      • roles//files:包含静态文件,如配置文件或脚本。
      • roles//templates:包含 Jinja2 模板文件。
      • roles//tasks/main.yml:主任务文件,通常会 include 其他任务文件。

        下面我将使用Roles模块创建一个LAMP用于展示

        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模块

        vim /opt/roles/httpd/tasks/main.yml
        

        在这里插入图片描述

        ---
        - name: install apache
          yum:
            name: "{{fw}}"
        - name: start apache
          service:
            name: "{{fwkg}}"
            enabled: true
            state: started
        
        vim /opt/roles/httpd/vars/main.yml
        
        fw: httpd
        fwkg: httpd
        

        在这里插入图片描述

        编写mysql模块

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

        在这里插入图片描述

        vim /opt/roles/mysql/vars/main.yml
        
        fw:
          - mariadb
          - mariadb-server
        fwgl: mariadb
        

        在这里插入图片描述

        编写php模块

        vim /opt/roles/php/tasks/main.yml
        
        - name: 安装PHP
          yum:
            name: "{{fw}}"
        - name: 启动PHP
          service:
            name: "{{fwgl}}"
            state: started
            enabled: true
        

        在这里插入图片描述

        vim /opt/roles/php/vars/main.yml
        
        fw: php
        wfgl: php
        

        在这里插入图片描述

        编写roles

        vim /opt/site.yml
        
        ---
        - hosts: web1
          roles:
           - httpd
           - mysql
           - php
        

        启动剧本

        ansible-playbook site.yml
        

        在这里插入图片描述

微信扫一扫加客服

微信扫一扫加客服

点击启动AI问答
Draggable Icon