ansible的剧本(playbook)

news2024/9/20 18:42:37

一、playbooks 概述以及实例操作

1、playbooks 的组成

playbooks 本身由以下各部分组成

(1)Tasks:任务,即通过 task 调用 ansible 的模板将多个操作组织在一个 playbook 中运行

(2)Variables:变量

(3)Templates:模板

(4)Handlers:处理器,当changed状态条件满足时,(notify)触发执行的操作

(5)Roles:角色

2、操作示例一:

2.1 编写yaml文件也就是playbook

vim test1.yaml
---                                                                    #yaml文件以---开头,以表明这是一个yaml文件,可省略
   - name: first play                                                     #定义一个play的名称,可省略
     gather_facts: false                                                    #设置不进行facts信息收集,这可以加快执行速度,可省略
     hosts: webservers                                                      #指定要执行任务的被管理主机组,如多个主机组用冒号分隔
     remote_user: root                                                      #指定被管理主机上执行任务的用户
     tasks:                                                                 #定义任务列表,任务列表中的各任务按次序逐个在hosts中指定的主机上执行
     - name: test connection                                                # 自定义任务名称
       ping:                                                                  #使用 module: [options] 格式来定义一个任务
     - name: disable selinux
       command: '/sbin/setenforce 0'                                           #command模块和shell模块无需使用key=value格式
       ignore_errors: True                                                     #如执行命令的返回值不为0,就会报错,tasks停止,可使用ignore_errors忽略失败的任务
     - name: disable firewalld
       service: name=firewalld state=stopped                                   #使用 module: options 格式来定义任务,option使用key=value格式
     - name: install httpd
       yum: name=httpd state=latest
     - name: install configuration file for httpd
       copy: src=/opt/httpd.conf dest=/etc/httpd/conf/httpd.conf               #这里需要一个事先准备好的/opt/httpd.conf文件
       notify: "restart httpd"                                                 #如以上操作后为changed的状态时,会通过notify指定的名称触发对应名称的handlers操作
     - name: start httpd service
       service: enabled=true name=httpd state=started
     handlers:                                                               #handlers中定义的就是任务,此处handlers中的任务使用的是service模块
     - name: restart httpd                                                   #notify和handlers中任务的名称必须一致
       service: name=httpd state=restarted
1
##Ansible在执行完某个任务之后并不会立即去执行对应的handler,而是在当前play中所有普通任务都执行完后再去执行handler,这样的好处是可以多次触发notify,但最后只执行一次对应的handler,从而避免多次重启。

2.2 修改配置文件并放入/opt/目录下

vim httpd.conf         #在/opt/目录下放入修改之后的配置文件
  
#42行,指定端口
Listen 8080
#95行,指定域名
ServerName www.ly.com:8080 

2.3 运行playbook

ansible-playbook test1.yaml
//补充参数:
-k(–ask-pass):用来交互输入ssh密码
-K(-ask-become-pass):用来交互输入sudo密码
-u:指定用户
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'        #从指定任务开始运行

3、操作实例二:定义、引用变量

- name: second play
  hosts: dbservers
  remote_user: root
  vars:                                                                        #定义变量
    - groupname: mysql                                                         #格式为 key: value
    - username: nginx
  tasks:
    - name: create group
      group: name={{groupname}} system=yes gid=306                               #使用 {{key}} 引用变量的值
    - name: create user
      user: name={{username}} uid=306 group={{groupname}}
    - name: copy file
      copy: content="{{ansible_default_ipv4}}" dest=/opt/vars.txt                  #在setup模块中可以获取facts变量信息
 
 
ansible-playbook test2.yaml -e "username=nginx"   

4、操作示例三:指定远程主机sudo切换用户

---
- hosts: dbservers
remote_user: zhangsan
become: yes #2.6版本以后的参数,之前是sudo,意思为切换用户运行
become_user: root #指定sudo用户为root
执行playbook时:ansible-playbook test3.yml -K <密码> 

5、操作示例四:when条件判断

在Ansible中,提供的唯一一个通用的条件判断是when指令,当when指令的值为true时,则该任务执行,否则不执行该任务。

//when一个比较常见的应用场景是实现跳过某个主机不执行任务或者只有满足条件的主机执行任务

