Ansible(二)

一、Playbook基础

1.1 Playbook定义

Playbook其实是Ansible服务的一个配置文件,Ansible使用Playbook的YAML语言配置编写成操作需求,实现对远端主机或策略部署,实现对远端主机的控制与管理。

1.2 Playbook组成

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

Variables:变量

Templates:模板

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

Roles:角色

1.3 Playbook剧本详解

vim test1.yaml
---
#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 selinuxcommand: '/sbin/setenforce 0'
#command模块和shell模块无需使用key=value格式ignore_errors: True
#如执行命令的返回值不为0,就会报错,tasks停止,可使用ignore_errors忽略失败的任务- name: disable firewalldservice: name=firewalld state=stopped
#使用 module: options 格式来定义任务,option使用key=value格式- name: install httpdyum: name=httpd state=latest- name: install configuration file for httpdcopy: src=/opt/httpd.conf dest=/etc/httpd/conf/httpd.conf
#这里需要一个事先准备好的/opt/httpd.conf文件notify: "restart httpd"
#如以上操作后为changed的状态时,会通过notify指定的名称触发对应名称的handlers操作- name: start httpd serviceservice: enabled=true name=httpd state=startedhandlers:
#handlers中定义的就是任务,此处handlers中的任务使用的是service模块- name: restart httpd
#notify和handlers中任务的名称必须一致service: name=httpd state=restarted
#Ansible在执行完某个任务之后并不会立即去执行对应的handler,而是在当前play中所有普通任务都执行完后再去执行handler,这样的好处是可以多次触发notify,但最后只执行一次对应的handler,从而避免多次重启。

1.4 Playbook命令 

//运行playbook
ansible-playbook test01.yaml
//补充参数:
-k(–ask-pass):用来交互输入ssh密码
-K(-ask-become-pass):用来交互输入sudo密码
-u:指定用户
ansible-playbook test01.yaml --syntax-check    #检查yaml文件的语法是否正确
ansible-playbook test01.yaml --list-task       #检查tasks任务
ansible-playbook test01.yaml --list-hosts      #检查生效的主机
ansible-playbook test01.yaml --start-at-task='install httpd'     #指定从某个task开始运行

1.5 Playbook安装并启动httpd服务

cd /opt/
vim test01.yaml
---
- name: install httpdgather_facts: falsehosts: webserversremote_user: roottasks:- name: connection ceshiping:- name: disable firewalldservice: name=firewalld state=stopped- name: install apacheyum: name=httpd state=latest- name: install config filecopy: src=/opt/httpd.conf dest=/etc/httpd/conf/httpd.conf- name: start httpd serviceservice: enabled=true name=httpd state=started- name: write htmlcopy: src=/opt/index.html dest=/var/www/html/index.htmlnotify: "restart httpd"handlers:- name: restart httpdservice: name=httpd state=restarted
echo 123 > index.html
cat index.html

 

ansible-playbook test01.yaml --syntax-checkansible-playbook test01.yaml --list-taskansible-playbook test01.yaml --list-hostansible-playbook test01.yaml

 

1.6 变量的定义和引用

cd /opt
vim test02.yaml
---
- name: variablehosts: webserversremote_user: rootvars:- groupname: test01- username: nginxtasks:- name: create groupgroup: name={{groupname}} system=yes gid=333- name: create useruser: name={{username}} uid=333 group={{groupname}}- name: copy filecopy: content="{{ansible_default_ipv4}}" dest=/opt/shibin.txt

-e选项指定ymal配置文件中变量username,因为指定了在yaml文件中指定的username为"nginx",实际命令中指定为"test001"最终是以-e选项指定的username生效;

注意:命令行中的变量优先级高于YAML配置文件中的变量优先级。

ansible-playbook test02.yaml -e "username=test001"

1.7 指定远程主机sudo切换用户 

cd /opt
vim test03.yaml
---
- hosts: webserversremote_user: zhangsan            become: yes                    become_user: root
ansible-playbook test03.yml -K

这里红色显示sudo提权失败,可以去远端主机的配置文件(/etc/sudoers)中修改zhangsan用户的权限

​  

 

 1.8 When(条件判断)

cd /opt
vim test04.yaml
---
- name: reboot hosthosts: dbserversremote_user: roottasks:- name: shutdown hostcommand: /sbin/shutdown -r nowwhen: ansible_default_ipv4.address == "192.168.133.10"

由于判断条件为主机地址为192.168.133.10才执行Shutdown操作,所以主机地址为192.168.133.100的主机跳过Playbook 

1.9 迭代

1.9.1 创建文件夹

cd /opt
vim test05.yaml
- name: test05hosts: webserverstasks:- name: create directoriesfile: path={{item}} state=touchwith_items:- /opt/shibin/s1.txt- /opt/shibin/s2.txt- /opt/shibin/s3.txt- /opt/shibin/s4.txt

