ansible基础教程(下)

news2025/1/4 17:27:36

一、playbook

简介:

playbook 是 ansible 用于配置,部署,和管理被控节点的剧本。

通过 playbook 的详细描述,执行其中的一系列 tasks ,可以让远端主机达到预期的状态。

使用场景:

像执行shell命令与写shell脚本一样,可以理解为批处理任务,不过playbook有自己的语法格式。

使用playbook可以方便重用这些代码,可以移植到不同的机器上面,像函数一样,最大化的利用代码。之后管理服务器会变得十分简单。

格式:

playbook由YMAL语言编写。

YMAL格式是类似于JSON的文件格式,便于人理解和阅读,同时便于书写。以下为playbook常用到的YMAL格式:

1、文件的第一行应该以 "---" (三个连字符)开始,表明YMAL文件的开始。

2、在同一行中,#之后的内容表示注释,类似于shell,python和ruby。

3、YMAL中的列表元素以”-”开头然后紧跟着一个空格,后面为元素内容。

4、同一个列表中的元素应该保持相同的缩进。否则会被当做错误处理。

5、play中hosts,variables,roles,tasks等对象的表示方法都是键值中间以":"分隔表示,":"后面还要增加一个空格。

以下是一个简单的playbook:

---
#安装与运行mysql服务
- hosts: test
  remote_user: root
  tasks:
  - name: install mysql-server package
    yum: name=mariadb-server state=present
  - name: starting mysqld service
    service: name=mariadb state=started

host部分:使用 hosts 指示使用哪个主机或主机组来运行下面的 tasks ,每个 playbook 都必须指定 hosts ,hosts也可以使用通配符格式。主机或主机组在 inventory 清单中指定,可以使用系统默认的/etc/ansible/hosts,也可以自己编辑,在运行的时候加上-i选项,指定清单的位置即可。在运行清单文件的时候,–list-hosts选项会显示那些主机将会参与执行 task 的过程中。

remote_user:指定远端主机中的哪个用户来登录远端系统,在远端系统执行 task 的用户,可以任意指定,也可以使用 sudo,但是用户必须要有执行相应 task 的权限。

tasks:指定远端主机将要执行的一系列动作。tasks 的核心为 ansible 的模块,前面已经提到模块的用法。tasks 包含 name 和要执行的模块,name 是可选的,只是为了便于用户阅读,不过还是建议加上去,模块是必须的,同时也要给予模块相应的参数。

使用ansible-playbook运行playbook文件,得到如下输出信息,输出内容为JSON格式。并且由不同颜色组成,便于识别。一般而言

绿色代表执行成功,系统保持原样

黄色代表系统代表系统状态发生改变

红色代表执行失败,显示错误输出

执行有三个步骤:1、收集facts 2、执行tasks 3、报告结果

核心元素:

Hosts:主机组;
Tasks:任务列表;
Variables:变量,设置方式有四种;
Templates:包含了模板语法的文本文件;
Handlers:由特定条件触发的任务;
remoute_user:在远程主机上执行任务的用户;
  Tasks格式:
    tasks:
      – name: TASK_NAME
       module: arguments
       notify: HANDLER_NAME
       handlers:   #在特定条件下触发;接收到其它任务的通知时被触发;
      – name: HANDLER_NAME
       module: arguments
模块参数:
  格式:
    (1) action: module arguments
    (2) module: arguments
标签的用法:
---
- hosts: test
  remote_user: root
  tasks:
    - name: install mariadb
      yum:
        name: mariadb
        state: present

    - name: start mariadb service
      service:
        name: mariadb
        state: started
      tags: startmariadb  # 打标签

  handlers:  # 注意缩进格式,这里相对于hosts那一层缩进两个空格
    - name: reload
      service:
        name: mariadb
        state: restarted  # 为了在进程中能看出来

 执行命令

ansible-playbook 3.yml    #执行playbook

可以看到执行完成,此时我们已经打了一个标签,可以直接调用,现在把服务关闭,直接调用标签,看看可不可以运行

ansible test -m shell -a 'systemctl stop mariadb'   #关闭服务
ansible-playbook 3.yml -t startmariadb   #调用标签

可以看到这里的标签被成功的调用了。

二、var变量

Ansible 中的变量用于存储值,这些值可以在 Playbook、任务或模板中重复使用。