vim test4.yaml
---
- hosts: all
  remote_user: root
  tasks:
  - name: shutdown host
    command: /sbin/shutdown -r now
    when: ansible_default_ipv4.address == "192.168.229.80" #when指令中的变量名不需要手动加上 {{}}
    或
    when: inventory_hostname == "<主机名>"
 
ansible-playbook test4.yaml


 

6、操作示例:五:迭代

Ansible提供了很多种循环结构,一般都命名为with_items,作用等同于 loop 循环。

vim test5.yaml
---
- name: play5
  hosts: dbservers
  gather_facts: false
  tasks:
    - name: create directories      ##创建目录。目录名使用with_items里的循环
      file:
        path: "{{item}}"              ##由于值是{{....}} ,所以为了防止被认为是字典,要加上双引号.
        state: directory
      with_items:                   #等同于 loop:
        - /tmp/test1
        - /tmp/test2
   - name: add users                ###使用循环创建用户,并添加附加组
     user: name={{item.name}} state=present groups={{item.groups}}
     with_items:
        - name: test1
          groups: wheel
        - name: test2
          groups: root
     或
     with_items:
       - {name:'test1', groups:'wheel'}
       - {name:'test2', groups:'root'}
 
ansible-playbook test5.yaml

二、playbook的模块

1、Templates 模块

Jinja是基于Python的模板引擎。Template类是Jinja的一个重要组件,可以看作是一个编译过的模板文件,用来产生目标文本,传递Python的变量给模板去替换模板中的标记。

1.1.先准备一个以 .j2 为后缀的 template 模板文件,设置引用的变量

cp /etc/httpd/conf/httpd.conf /opt/httpd.conf.j2
 
vim /opt/httpd.conf.j2
Listen {{http_port}}            #42行,修改
ServerName {{server_name}}  #95行,修改
DocumentRoot "{{root_dir}}"     #119行,修改 <Directory "{{root_dir}}">     #131修改 配置目录访问权限


  

1.2.修改主机清单文件,使用主机变量定义一个变量名相同,而值不同的变量

vim /etc/ansible/hosts
[webservers]
192.168.2.200 http_port=192.168.2.200:80 server_name=www.xkq.com:80 root_dir=/etc/httpd/htdocs
 
[dbservers]
192.168.2.77 http_port=192.168.2.77:80 server_name=www.wy.com:80 root_dir=/etc/httpd/htdocs

1.3.编写 playbook

vim apache.yaml
---
- hosts: all
  remote_user: root
  vars:
   - package: httpd
   - service: httpd
  tasks:
  - name: install httpd package
    yum: name={{package}} state=latest
  - name: install configure file
    template: src=/opt/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf #使用template模板
    notify:
      - restart httpd
  - name: create root dir
    file: path=/etc/httpd/htdocs state=directory
  - name: start httpd server
    service: name={{service}} enabled=true state=started
 handlers:
  - name: restart httpd
    service: name={{service}} state=restarted
 
ansible-playbook apache.yaml

1.4 制作测试网页

ansible 192.168.2.200 -m shell -a "echo 'this is xkq' > /etc/httpd/htdocs/index.html"   #制作网页测试文件
 
ansible 192.168.2.77 -m shell -a "echo 'this is wy' > /etc/httpd/htdocs/index.html"
curl http://192.168.2.200   #登录访问查看


 

2、tags 模块

可以在一个playbook中为某个或某些任务定义“标签”,在执行此playbook时通过ansible-playbook命令使用--tags选项能实现仅运行指定的tasks。
playbook还提供了一个特殊的tags为always。作用就是当使用always当tags的task时,无论执行哪一个tags时,定义有always的tags都会执行。

vim webhosts.yaml
---
- hosts: webservers
  remote_user: root
  tasks:
   - name: Copy hosts file
     copy: src=/etc/hosts dest=/opt/hosts
     tags:
       - only                                                        #可自定义
   - name: touch file
     file: path=/opt/testhost state=touch
     tags:
       - always                                                      #表示始终要运行的代码
 
ansible-playbook webhosts.yaml --tags="only"
 

3、Roles 模块

Ansible为了层次化、结构化地组织Playbook,使用了角色(roles),roles可以根据层次型结构自动装载变量文件、task以及handlers等。简单来讲,roles就是通过分别将变量、文件、任务、模块及处理器放置于单独的目录中,并可以便捷地include它们。roles一般用于基于主机构建服务的场景中,但也可以用于构建守护进程等场景中。

