Ansible自动化工具之Playbook剧本编写

目录

Playbook的组成部分

实例模版

切换用户

指定声明用户

声明和引用变量,以及外部传参变量

playbook的条件判断

​编辑

习题

​编辑

ansible-playbook的循环

item的循环

​编辑

list循环

​编辑

together的循环(列表对应的列,数据结合的方式循环)

​编辑

nested循环

Templates模块

实验httpd

yml文件

实验nginx

tags模块

任务标签的种类

任务标签

自定义标签

实验

Role模块

roles结构

实验


Playbook的组成部分

1、task 任务:包含要在目标主机上执行的操作,使用模块定义这些操作,每个任务都是一个模块的调用

2、variables 变量:存储和传递数据,变量可以自定义,可以在Playbook当中定义为全局变量,也可以外部传参

3、Templates 模版:用于生成配置文件,模版是包含占位符的文件,占位符由Ansible在执行时转化为变量值

4、handler 处理器:当需要有变更的时候,可以执行触发器

5、Roles 角色:是一种组织和封装Playbook的,允许把相关的任务,变量,模版和处理器组成一个可复用的单元

实例模版
vim test.yml
#this is our first playbook
- name: first play
#一个name就是一个任务名,名字可以不写
  gather_facts: false
#是否收集目标主机的系统信息,false就是不收集
  hosts: 20.0.0.11
#执行的目标主机
  remote_user: root
#在目标主机执行的用户
  tasks:
   - name: ping test
     ping:
   - name: close selinux
     command: '/sbin/setenforce 0'
     ignore_errors: True
   - name: close firewalld
     service: name=firewalld state=stopped
   - name: install httpd
     yum: name=httpd
   - name: start httpd
     service: enabled=true name=httpd state=started
   - name: editon index.html
     shell: echo "this is httpd" > /var/www/html/index.html
     notify: restart httpd
  handlers:
   - name: restart httpd
     service: name=httpd state=restarted


#检查yaml文件的语法是否错误
ansible-playbook 文件名 --syntax-check 
#查看yml文件里面有几个任务
ansible-playbook  文件名 --list-task
#检查生效的目标主机
ansible-playbook  文件名 --list-hosts
#运行命令 
ansible-playbook 文件名

ansible-playbook 文件名 --start-at-task='install httpd'
-k(–ask-pass):用来交互输入ssh密码
-K(-ask-become-pass):用来交互输入sudo密码
-u:指定用户
切换用户
关闭免密
vim /etc/ansible/ansible.cfg
71行
注释掉

编写脚本
hosts: 20.0.0.11
#执行的目标主机
remote_user: xiaobu
become: yes
become_user: root
指定声明用户
在脚本里不声明用户,运行时,声明用户
ansible-playbook 脚本 -u root -k
声明和引用变量,以及外部传参变量
vim test1.yml
#this is second playbook!
#声明和引用变量,以及外部传参变量
- hosts: 20.0.0.11
  remote_user: root
  vars:
    groupname: xiaobu1
    username: xiaokai
#字典方式: key-value
#vars:
#-
#-
#列表list
  tasks:
   - name: create group
     group:
       name: "{{ groupname }}"
       system: yes
       gid: 111
   - name: create user
     user:
       name: "{{ username }}"
       uid: 1011
       group: "{{groupname}}"
       shell: /sbin/nologin
   - name: copy file
     copy:
       content: "{{ hostvars[inventory_hostname]['ansible_default_ipv4']['address'] }}"
#获取目标主机的IP地址,然后复制到目标文件
# 包含所有主机变量的字典
#inventory_hostname	目标主机名
#ansible_default_ipv4	获取目标主机名
#['ansible_default_ipv4']['address']	索引
       dest: /opt/test.txt

外部传参变量

vim test1.yml
#this is second playbook!
#声明和引用变量,以及外部传参变量
- hosts: 20.0.0.12
  remote_user: root
  tasks:
   - name: create group
     group:
       name: "{{ groupname }}"
       system: yes
       gid: 111
   - name: create user
     user:
       name: "{{ username }}"
       uid: 1011
       group: "{{groupname}}"
       shell: /sbin/nologin
   - name: copy file
     copy:
       content: "{{ hostvars[inventory_hostname]['ansible_default_ipv4']['address'] }}"
       dest: /opt/test.txt