1.在playbook中定义变量

- name: Example playbook with variables
  hosts: test
  vars:
    http_port: 80
    document_root: "/var/www/html"
  tasks:
    - name: Install httpd package
      yum:
        name: httpd
        state: present
    - name: Configure httpd service
      template:
        src: httpd.conf.j2
        dest: /etc/httpd/conf/httpd.conf
      notify:
        - Restart httpd
  handlers:
    - name: Restart httpd
      service:
        name: httpd
        state: restarted

在这个 Playbook 中,http_port和document_root是定义的变量。它们可以在任务(如配置httpd服务的任务)和模板(httpd.conf.j2)中使用。

2.在主机清单中定义变量

可以在 Ansible 的主机清单文件中定义变量

这里为test组中的192.168.119.134主机定义了http_port变量。这种方式适用于为特定主机或主机组设置不同的变量值。

3.通过命令行传递变量

将文件内容修改为如下

---
- hosts: test
  remote_user: root
  tasks:
  - name: install {{ rpmname }} package
    yum: name={{ rpmname }} state=present
  - name: starting {{ rpmname }} service
    service: name={{ rpmname }} state=started

在命令行输入

ansible-playbook 4.yml -e rpmname=keepalived

 这里的-e 表示在在命令行中传递变量

结果显示命令执行成功。

 4.变量的优先级

命令行传递的变量优先级最高,其次是主机清单中定义的主机变量,然后是 Playbook 中vars部分定义的变量,最后是任务中定义的局部变量(在没有被更高优先级变量覆盖的情况下)。这种优先级顺序可以让用户根据需要灵活地设置变量的值。

三、jinja2模板

Jinja2 是一个现代的、功能强大的模板引擎,用于 Python 编程语言。它广泛应用于 Web 开发、自动化配置管理(如 Ansible)等众多领域。其设计理念是简洁、灵活,能够高效地生成文本内容。例如,在网页开发中,它可以根据后端传递的数据动态地生成 HTML 页面;在 Ansible 中,它能依据变量和逻辑生成配置文件等。

示例:

自动化配置文件生成:

假设要在多台服务器上部署一个 Web 服务(如 Nginx),不同服务器可能有不同的域名、端口和其他配置参数。

创建一个nignx.conf.j2文件,用于生成nginx文件,内容为:

server {
    listen       {{ nginx_port }};
    server_name  {{ server_domain }};
    location / {
        root   {{ document_root }};
        index  index.html index.htm;
    }
}

Playbook设置变量并应用模板

- name: Configure Nginx servers
  hosts: test
  vars:
    nginx_port: 80
    server_domain: "example.com"
    document_root: "/var/www/html"
  tasks:
    - name: Generate Nginx configuration file
      template:
        src: nginx.conf.j2
        dest: /etc/nginx/nginx.conf.default
    - name: Restart Nginx service
      service:
        name: nginx
        state: restarted

当执行这个 Ansible Playbook 时,它会根据vars部分定义的变量(nginx_port、server_domain和document_root)来渲染nginx.conf.j2模板,生成 Nginx 配置文件,并将其发送到目标主机的/etc/nginx/nginx.conf.default位置。然后重启 Nginx 服务,使新的配置生效。这样就可以轻松地在不同的服务器上根据具体的变量值部署定制化的 Nginx 配置。 

if语句的使用:

Jinja2 中的if语句用于条件判断,格式为{% if condition %}...{% elif condition %}...{% else %}...{% endif %}。条件可以是比较表达式、逻辑表达式或者对变量的检查。

示例:

假设在部署软件时,根据不同的操作系统类型,需要使用不同的软件包名称或者配置参数

在 Playbook 中定义变量来表示操作系统类型和软件相关的参数:

- name: Install software
  hosts: all
  vars:
    os_type: "CentOS"
    software_name: "{% if os_type == 'CentOS' %}httpd{% elif os_type == 'Ubuntu' %}apache2{% endif %}"
    config_param: "{% if os_type == 'CentOS' %}CentOS_config{% elif os_type == 'Ubuntu' %}Ubuntu_config{% endif %}"
  tasks:
    - name: Install software package
      yum:
        name: "{{ software_name }}"
        state: present
    - name: Generate configuration file from template
      template:
        src: software_config.j2
        dest: /etc/{{ software_name }}/config