3.1 roles 的目录结构:

cd /etc/ansible/
tree roles/
roles/
├── web/
│ ├── files/
│ ├── templates/
│ ├── tasks/
│ ├── handlers/
│ ├── vars/
│ ├── defaults/
│ └── meta/
└── db/
├── files/
├── templates/
├── tasks/
├── handlers/
├── vars/
├── defaults/
└── meta/  

3.2 roles 内各目录含义解释

●files
用来存放由 copy 模块或 script 模块调用的文件。

●templates
用来存放 jinjia2 模板,template 模块会自动在此目录中寻找 jinjia2 模板文件。

●tasks
此目录应当包含一个 main.yml 文件,用于定义此角色的任务列表,此文件可以使用 include 包含其它的位于此目录的 task 文件。

●handlers
此目录应当包含一个 main.yml 文件,用于定义此角色中触发条件时执行的动作。

●vars
此目录应当包含一个 main.yml 文件,用于定义此角色用到的变量。

●defaults
此目录应当包含一个 main.yml 文件,用于为当前角色设定默认变量。

●meta
此目录应当包含一个 main.yml 文件,用于定义此角色的特殊设定及其依赖关系。

3.3 在一个 playbook 中使用 roles 的步骤:

(1)创建以 roles 命名的目录

mkdir /etc/ansible/roles/ -p        #yum装完默认就有

(2)创建全局变量目录(可选)

mkdir /etc/ansible/group_vars/ -p
touch /etc/ansible/group_vars/lnmp     #文件名自己定义,引用的时候注意

(3)在 roles 目录中分别创建以各角色名称命令的目录,如 nginx、mysql、php

mkdir /etc/ansible/roles/nginx
mkdir /etc/ansible/roles/mysql
mkdir /etc/ansible/roles/php


  

(4)在每个角色命令的目录中分别创建files、handlers、tasks、templates、meta、defaults和vars目录,用不到的目录可以创建为空目录,也可以不创建

mkdir /etc/ansible/roles/nginx/{files,templates,tasks,handlers,vars,defaults,meta}
mkdir /etc/ansible/roles/mysql/{files,templates,tasks,handlers,vars,defaults,meta}
mkdir /etc/ansible/roles/php/{files,templates,tasks,handlers,vars,defaults,meta}


  

(5)在每个角色的 handlers、tasks、meta、defaults、vars 目录下创建 main.yml 文件,千万不能自定义文件名

touch /etc/ansible/roles/nginx/{defaults,vars,tasks,meta,handlers}/main.yml
touch /etc/ansible/roles/mysql/{defaults,vars,tasks,meta,handlers}/main.yml
touch /etc/ansible/roles/php/{defaults,vars,tasks,meta,handlers}/main.yml


  

(6)修改 site.yml 文件,针对不同主机去调用不同的角色

vim /etc/ansible/site.yml
---
- hosts: webservers
  remote_user: root
  roles:
    - nginx
    - mysql
    - php

(7)运行 ansible-playbook

cd /etc/ansible
ansible-playbook site.yml

三、roles在LNMP中的应用

接上文实验步骤

1、编写nginx模块

写一个简单的tasks/main.yml

vim /etc/ansible/roles/nginx/tasks/main.yml
- name: install nginx
  yum: name={{pkg}} state=latest
- name: start
  service: enabled=true name={{svc}} state=started

//定义变量:可以定义在全局变量中,也可以定义在roles角色变量中,一般定义在角色变量中

vim /etc/ansible/roles/nginx/vars/main.yml
pkg: nginx
svc: nginx

这里我们定义在角色变量中

2、编写mysql模块

vim /etc/ansible/roles/mysql/tasks/main.yml
- name: install mysql
  yum: name={{pkg}} state=latest
- name: start mysql
  service: enabled=true name={{svc}} state=started
 
vim /etc/ansible/roles/mysql/vars/main.yml
pkg:
 - mariadb
 - mariadb-server
svc: mariadb


 

3、编写php模块

vim /etc/ansible/roles/php/tasks/main.yml
- name: install php
  yum: name={{pkg}} state=latest
- name: start php-fpm
  service: enabled=true name={{svc}} state=started
 