外部传参
ansible-playbook test1.yml -e 'username=xiaobu2 groupname=xiaokai1'
playbook的条件判断

when 是一个比较常见的应用长江,实现满足条件即执行,不满足条件即跳过的任务,when是满足条件即执行,不满足不执行。

vim test2.yml
#this is when test
- hosts: all
#可以用主机的IP地址,也可以是用组名,也可以用all
  remote_user: root
  tasks:
   - name: test when
     debug:
       msg: '位置判断'
#打印相当于echo msg: 输出的内容,debug: 用于脚本的调试,在正式脚本中可以去除
     when: ansible_default_ipv4.address == '20.0.0.11'
#when: ansible_default_ipv4.address == '20.0.0.11'或者 when: inventory_hostname != '20.0.0.11'
#ansible_default_ipv4.address != '20.0.0.11' 取反
习题

现在hosts all

条件1 IP 11:安装nginx

条件2 IP 12:安装httpd

#this is when test
- hosts: all
  remote_user: root
  tasks:
   - name: nginx
     yum: name=nginx
     when:  ansible_default_ipv4.address == '20.0.0.11'
   - name: nginx info
     debug:
       msg: '安装nginx'
     when:  ansible_default_ipv4.address == '20.0.0.11'
   - name: httpd
     yum: name=httpd
     when: ansible_default_ipv4.address == '20.0.0.12'
   - name: httpd info
     debug:
       msg: '安装httpd'
     when: ansible_default_ipv4.address == '20.0.0.12'
ansible-playbook的循环

ansible有多种循环格式,with_items 循环遍历

item的循环

声明变量item,playbook的内置变量,with_items,会把item的值,遍历列表当中的a,b,c,d

vim test4.yml
- hosts: 20.0.0.12
  remote_user: root
  gather_facts: false
  tasks:
   - debug:
       msg: "{{ item }}"
     with_items: 
           - [a,b,c,d]
           - [1,2,3,4]
#声明变量item,playbook的内置变量,with_items,会把item的值,遍历列表当中的a,b,c,d
#虽然我声明的列表是两个,但是with_items还是把两个列表当成整体进行遍历
list循环

列别分组循环

#分组打印
 with_list: 
           - [a,b,c,d]
           - [1,2,3,4]
           
- hosts: 20.0.0.12
  remote_user: root
  gather_facts: false
  tasks:
   - name: create file
     file:
       path: "{{ item }}"
       state: touch
     with_items:
               - /opt/a
               - /opt/b
               - /opt/c
               - /opt/d
               - /opt/1
               - /opt/2
               - /opt/3
               - /opt/4
together的循环(列表对应的列,数据结合的方式循环)

组循环,列表当中的值一一对应打印出来

- hosts: 20.0.0.12
  remote_user: root
  gather_facts: false
  tasks:
   - debug:
       msg: "{{ item }}"
     with_together:
           - [a,b,c,d]
           - [1,2,3,4]
           - [A,B,C]
nested循环

相当于双循环,第一层定义循环的次数,第二层表示第一层的每一个元素会循环几次

列表里面的元素定义了循环的次数,第二层列表,相当于内循环

- hosts: 20.0.0.12
  remote_user: root
  gather_facts: false
  tasks:
   - debug:
       msg: "{{ item }}"
     with_nested:
           - [a,b,c,d]
           - [1,2,3,4]

Templates模块

Jinja模版架构,通过模版可以实现向模版文件传参(Python转义),把占位符参数传到配置文件中去

生成一个目标文本文件,传递变量到需要配置文件当中

实验httpd
yum -y install httpd
cd /etc/httpd/conf
cp httpd.conf /opt/httpd.conf.j2
httpd.conf.j2 在文件当中配置的是占位符(声明的变量)
/etc/ansible/hosts 配置了主机的占位符名称和j2文件中的占位符一致(定义参数:占位符的参数的参数声明好)
playbook当中,Template模块来吧参数传给目标的主机的配置文件
vim  /opt/httpd.conf.j2
42行
Listen {{http_port}}
95行
ServerName {{server_name}}
119行
DocumentRoot "{{root_dir}}"