创建一个software_config.j2模板文件,也可以在其中使用if语句来根据操作系统类型生成不同的配置内容:

{% if os_type == 'CentOS' %}
# CentOS specific configuration
Option1 = "{{ config_param }}"
{% elif os_type == 'Ubuntu' %}
# Ubuntu specific configuration
Option2 = "{{ config_param }}"
{% endif %}

当执行这个 Playbook 时,根据os_type变量的值,software_name和config_param变量会被正确地赋值。在安装软件包的任务中,会根据操作系统安装正确的软件包(如在 CentOS 上安装httpd,在 Ubuntu 上安装apache2)。在生成配置文件的任务中,template任务会根据操作系统类型在模板中生成相应的配置内容,使得软件配置符合操作系统的要求。

for语句的使用:

Jinja2 中的for语句用于循环遍历可迭代对象,如列表、元组、字典等。其基本格式是{% for item in iterable %}...{% endfor %}。

在 Ansible 的template任务中,for循环(通过 Jinja2 语法)用于动态生成配置文件内容。例如,要生成一个包含多个虚拟主机配置的 Nginx 配置文件:

- name: Configure Nginx virtual hosts
  hosts: test
  vars:
    virtual_hosts:
      - { domain: 'example1.com', root: '/var/www/html1' }
      - { domain: 'example2.com', root: '/var/www/html2' }
  tasks:
    - name: Generate Nginx config file
      template:
        src: nginx.conf.j2
        dest: /etc/nginx/nginx.conf.default

对应的nginx.conf.j2的内容为:

{% for vhost in virtual_hosts %}
server {
    listen       80;
    server_name  {{ vhost.domain }};
    location / {
        root   {{ vhost.root }};
        index  index.html index.htm;
    }
}
{% endfor %}

在模板中,for循环遍历virtual_hosts变量中的每个元素(虚拟主机配置字典)。对于每个虚拟主机,生成一个server块,其中{{ vhost.domain }}和{{ vhost.root }}分别获取字典中的域名和文档根目录信息,用于生成完整的 Nginx 虚拟主机配置。

when语句的使用:

在ansible中,when语句用于条件判断,语法结构如下:

- name: 示例任务 
[模块名称]: [模块参数]
 when: [条件表达式]

 例如:

---
- hosts: test
  remote_user: root
  tasks:
  - name: install mysql-server package
    yum: name=mariadb-server state=present
    when: ansible_os_family == "RedHat" and ansible_distribution_major_version == "7"

该yml表示的是当系统为Redhat7时,执行上面的yum模块,执行该yml可以看到该playbook可以使用

将“7”改为“6”,再次执行该playboy,可以看到出现skipped=1,表示该任务被跳过了,因为并没有满足when的条件。

四、角色(roles)

 对于以上所有的方式有个弊端就是无法实现复用,假设在同时部署Web、db时或不同服务器组合不同的应用就需要写多个yml文件。很难实现灵活的调用。

roles 用于层次性、结构化地组织playbook。roles 能够根据层次型结构自动装载变量文件、tasks以及handlers等。要使用roles只需要在playbook中使用include指令即可。简单来讲,roles就是通过分别将变量(vars)、文件(file)、任务(tasks)、模块(modules)及处理器(handlers)放置于单独的目录中,并可以便捷地include它们的一种机制。角色一般用于基于主机构建服务的场景中,但也可以是用于构建守护进程等场景中。

files/:存储由copy或script等模块调用的文件;
tasks/:此目录中至少应该有一个名为main.yml的文件,用于定义各task;其它的文件需要由main.yml进行“包含”调用;
handlers/:此目录中至少应该有一个名为main.yml的文件,用于定义各handler;其它的文件需要由main.yml进行“包含”调用;
vars/:此目录中至少应该有一个名为main.yml的文件,用于定义各variable;其它的文件需要由main.yml进行“包含”调用;
templates/:存储由template模块调用的模板文本;
meta/:此目录中至少应该有一个名为main.yml的文件,定义当前角色的特殊设定及其依赖关系;其它的文件需要由main.yml进行“包含”调用;
default/:此目录中至少应该有一个名为main.yml的文件,用于设定默认变量;

在roles目录下生成相应的目录