vim /etc/ansible/roles/php/vars/main.yml
pkg:
 - php
 - php-fpm
svc: php-fpm

4、编写roles示例

vim /etc/ansible/site.yml
---
- hosts: webservers
  remote_user: root
  roles:
    - httpd
    - mysql
    - php
 
cd /etc/ansible
ansible-playbook site.yml

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

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

相关文章

多模式支持无线监控技术:主动式定位、被动式定位

物联网空间信息与数字技术发展至今&#xff0c;已经催生了一大批优秀的践行者。在日常与商业应用中&#xff0c;室内外定位领域依托于这一技术的发展&#xff0c;更是在近几年风光无限。但是并不是说室内定位与室外定位都已经相当成熟&#xff0c;相对来说&#xff0c;室内定位…

简单实用的内网穿透实现教程

内网穿透&#xff0c;字面理解就是网络地址穿透&#xff0c;是一种比较常用的将内网地址转换成公网地址的方式。通过内网穿透&#xff0c;可以将本地内网局域网提供给外网公网上访问&#xff0c;在外网也能连接访问内网主机和应用&#xff0c;当用户有日常远程和异地外网访问的…

Zabbix的自定义监控

Zabbix的自定义监控 zabbix自动可以提供很多监控项&#xff1b;但是往往不能满足需求&#xff1b;尝尝需要我们自己创建一系列的监控项&#xff0c;这就是自定义监控&#xff1b; 监控项&#xff1a;zabbix进行监控的一个指标&#xff0c;zabbix成为item&#xff1b; 它的值…

C++7:STL-模拟实现vector

目录 vector的成员变量 构造函数 reserve size() capacity() push_back 一些小BUG 赋值操作符重载 析构函数 【】操作符重载 resize pop_back Insert 迭代器失效 erase 二维数组问题 总结一下 vector&#xff0c;翻译软件会告诉你它的意思是向量&#xff0c;但其…

面试腾讯测开岗,结束后被面试官吐槽“什么阿猫阿狗都敢来面试大厂了吗?”.....

前一阵子有个小徒弟向我诉苦&#xff0c;说自己在参加某大厂测试面试的时候被面试官怼得哑口无言&#xff0c;场面让他一度十分尴尬 印象最深的就是下面几个问题&#xff1a; 根据你以前的工作经验和学习到的测试技术&#xff0c;说说你对质量保证的理解&#xff1f; 非关系型…

不连接显示器或者HDMI欺骗器来 使用Moonlight串流游戏

环境&#xff1a;WIN11NVIDIA显卡Moonlight串流 问题&#xff1a;当主机不连接显示器时&#xff0c;Moonlight客户端黑屏 解决办法&#xff1a;使用虚拟显示器来使显卡工资 背景&#xff1a;当SteamDeck 大卖的时候&#xff0c;我开始思考是否也需要购买一台Steam Deck来躺在床…

G1垃圾回收器详解

文章目录前言一、思考问题二、官方文档三、基本介绍四、G1的内存模型五、G1的标记过程六、G1的垃圾回收1、G1过程梳理2、Young GC3、Mixed GC4、Full GC七、参数介绍八、典型问题1、疏散失败&#xff08;Evacuation Failure&#xff09;2、大对象分配&#xff08;Humongous All…

【Linux】动静态库以及动静态链接

环境&#xff1a;centos7.6&#xff0c;腾讯云服务器Linux文章都放在了专栏&#xff1a;【Linux】欢迎支持订阅&#x1f339;链接扩展我们在使用Linux的时候&#xff0c;不禁会有这么一个疑问&#xff1a;为什么我们能够在Linux下进行c/c代码的编写以及编译呢&#xff1f;这是因…

_Linux(网络基础)

文章目录1. 相关基础概念2. 认识 "协议"3. 网络协议初识协议分层OSI七层模型TCP/IP五层(或四层)模型4. 网络传输基本流程网络传输流程图数据包封装和分用小结5. 网络中的地址管理认识IP地址认识MAC地址认识端口号1. 相关基础概念 独立模式: 计算机之间相互独立网络互…

MySQL数据库13——插入数据(INSERT)

下面的语句用于向student表插入数据。 插入语句&#xff1a; INSERT INTO student(ID,name,sex,birthday,origin,contact1,contact2,institute) VALUES (0013,塔赛努,男,1997/9/15,内蒙古自治区,NULL,NULL,计算机学院);INSERT INTO student VALUES (0014,呼和嘎拉,男,1995-02…