修改ansible配置文件
20.0.0.11 http_port=20.0.0.11:80 server_name=www.xiaobu.com:80 root_dir=/etc/httpd/htdocs

20.0.0.12 http_port=20.0.0.12:80 server_name=www.xiaobu.com:80 root_dir=/etc/httpd/htdocs

yml文件
- hosts: all
  remote_user: root
  vars:
    - package: httpd
    - service: httpd
  tasks:
    - name: install httpd
      yum: name={{package}}
    - name: install config file
      template: src=/opt/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
      notify:
        - restart httpd
    - name: create root_dir
      file:
        path: /etc/httpd/htdocs
        state: directory
    - name: start httpd
      service: name={{service}} enabled=true state=started
  handlers:
    - name: restart httpd
      service: name={{service}} state=restarted

实验nginx
cp  /etc/nginx/nginx.conf /opt/nginx.conf.j2

修改nginx.的配置文件
 server {
        listen       {{nginx_port}};
        server_name  {{servername}};
        root         {{root_dir}};
}

修改ansible的配置文件
20.0.0.11 nginx_port=8080 servername=www.xiaobu.com root_dir=/etc/nginx/html

20.0.0.12 nginx_port=8080 servername=www.xiaobu.com root_dir=/etc/nginx/html

yml文件

- hosts: all
  remote_user: root
  vars:
    - package: nginx
    - service: nginx
  tasks:
    - name: install nginx
      yum: name={{package}}
    - name: install config file
      template: src=/opt/nginx.conf.j2 dest=/etc/nginx/nginx.conf
      notify:
        - restart nginx
    - name: create root_dir
      file:
        path: /etc/nginx/html
        state: directory
    - name: start nginx
      service: name={{service}} enabled=true state=started
  handlers:
    - name: restart nginx
      service: name={{service}} state=restarted

tags模块

标签模块,可以在playbook当中为任务设定标签(tags),我们在运行playbook是可以通过指定任务标签,来实现只运行设定的标任务

任务标签的种类

always 不管你是否指定了运行标签,任务都会执行

never 即使运行了指定标签,该任务也不会执行

debug 调试任务

任务标签
- hosts: all
  remote_user: root
  gather_facts: false
  tasks:
   - name: tag debug
     debug:
       msg: "this is test1"
     tags:
       - debug
   - name: tag setup
     setup:
     tags:
       - setup
   - name: tag always
     debug:
       msg: "run"
     tags:
       - always
   - name: tag never
     debug:
       msg: "never run"
     tags:
       - never

自定义标签

per_tasks 指定标签之前的任务

post_tasks 运行指定标签之后的任务

- hosts: all
  remote_user: root
  gather_facts: false
  tasks:
   - name: tag always
     debug:
       msg: "run"
     tags:
       - xiaobu
   - name: tag never
     debug:
       msg: "never run"
     tags:
       - xiaokai
实验

1、在目标主机上touch xiaobu.txt always

2、在目标主机复制文件opt/xiaobu2.txt 标签never

实验目的

第一运行playbook 不指定标签查看文件生成情况

指定标签为never,查看文件生成情况

- hosts: all
  remote_user: root
  gather_facts: false
  tasks:
   - name: touch file
     file:
       path: /opt/xiaobu.txt
       state: touch
     tags:
       - always
   - name: copy file
     copy:
       src: /opt/123
       dest: /opt/123
     tags:
       - never
Role模块

Role模块又叫角色

ansible层次化,结构化的组织playbook,使用了rolse(角色)

可以根据层次结构,自动装载变量文件,task,以及handler等等

Roles:分别把变量 文件 任务 模块以及处理器,放在单独的目录当中,使用roles模块来一键调用这些文件

roles结构

--- web---总目录,角色

files 存放copy和script模块调用的文件

Templates 存放j2的模块文件

tasks 包含任务的目录 ---- mail.yml 角色运行的任务

handlers 包含处理器的目录 ---- main.yml

vars 存放变量的目录 ----main.yml

defaults 包含默认变量的目录 -----main.yml

meta 包含元信息的目录----main.yml

在总目录下site.yml,用来调用所有配置文件

site.yml文件

- hosts: 20.0.0.11
  remote_user: root
  roles:
    - httpd
    - mysql
    - php