注意:需提前在webservers里的主机上创建好目录/opt/shibin 

ansible-playbook test05.yaml

1.9.2  创建文件夹并建立用户

cd /opt
vim test06.yaml
---
- name: test06hosts: webserversgather_facts: falsetasks:- name: create directoriesfile:path: "{{item}}"state: directorywith_items:- /tmp/test1- /tmp/test2- name: add usersuser: name={{item.name}} state=present groups={{item.groups}}with_items:- name: test1groups: wheel- name: test2groups: root
ansible-playbook test06.yaml

二、Templates模块

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

2.1 准备模板文件并设置引用的变量

yum install -y httpdcp /etc/httpd/conf/httpd.conf /opt/httpd.conf.j2vim /opt/httpd.conf.j2-42行修改-   Listen {{http_port}}
-95行修改-   ServerName {{server_name}}
-119行修改-  DocumentRoot "{{root_dir}}" 

2.2 修改主机清单内的变量

vim /etc/ansible/hosts -19- [webservers]
-20- 192.168.133.90 http_port=192.168.133.90:80 server_name=www.test1.com:80 root_dir=/etc/httpd/htdocs
#注意  root_dir要和前面的server_name空格  不可另起一行,否则报错UNREACHABLE!-34- [dbservers]
-35- 192.168.133.100 http_port=192.168.133.100:80 server_name=www.test2.com:80 root_dir=/etc/httpd/htdocs
#注意  root_dir要和前面的server_name空格  不可另起一行,否则报错UNREACHABLE!

2.3 编写Playbook剧本

vim apache.yaml
---
- hosts: allremote_user: rootvars:- package: httpd- service: httpdtasks:- name: create dirfile: path=/etc/httpd/htdocs state=directory- name: install httpd packageyum: name={{package}} state=latest- name: install configure filetemplate: src=/opt/httpd.conf.j2 dest=/etc/httpd/conf/httpd.confnotify: "restart httpd"- name: start httpd serverservice: name={{service}} enabled=true state=startedhandlers:- name: restart httpdservice: name={{service}} state=restarted
ansible-playbook apache.yaml

 

 三、Tags模块

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

cd /opt
vim test07.yaml
---
- hosts: webserversremote_user: roottasks:- name: Copy hosts filecopy: src=/etc/hosts dest=/opt/hoststags: "shibin"- name: touch filefile: path=/opt/testhost state=touchtags: "always"
ansible-playbook test07.yaml --tags="shibin"

 

 四、Roles模块

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

4.1 Roles目录详解

4.2 在Playbook中使用Roles步骤

4.2.1 环境准备

mkdir /etc/ansible/roles/ -p
#创建以 roles 命名的目录mkdir /etc/ansible/group_vars/ -p
touch /etc/ansible/group_vars/all
#创建全局变量目录mkdir /etc/ansible/roles/httpd
mkdir /etc/ansible/roles/mysql
#在 roles 目录中分别创建以各角色名称命令的目录mkdir /etc/ansible/roles/httpd/{files,templates,tasks,handlers,vars,defaults,meta}
mkdir /etc/ansible/roles/mysql/{files,templates,tasks,handlers,vars,defaults,meta}
#在每个角色命令的目录中分别创建files、handlers、tasks、templates、meta、defaults和vars目录,用不到的目录可以创建为空目录,也可以不创建touch /etc/ansible/roles/httpd/{defaults,vars,tasks,meta,handlers}/main.yml
touch /etc/ansible/roles/mysql/{defaults,vars,tasks,meta,handlers}/main.yml
#在每个角色的 handlers、tasks、meta、defaults、vars 目录下创建 main.yml 文件,千万不能自定义文件名

4.2.2 修改yml文件 

vim /etc/ansible/site.yml
---
- hosts: cxkremote_user: rootroles:- httpd
- hosts: wybremote_user: rootroles:- mysql

4.2.3 运行Ansible-Playbook  

cd /etc/ansible
ansible-playbook site.yml

4.3 Roles模块举例——LAMP