字节青训营——秒杀系统设计学习笔记(一)

如何做系统设计 1. 场景分析(Scenario) 什么系统&#xff0c;需要哪些功能&#xff0c;多大的并发量 2. 存储设计(Storage) 数据如何组织&#xff0c;Sq|存储&#xff0c; NoSq|存储 3. 服务设计(Service) 业务功能实现和逻辑整合 4. 可扩展性(Scale) 解决设计缺陷&…

Go的web开发Gin框架1(八)——Gin

一、重点内容&#xff1a; 知识要点有哪些&#xff1f; 1、了解Gin框架 2、导入使用Gin框架 3、尝试配合GORM开发 4、整合html&#xff0c;css&#xff0c;js 二、详细知识点介绍&#xff1a; 1、Gin框架介绍 ​ Gin是一个golang的微框架&#xff0c;封装比较优雅&…

MyBatis无法通过getGenerateKeys获得自增主键的问题

我遇到这个问题的法伤原因比较蠢&#xff0c;查阅了网上相关经验都没有能够解决。看看这个经验能否帮助到你。问题描述&#xff1a;设置了属性的自增后想通过getGenerateKeys获得MySQL对应表单中自增主键id&#xff0c;检查了类、映射器、xml都没有发现问题&#xff0c;但是进行…

如何使用 Python 编程进行多线程

多线程&#xff1a;理论上能在同一个时间段执行多个程序片段&#xff0c;每个程序片段就看作是一个线程。为什么要说理论上&#xff0c;因为实际在操作系统中真正的在同一时间段基本是不存在的&#xff0c;但是在软件编程中我们可以理解为它是在同一时间段执行的。 同步&#…

c/c++开发,无可避免的模板编程实践(篇一)

一、c模板 c开发中&#xff0c;在声明变量、函数、类时&#xff0c;c都会要求使用指定的类型。在实际项目过程中&#xff0c;会发现很多代码除了类型不同之外&#xff0c;其他代码看起来都是相同的&#xff0c;为了实现这些相同功能&#xff0c;我们可能会进行如下设计&#xf…

SpringBoot自定义JsonSerializer和JsonDeserializer,兼容LocalDateTime和LocalDate

1.前言 JDK1.8中添加新的时间日期API&#xff0c;LocalDate、LocalDateTime、LocalTime&#xff0c;但是我们在开发中使用时间戳作为参数值来传递是比较常用的&#xff0c;然而在SpringBoot中并没有为我们提供合适的JsonSerializer和JsonDeserializer。 我们先看看使用默认的Js…

Linux根文件系统移植

目录 一、根文件系统 1.1根文件系统 1.2根文件系统内容 二、根文件系统移植 2.1BusyBox 2.2BusyBox的获取 2.3BusyBox的使用 2.4make menuconfig 2.5编译和安装 2.6修改根文件系统 一、根文件系统 1.1根文件系统 根文件系统是内核启动后挂载的第一个文件系统系统引…

Homekit智能家居创意DIY一智能灯

一、什么是智能灯 传统的灯泡是通过手动打开和关闭开关来工作。有时&#xff0c;它们可以通过声控、触控、红外等方式进行控制&#xff0c;或者带有调光开关&#xff0c;让用户调暗或调亮灯光。 智能灯泡内置有芯片和通信模块&#xff0c;可与手机、家庭智能助手、或其他智能…

链表题目总结 -- 递归

目录一. 递归反转整个链表1. 思路简述2. 代码3. 总结二. 反转链表前 N 个节点1. 思路简述2. 代码3. 总结三、反转链表的一部分1. 思路简述2. 代码3.总结四、反转链表后N个节点1. 思路简述2. 代码3.总结一. 递归反转整个链表 题目链接&#xff1a;https://leetcode.cn/problems…

部署智能合约到公链

&#x1f341;博主简介&#xff1a; &#x1f3c5;云计算领域优质创作者 &#x1f3c5;2022年CSDN新星计划python赛道第一名 &#x1f3c5;2022年CSDN原力计划优质作者 &#x1f3c5;阿里云ACE认证高级工程师 &#x1f3c5;阿里云开发者社区专…