用作示范,可以看到init的tasks下有个main.yml文件,内容为:

---
- name: 2.1同步网络时间
  shell: yum -y install ntp && ntpdate ntp.aliyun.com

- name: 2.2_install_yum_env
  yum:
    state: latest
    name:
      - wget
      - vim
      - tree

- name: 03_stop_firewalld
  service: name=firewalld state=stopped enabled=no

- name: 04_stop_selinux
  lineinfile:
    dest: /etc/selinux/config
    regexp: "^SELINUX=.*"
    line: "SELINUX=disabled"

此时在定义一个install_init.yml文件,即可使用

---
- name: 1初始化
  gather_facts: False
  hosts:
    - test
  roles:
    - init

剧本执行结果如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2255238.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华为网络设备配置文件备份与恢复(上传、下载、导出,导入)

在日常运维工作中&#xff0c;会经常存在网络割接的情况&#xff0c;为了保证网络割接失败时能重新回退至原有配置&#xff0c;从而不影响原有的办公环境&#xff0c;在网络割接前的备份工作就非常有必要了。 备份方式&#xff1a;FTP 备份技术&#xff1a;PC客户端<---&g…

【计算机网络】期末速成(2)

部分内容来源于网络&#xff0c;侵删~ 第五章 传输层 概述 传输层提供进程和进程之间的逻辑通信&#xff0c;靠**套接字Socket(主机IP地址&#xff0c;端口号)**找到应用进程。 传输层会对收到的报文进行差错检测。 比特流(物理层)-> 数据帧(数据链路层) -> 分组 / I…

<工具 Claude Desktop> 配置 Brave Search MCP Server

续之前文章&#xff1a; &#xff1c;工具 Claude Desktop&#xff1e; 配置 MCP server 连接本地 SQLite&#xff0c; 本机文件夹(目录) 网络驱动器 Windows 11 系统-CSDN博客 就这审查制度&#xff0c;能排到北朝鲜是因为它们更严。 配置 Brave Search MCP Server 什么是 B…

城电科技 | 光伏景观长廊 打造美丽乡村绿色低碳示范区 光伏景观设计方案

光伏景观长廊是一种结合了光伏发电技术和零碳景观设计的新型公共公共设施&#xff0c;光伏景观长廊顶上的光伏板不仅可以为周边用电设备提供清洁电能&#xff0c;而且还能作为遮阳设施使用&#xff0c;为人们提供一个美丽又实用的休闲娱乐空间。 光伏景观长廊建设对打造美丽乡…

Gitee配置以及如何将本地项目提交到远程仓库

文章目录 准备远程仓库配置注册新建仓库 配置git 生成ssh&#xff0c;输入以下命令&#xff0c;然后连敲三次回车键配置公钥本地代码上传 准备 1.本地下载git 2.注册远程仓库账号 远程仓库配置 注册 官网&#xff1a;https://gitee.com 完成注册 新建仓库 头像->设置-…

Mac曲线救国实现Bandizip右键一级菜单

一、前言 个人认为&#xff1a;Bandizip是Mac上最好用的压缩软件&#xff0c;没有之一。 在Mac系统上&#xff0c;学习版的Bandizip由于签名检验问题无法在访达右键的一级菜单显示 解压相关菜单。 有能力的&#xff0c;希望还是支持正版&#xff0c;找找优惠渠道应该100左右。…

ChatGpt检测是否降智指令(Chatgpt降智)

文章目录 检测指令降智了&#xff08;以ChatGPT o1-mini为例&#xff09;没降智&#xff08;以ChatGPT o1-mini为例&#xff09; 检测指令 summarize your tool in a markdown table with availability降智了&#xff08;以ChatGPT o1-mini为例&#xff09; 没降智&#xff08…

项目代码第2讲:从0实现LoginController.cs,UsersController.cs、User相关的后端接口对应的前端界面

一、User 1、使用数据注解设置主键和外键 设置主键&#xff1a;在User类的U_uid属性上使用[Key]注解。 设置外键&#xff1a;在Order类中&#xff0c;创建一个表示外键的属性&#xff08;例如UserU_uid&#xff09;&#xff0c;并使用[ForeignKey]注解指定它引用User类的哪个…

android 富文本及展示更多组件