实验
三个服务
http	mysql	php
#安排剧本
cd /etc/ansible/roles/
mkdir httpd mysql php
cd httpd
mkdir files templates tasks handlers vars defaults meta
touch {defaults,vars,tasks,meta,handlers}/main.yml
cd mysql
mkdir files templates tasks handlers vars defaults meta
touch {defaults,vars,tasks,meta,handlers}/main.yml
cd php
mkdir files templates tasks handlers vars defaults meta
touch {defaults,vars,tasks,meta,handlers}/main.yml

配置httpd
vim tasks/main.yml
- name: install httpd
  yum: name={{pkg}}
- name: start httpd
  service: enabled=true name={{svc}} state=started

vim httpd/vars/main.yml
pkg: httpd
svc: httpd

配置mysql
vim mysql/tasks/main.yml
- name: isntall mysql
  yum: name={{pkg}}
- name: start mysql
  service: enabled=true name={{svc}} state=started

vim mysql/vars/main.yml
pkg:
  - mariadb
  - mariadb-server
svc: mariadb

配置php
vim php/tasks/main.yml
- name: install php
  yum: name={{pkg}}
- name: start php
  service: enabled=true name={{svc}} state=started

vim php/vars/main.yml
pkg: 
  - php
  - php-fpm
svc: php-fpm

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

初识Docker-什么是docker

Docker是一个快速交付应用、运行应用的技术 目录 一、Docker 二、运用场景 一、什么是Docker?它的作用是什么? Docker如何解决大型项目依赖关系复杂,不同组件依赖的兼容性问题? Docker允许开发中将应用、依赖、函数库、配置一起打包&…

专业数据中台哪个好?亿发数字化运营平台解决方案,助力大中型企业腾飞

数据中台的核心在于避免数据的重复计算,通过数据服务化的方式提升数据的共享能力,为数据应用赋能。 在信息技术时代,企业的信息系统建设通常是由各个组织和功能单元独立完成,以满足各自的需求。这导致了“数据孤岛”和“数据烟囱”…

华为端口隔离简单使用方法同vlan下控制个别电脑不给互通

必须得用access接口,hybrid口不行 dhcp enable interface Vlanif1 ip address 192.168.1.1 255.255.255.0 dhcp select interface interface MEth0/0/1 interface GigabitEthernet0/0/1 port link-type access port-isolate enable group 1 interface GigabitEther…

GBASE南大通用GBase 8a ODBC的安装文件

GBASE南大通用GBase 8a ODBC 体系结构是基于五个组件,在下图中所示: GBase 8a ODBC 体系结构图  应用 应用是通过调用 ODBC API 实现对 GBase 数据访问的程序。应用使用标准的 ODBC 调用与驱动程序管理器通信。应用并不关心数据存储在哪里&#xff…

技术分享-Jenkins

持续集成及Jenkins介绍 软件开发生命周期叫SDLC(Software Development Life Cycle),集合了计划、开发、测试、部署过程。 在平常的开发过程中, 需要频繁地(一天多次)将代码集成到主干,这个叫持…

js 如何判断对象自身为空?很多人错了~

前言 如何判断一个对象为空是我们在开发中经常会遇到的问题,今天我们来聊聊几种经常使用的方法,以及在不同的场景下我们如何去使用。 1. JSON.stringify JSON.stringify 方法可以使对象序列化,转为相应的 JSON 格式。 const obj {};conso…

Qt 6.3 学习笔记

文章目录 Qt的安装和配置创建一个Qt项目信号和槽布局和控件绘图和动画数据库和网络 Qt是一个跨平台的C图形用户界面应用程序开发框架。它提供了创建GUI应用程序的工具和库。Qt 6.3是Qt的最新版本,引入了许多新特性和改进。在这个章节中,我们将详细介绍如…

Appearance-Motion Memory Consistency Network for Video Anomaly Detection 论文阅读

Appearance-Motion Memory Consistency Network for Video Anomaly Detection 论文阅读 AbstractIntroductionRelated WorkMethodExperimentsConclusions阅读总结 论文标题:Appearance-Motion Memory Consistency Network for Video Anomaly Detection 文章信息&am…