mkdir /etc/ansible/roles/httpd/{files,templates,tasks,handlers,vars,defaults,meta} -p
mkdir /etc/ansible/roles/mysql/{files,templates,tasks,handlers,vars,defaults,meta} -p
mkdir /etc/ansible/roles/php/{files,templates,tasks,handlers,vars,defaults,meta} -ptouch /etc/ansible/roles/httpd/{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

4.3.1 编写httpd模块

(1)编写yml文件

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

 (2)定义变量

vim /etc/ansible/roles/httpd/vars/main.yml
#可以定义在全局变量中,也可以定义在roles角色变量中,一般定义在角色变量中
pkg: httpd
svc: httpd

4.3.2 编写Mysql模块

(1)编写yml文件

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

(2)定义变量

vim /etc/ansible/roles/mysql/vars/main.ymlpkg:- mariadb- mariadb-server
svc: mariadb

4.3.3 编写Php模块

(1)编写yml文件

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

(2)定义变量

vim /etc/ansible/roles/php/vars/main.ymlpkg:- php- php-fpm
svc: php-fpm

4.3.4 编写Roles实例并启动

vim /etc/ansible/site.yml---
- hosts: wybremote_user: rootroles:- httpd- mysql- phpcd /etc/ansible
ansible-playbook site.yml

五、 Ansible常用命令小结

5.1.ansible-doc

ansible-doc -h Usage: ansible-doc [options] [module...]
#该指令用于查看模块信息,常用参数有两个-l 和 -s ,具体如下
ansible-doc -l
#列出所有已安装的模块ansible-doc -s command
#查看具体某模块的用法,这里如查看command模块

5.2 ansible-galaxy

ansible-galaxy -h Usage: ansible-galaxy [init|info|install|list|remove] [--help] [options] ...
#ansible-galaxy指令用于方便的从https://galaxy.ansible.com/ 站点下载第三方扩展模块,我们可以形象的理解其类似于centos下的yum、python下的pip

5.3 ansible-playbook

通过读取playbook 文件后,执行相应的动作

5.4 ansible-pull

该指令使用需要谈到ansible的另一种模式——pull 模式,这和我们平常经常用的push模式刚好相反,其适用于以下场景:你有数量巨大的机器需要配置,即使使用非常高的线程还是要花费很多时间

5.5 ansible-vault

ansible-vault主要应用于配置文件中含有敏感信息,又不希望他能被人看到,vault可以帮你加密/解密这个配置文件,属高级用法。主要对于playbooks里比如涉及到配置密码或其他变量时,可以通过该指令加密,这样我们通过cat看到的会是一个密码串类的文件,编辑的时候需要输入事先设定的密码才能打开。这种playbook文件在执行时,需要加上 –ask-vault-pass参数,同样需要输入密码后才能正常执行。

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

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

相关文章

【Qt 学习笔记】Qt常用控件 | 布局管理器 | 垂直布局Vertical Layout

博客主页:Duck Bro 博客主页系列专栏:Qt 专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ Qt常用控件 | 布局管理器 | 垂直布局Vertical Layout 文章编号&#x…

skynet - spinlock 简单的自旋锁

spinlock.h 代码位于: https://github.com/cloudwu/skynet/blob/master/skynet-src/spinlock.h 该文件内,根据不同环境提供了 3 种 api 实现: pthread_mutex_t 系列函数gcc 内置原子操作函数std atomic 系列函数 看了下,效率最…

渗透测试-信息收集

网络安全信息收集是网络安全领域中至关重要的一环,它涉及到对目标系统、网络或应用进行全面而细致的信息搜集和分析。这一过程不仅有助于理解目标网络的结构、配置和潜在的安全风险,还能为后续的渗透测试、风险评估和安全加固提供有力的支持。 在网络安…

安卓开发--新建工程,新建虚拟手机,按键事件响应(含:Android中使用switch-case遇到case R.id.xxx报错)

安卓开发--新建工程,新建虚拟手机,按键事件响应 1.前言2.运行一个工程2.1布局一个Button2.2 button一般点击事件2.2 button属性点击事件2.2 button推荐点击事件(含:Android中使用switch-case遇到case R.id.xxx报错) 本…

MATLAB 多项式

MATLAB 多项式 MATLAB将多项式表示为行向量,其中包含按幂次降序排列的系数。例如,方程P(x) X 4 7 3 - 5 9可以表示为 p [1 7 0 -5 9]; 求值多项式 polyval函数用于求一个特定值的多项式。例如,在 x 4 时,计算我们之前的多项式…

HTTP URL 详解

概述 URL 提供了一种定位因特网上任意资源的手段&#xff0c;大多数 URL 语法都由以下九个结构的通用格式组成&#xff1a; <scheme>://<user>:<password><host>:<port>/<path>;<params>?<query>#<frag> 方案&#…

命令重装Linux系统,无需登录控制面板

命令重装Linux系统&#xff0c;无需登录控制面板 部分无法登录控制面板使用这个脚本 自动安装安装脚本 wget https://lyvba.com/auto.sh bash auto.sh -d 12 -v 64 -a -p $passwd \--mirror https://mirrors.ustc.edu.cn/debian/安装命令参考 # 自动安装 Debian 10 buster …

基于YOLOV8复杂场景下船舶目标检测系统

1. 背景 海洋作为地球上70%的表面积&#xff0c;承载着人类生活、经济发展和生态系统的重要功能。船舶作为海洋活动的主要载体之一&#xff0c;在海上运输、资源开发、环境监测等方面发挥着重要作用。复杂海洋环境下的船舶目标检测成为了海事管理、海洋资源开发和环境保护等领…

人工智能轨道交通行业周刊-第79期(2024.4.22-5.12)

本期关键词&#xff1a;无人机巡检、车机联控、减速顶、Agent、GraphRAG、RAGFlow 1 整理涉及公众号名单 1.1 行业类 RT轨道交通人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网铁路视点ITS World轨道交通联盟VSTR铁路与城市轨道交通RailMetro轨道世界铁路那…

2024OD机试卷-API集群负载统计 (java\python\c++)

题目:API集群负载统计 题目描述 某个产品的RESTful API集合部署在 服务器 集群的多个节点上,近期对客户端访问日志进行了采集,需要统计各个API的访问频次,根据热点信息在服务器节点之间做负载 均衡,现在需要实现热点信息统计查询功能。 RESTful API是由多个层级构成,层…

《动手学深度学习》V2(11-18)

文章目录 十一、二 模型选择与过拟合和欠拟合1、模型的选择2、过拟合和欠拟合3、估计模型容量4、线性分类器的VC维5、过拟合欠拟合的代码实现 :fire:①生成数据集②定义评估损失③定义训练函数④三阶多项式函数拟合⑤线性函数拟合(欠拟合)⑤高阶多项式函数拟合(过拟合) 十三、权…

【C语言】精品练习题

目录 题目一&#xff1a; 题目二&#xff1a; 题目三&#xff1a; 题目四&#xff1a; 题目五&#xff1a; 题目六&#xff1a; 题目七&#xff1a; 题目八&#xff1a; 题目九&#xff1a; 题目十&#xff1a; 题目十一&#xff1a; 题目十二&#xff1a; 题目十…

「 网络安全常用术语解读 」漏洞利用预测评分系统EPSS详解

1. 概览 EPSS&#xff08;Exploit Prediction Scoring System&#xff0c;漏洞利用预测评分系统&#xff09; 提供了一种全新的高效、数据驱动的漏洞管理功能。EPSS是一项数据驱动的工作&#xff0c;使用来自 CVE 的当前威胁信息和现实世界的漏洞数据。 EPSS 模型产生 0 到 1&…

vue 中的 Vuex

Vuex Vuex是什么&#xff1f; 概念&#xff1a;专门在vue中实现集中式状态&#xff08;数据&#xff09;管理的一个Vue插件&#xff0c;对Vue应用中多个组件的共享状态进行集中式的管理(读/写&#xff09;&#xff0c;也是一种组件间通信的方式&#xff0c;且适用于任意组件间…

2024最新小红书电商落地实操课,从入门到精通,打造爆款方法(16节课)

你是不是经常在小红书上看到各种各样的推广和引流方法&#xff0c;却感觉实际操作起来很困难&#xff1f; 那么&#xff0c;这门2024最新小红书电商落地实操课就是为你量身定制的&#xff01;从入门到精通&#xff0c;不仅能让你了解电商平台的基本规则和玩法&#xff0c;还能…

ansible------inventory 主机清单

目录 inventory 中的变量 2&#xff09;组变量[webservers:vars] #表示为 webservers 组内所有主机定义变量&#xff0c;所有组内成 员都有效 ansible_userrootansible_passwordabc1234 3&#xff09; [all:vars…

VulkanSDK Demos vkcube 编译失败

操作系统: Windows 11 23H2 Vulkan 版本: 1.3.2.280.0 Visual Studio 版本: 2022 在VulkanSDK/Demos目录下存在一个demo solution,其中包含两个project, vkcube和vkcubepp,两个分别为C语言和C写的示例程序, 但是直接编译这两个project时会编译失败,报了以下错误: fatal err…

[Java EE] 文件IO(一):文件概念与文件系统操作

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏:&#x1f355; Collection与数据结构 (91平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm1001.2014.3001.5482 &#x1f9c0;Java …

LeetCode 每日一题 ---- 【2391.收集垃圾的最少总时间】

LeetCode 每日一题 ---- 【2391.收集垃圾的最少总时间】 2391.收集垃圾的最少总时间方法&#xff1a;模拟&#xff08;多次遍历&#xff09; 2391.收集垃圾的最少总时间 方法&#xff1a;模拟&#xff08;多次遍历&#xff09; 需要注意的点是&#xff0c;处理一个单位的一个…

mysql分页排序的坑,千万注意!

1、问题复现 现象&#xff1a; mysql对无索引字段进行排序后limit &#xff0c;当被排序字段有相同值时并且在limit范围内&#xff0c;取的值并不是正常排序后的值&#xff0c;有可能第一页查询的记录&#xff0c;重复出现在第二页的查询记录中&#xff0c;而且第二页的查询结…