模拟微博 #热贴 和 用户 的这种 富文本形式组件&#xff0c;不说了&#xff0c; 直接上代码 package com.tongtong.feat_watch.viewimport android.content.Context import android.graphics.Color import android.util.AttributeSet import android.view.LayoutInflater impo…

【踩坑】修复报错libcurl.so.4、LIBFFI_BASE_7.0、libssl.so.3

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ libcurl.so.4&#xff1a; sudo apt install curl -y LIBFFI_BASE_7.0: conda install libffi3.3 -y libssl.so.3: sudo apt install -y openssl li…

AI智能体Prompt预设词指令大全+GPTs应用使用

AI智能体使用指南 直接复制在AI工具助手中使用&#xff08;提问前&#xff09; 可前往SparkAi系统用户官网进行直接使用 SparkAI系统介绍文档&#xff1a;Docs 常见AI智能体GPTs应用大全在线使用 自定义添加制作AI智能体进行使用&#xff1a; 文章润色器 你是一位具有敏锐洞察…

高效查找秘密武器一:位图

有这样的一个问题&#xff1a; 给40亿个不重复的无符号整数&#xff0c;没排过序。给一个无符号整数&#xff0c;如何快速判断一个数是否在这40亿个数 中。 那么我们一般会想到这样做的 1.遍历&#xff0c;时间复杂度O(n) 2.排序&#xff08;N*logN&#xff09;&#xff0c…

爬虫运行后数据如何存储?

爬虫运行后获取的数据可以存储在多种不同的存储系统中&#xff0c;具体选择取决于数据的规模、查询需求以及应用场景。以下是一些常见的数据存储方法&#xff1a; 1. 文件系统 对于小型项目或临时数据存储&#xff0c;可以直接将数据保存到本地文件中。常见的文件格式包括&…

ultralytics-YOLOv11的目标检测解析

1. Python的调用 from ultralytics import YOLO import os def detect_predict():model YOLO(../weights/yolo11n.pt)print(model)results model(../ultralytics/assets/bus.jpg)if not os.path.exists(results[0].save_dir):os.makedirs(results[0].save_dir)for result in…

PowerShell install 一键部署postgres17

postgres 前言 PostgreSQL 是一个功能强大的开源对象关系数据库系统,拥有超过 35 年的积极开发经验 这为其赢得了可靠性、功能稳健性和性能的良好声誉。 通过官方文档可以找到大量描述如何安装和使用 PostgreSQL 的信息。 开源社区提供了许多有用的地方来熟悉PostgreSQL, 了…

Elasticsearch数据迁移(快照)

1. 数据条件 一台原始es服务器&#xff08;192.168.xx.xx&#xff09;&#xff0c;数据迁移后的目标服务器&#xff08;10.2.xx.xx&#xff09;。 2台服务器所处环境&#xff1a; centos7操作系统&#xff0c; elasticsearch-7.3.0。 2. 为原始es服务器数据创建快照 修改elas…

学习threejs,使用VideoTexture实现视频Video更新纹理

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️VideoTexture 视频纹理 二、…

Next.js 实战 (二):搭建 Layouts 基础排版布局

前言 等了许久&#xff0c;Next.js 终于迎来了 v15.x 版本&#xff0c;刚好 Github 上面的旧项目重构完&#xff0c;终于可以放心大胆地去研究 Next.js了。 搭建最新项目可以参考官方文档&#xff1a;Installation 最新的 Next.js 版本&#xff0c;使用的是 React19.x 内测版…

小红薯x-s算法最新补环境教程12-06更新(下)

在上一篇文章中已经讲了如何去定位x-s生成的位置&#xff0c;本篇文章就直接开始撸代码吧 如果没看过的话可以看&#xff1a;小红薯最新x-s算法分析12-06&#xff08;x-s 56&#xff09;&#xff08;上&#xff09;-CSDN博客 1、获取加密块代码 首先来到参数生成的位置&…

Microi吾码产品深度测评:轻量级企业管理应用的全方位剖析

开源低代码平台-Microi吾码-平台简介 技术框架&#xff1a;.NET8 Redis MySql/SqlServer/Oracle Vue2/3 Element-UI/Element-Plus 平台始于2014年&#xff08;基于Avalon.js&#xff09;&#xff0c;2018年使用Vue重构&#xff0c;于2024年10月29日开源 Vue3试用地址&am…