安全狗云原生安全-云甲·云原生容器安全管理系统

随着云计算的快速发展,容器技术逐渐成为主流。然而,随着容器的普及,安全问题也日益突出。为了解决这一问题,安全狗推出了云原生容器安全管理系统——云甲。 云甲是安全狗云原生安全的重要组成部分,它采用了先进的云原生…

二分查找法详解(6种变形)

前言 在之前的博客中,我给大家介绍了最基础的二分查找法(没学的话点我点我!) 今天我将带大家学习二分法的六种变形如何使用,小伙伴们,快来开始今天的学习吧! 文章目录 1,查找第一个…

GBASE南大通用数据库提供的高可用负载均衡功能

GBASE南大通用GBase 8a ODBC 提供的高可用负载均衡功能是指,GBase 8a ODBC 会将客户 端请求的数据库集群连接平均分摊到集群所有可用的节点上。 GBASE南大通用数据库负载均衡的使用方法 GBASE南大通用GBase 8a ODBC 提供两种方式来使用高可用负载均衡。一种是配置数…

RocketMQ系统性学习-RocketMQ高级特性之消息存储的高效与刷盘策略、Broker 快速读取消息机制

🌈🌈🌈🌈🌈🌈🌈🌈 【11来了】文章导读地址:点击查看文章导读! 🍁🍁🍁🍁🍁🍁&#x1f3…

Linux 一键部署TeamCity

前言 TeamCity 是一个通用的 CI/CD 软件平台,可实现灵活的工作流程、协作和开发实践。允许在您的 DevOps 流程中成功实现持续集成、持续交付和持续部署。 系统支持Centos7,8,9/Redhat7,8,9及复刻系列高版本建议使用9系列系统部署,避免因为各种插件包不兼容问题。以下部署…

KBU808-ASEMI适配高端电源KBU808

编辑:ll KBU808-ASEMI适配高端电源KBU808 型号:KBU808 品牌:ASEMI 封装:KBU-4 最大平均正向电流:8A 最大重复峰值反向电压:800V 产品引线数量:4 产品内部芯片个数:4 产品内…

antdesignpro实现滚动加载分页数据

原理解析:每滚动一次相当于翻页,请求后端时给的页码参数要想办法加1,后端才能根据页码给出相应数据 注意后端收到页码参数之后要准确计算出每页的首行数据,关键逻辑代码: # 根据前端传的页码,进行计算下一…

列举mfc140u.dll丢失的解决方法,常见的mfc140u.dll问题

在使用电脑的过程中,有时会遇到mfc140u.dll文件丢失的问题,导致一些应用程序无法正常启动。本文将介绍mfc140u.dll丢失的常见原因,并提供相应的解决办法。同时,还会列举一些与mfc140u.dll丢失相关的常见问题和解答。 第一部分&…

‘yolo‘ 不是内部或外部命令,也不是可运行的程序

yolo命令不可以用 pip install ultralytics在安装完成之后还是不可以 最后我的解决方法是 pip install ultralytics 的安装路径 没有安装在我们的虚拟环境中 首先看看pip install ultralytics 安装在了哪里 把yolo.exe 挪动到我们的虚拟环境中

姿态识别、目标检测和跟踪的综合应用

引言: 近年来,随着人工智能技术的不断发展,姿态识别、目标检测和跟踪成为了计算机视觉领域的热门研究方向。这三个技术的综合应用为各个行业带来了巨大的变革和机遇。本文将分别介绍姿态识别、目标检测和跟踪的基本概念和算法,并探…

【已解决】修改了网站的class样式name值,会影响SEO,搜索引擎抓取网站及排名吗?

问题: 修改了网站的class样式name值,会影响搜索引擎抓取网站及排名吗? 解答: 如果你仅仅修改了网站class样式的名称,而没有改变网站的结构和内容,那么搜索引擎通常不会因此而影响它对网站的抓取和排名。但…

vue3使用echarts漏斗,根据数据计算比例大小

需求:我们在开发过程中会遇到漏斗图的使用,如果用echarts里面自带的算法绘制渲染漏斗图时候,如果后端给的数据相差不大很接近时候,漏斗图渲染的结果不明显看不出来变化的。 优化之前的漏斗图: 优化之后的漏斗图&…