自动化运维管理工具 Ansible-----【inventory 主机清单和playbook剧本】

目录

一、inventory 主机清单

1.1inventory 中的变量

1.1.1主机变量

1.1.2组变量

1.1.3组嵌套

二、Ansible 的脚本 ------ playbook(剧本)

2.1 playbook介绍

2.2playbook格式

2.3playbooks 的组成

2.4playbook编写

2.5运行playbook

2.5.1ansible-playbook命令使用

​2.6playbook定义、引用变量

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

2.8when条件判断

2.8.1调用command模块shutdown服务

2.8.2调用service模块关闭httpd服务

2.9迭代

2.9.1批量创建目录

2.9.2批量创建文件

2.9.3批量创建目录、批量创建多个用户,并加入指定的组


一、inventory 主机清单

Inventory支持对主机进行分组,每个组内可以定义多个主机,每个主机都可以定义在任何一个或多个主机组内

如果是名称类似的主机,可以使用列表的方式表示各个主机
vim /etc/ansible/hosts
[webservers]
192.168.246.8:2222			#冒号后定义远程连接端口,默认是ssh的22端口
192.168.246.1[1:5]			#范围是:192.168.246.11到192.168.246.15[dbservers]
db-[a:f].example.org		#支持匹配 a~f

1.1inventory 中的变量

Inventory变量名含义
ansible_hostansible连接节点时的IP地址
ansible_port连接对方的端口号,ssh连接时默认为22
ansible_user

连接对方主机时使用的主机名。

不指定时,将使用执行ansible或ansible-playbook命令的用户

ansible_passwd连接时的用户的ssh密码,仅在未使用密钥对验证的情况下有效
ansible_ssh_private_key_file指定密钥认证ssh连接时的私钥文件
ansible_ssh_common_args提供给ssh、sftp、 scp命令的额外参数
ansible_become允许进行权限提升
ansible_become_method指定提升权限的方式,例如可使用sudo/su/runas等方式
ansible_become_user提升为哪个用户的权限,默认提升为root
ansible_become_password提升为指定用户权限时的密码

1.1.1主机变量

写法1:
[webservers]
192.168.246.8 ansible_port=22 ansible_user=root ansible_password=abc123
192.168.246.10 ansible_port=22 ansible_user=root ansible_password=abc123
#webservers组中被控制端192.168.246.8的端口号为22登录时用户是root密码为abc123写法2:
[webservers]
192.168.30.1[1:2] ansible_port=22 ansible_user=root ansible_password=abc123
#如果是名称类似的主机,可以使用列表的方式标识各个主机#不建立将密码直接写入配置,不安全写法3:
[webservers]
192.168.30.11:22
192.168.30.12:22
#默认ssh管理时的端口为22,若不是22则直接在被管理ip后加冒号和对应端口号

写法一:修改端口

写法二:

1.1.2组变量

[webservers:vars]     
ansible_user=root
ansible_password=abc123
#表示webservers 组内所有主机定义变量控制时使用root账户密码为abc123[all:vars]       
ansible_port=22
#表示为所有组的所有主机定义变量使用ssh远程管理时都是22端口

修改被控制端口为1212

再去ansible主机检测

1.1.3组嵌套

[nginx]   #nginx组
192.168.246.8
192.168.246.9[httpd]   #httpd组
192.168.246.11
192.168.246.12
#组内嵌为web[web:children]
nginx
httpd
#表示web组的成员即children的直译‘孩子’包括nginx和httpd组

进行检测

二、Ansible 的脚本 ------ playbook(剧本)

2.1 playbook介绍

playbook是ansible用于配置,部署,和管理被控节点的剧本。通过playbook的详细描述,执行其中的tasks,可以让远端主机达到预期的状态。

playbook是由一个或多个”play”组成的列表。 当对一台机器做环境初始化的时候往往需要不止做一件事情,这时使用playbook会更加适合。通过playbook你可以一次在多台机器执行多个指令。通过这种预先设计的配置保持了机器的配置统一,并很简单的执行日常任务。

ansible通过不同的模块实现相应的管理,管理的方式通过定义的清单文件(hosts)所管理的主机包括认证的方式连接的端口等。所有的功能都是通过调用不同的模块(modules)来完成不同的功能的。不管是执行单条命令还是play-book都是基于清单文件。

Ansible Playbook(剧本)是Ansible 的核心组件之一,是一种以 YAML 格式编写的自动化任务描述文件。

  • 每个 Playbook 由一个或多个 Play 组成。
  • 在每个 Play 下面,通过 tasks 关键字来定义一组任务。
  • 每个任务由一个或多个模块组成,用于在远程主机上实现自动化部署、配置和管理等操作

2.2playbook格式

playbook由YMAL语言编写。YMAL格式是类似于JSON的文件格式,便于人理解和阅读,同时便于书写。

一个剧本里面可以有多个play,每个play只能有一个tasks,每个tasks可以有多个name。

注意事项:

①大小写明个

②通过缩进表示层级关系

③不支持制表符tab键缩进,只能使用空格缩进

④缩进的空格数目不重要,只要相同层级左右对齐,通常开头缩进2个空格

⑤#号注释

⑥符号字符后缩进1个空格,如冒号:逗号,横杠-后面空一个格

⑦如果包含特殊字符用单引号和双引号引起来会作为字符串处理,单引号不识别变量,双引号识别变量。

2.3playbooks 的组成

  • Tasks:任务,即通过 task 调用 ansible 的模块将多个操作组织在一个playbook 中运行
  • Variables:变量
  • Templates:模板
  • Handlers:处理器,当 changed 状态条件满足时,(notify)触发执行的操作。
  • Roles:角色

2.4playbook编写

注意修改sshd的端口

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 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,从而避免多次重启。

---
- name: install httpdgather_facts: falsehosts: web-z1remote_user: roottasks:- name: test pingping:- name: disable firewalldservice: name=firewalld state=stopped- name: install httpdyum: name=httpd state=latest- name: install configuration file for httpdcopy: src=/opt/httpd.conf dest=/etc/httpd/conf/httpd.confnotify: "restart httpd"- name: start httpd serviceservice: enabled=true name=httpd state=startedhandlers:- name: restart httpdservice: name=httpd state=restarted

解释:

---
#ymal文件开头,可不写
- name: test
#定义play名称,可不写gather_facts: false
#设置不进行facts信息收集,这可以加快执行速度,可省略默认开启hosts: webservers
#要执行的组或者主机,webservers为组名需要在/etc/ansible/hosts中配置remote_user: root
#执行时所使用的用户tasks:
#定义任务列表,列表中任务按顺序执行- name: test ping
#自定义name的任务名称ping:
#第一个任务执行内容为使用ping模块ping,webservers组的主机- name: test selinuxcommand: /sbin/setenforce 0
#第二个任务执行内容为使用command模块关闭selinuxignore_errors: false
#若出现错误,忽略继续运行下面的任务,默认为true出错立即停止playbooks- name: test stop firewalldservice: name=firewalld state=stopped
#第三个任务执行内容为使用service模块关闭firewalld防火墙- name: test yumyum: name=httpd state=latest
#第四个任务执行内容为使用yum模块安装httpd服务状态为latest- name: test copycopy: src=/opt/httpd.conf dest=/etc/httpd/conf/httpd.conf
#第五个任务为使用copy模块将ansible上的/etc/httpd.conf文件拷贝到指定组的主配置文件下替换,注意此处需要在ansible的/opt目录上有一个httpd.conf的模版否则会报错notify: "restart httpd"
#如果上面的copy任务成功,则调用handlers模块的restart httpd,注意要与下面handlers的name名称相同- name: test start httpdservice: enabled=yes name=httpd state=started
#第六个任务执行内容为使用service模块启动httpd服务并设置开机自启handlers:- name: restart httpdservice: name=httpd state=restarted
#handlers模块,若notify成立则执行此模块内容调用service模块重启httpd服务。注意使用name名称调用

验证httpd服务是否开启

2.5运行playbook

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

2.5.1ansible-playbook命令使用

ansible-playbook test.yaml --syntax-check

ansible-playbook test.yaml --list-task

ansible-playbook test.yaml --list-hosts

ansible-playbook test.yaml --start-at-task='install httpd'


2.6playbook定义、引用变量

---
- name: second playhosts: dbserversremote_user: rootvars:                 #定义变量- groupname: mysql   #格式为 key: value- username: nginxtasks:- name: create groupgroup: name={{groupname}} system=yes gid=306    #使用 {{key}} 引用变量的值- name: create useruser: name={{username}} uid=306 group={{groupname}} - name: copy filecopy: content="{{ansible_default_ipv4}}" dest=/opt/vars.txt    #在setup模块中可以获取facts变量信息ansible-playbook test1.yaml -e "username=nginx"     #在命令行里定义变量

---
- name: second playhosts: web-z1remote_user: rootvars:
#使用变量模块- groupname: testgroup
#定义变量groupname的值为testgroup- username: testuser
#定义变量username的值为testusertasks:- name: create groupgroup: name={{groupname}} gid=111
#第一个任务使用group模块调用定义的groupname变量创建组- name: create useruser: name={{username}} uid=10086 group={{groupname}}
#第二个任务使用user模块调用定义的username变量创建用户指定uid和组

ansible-playbook  一种定义的任务方式,在编写 playbook 时可以使用变量来传数据
playbook引用变量指的是在playbook中使用变量代理静态常量值,来实现动态的配置过程 ,通过引用变量 ,可以使playbook更具有灵活性和可重复性
{{name}}来引用变量

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

远端主机查看用户

ansible管理端主机操作

---
- hosts: 192.168.246.8remote_user: ky66    #2.6版本以后的参数,之前是sudo,意思为切换用户运行become: yes          #指定sudo用户为rootbecome_user: root

执行playbook时:ansible-playbook test04.yml -K <密码>

[root@localhost ~]#vim /etc/sudoers
不仅在playbook文件中设置sudo提权  还需要在对应的主机上实现sudo提权
[root@localhost playbook]#ansible-playbook test04.yaml -k -K
-k 指定ssh的登录密码
-K 大写需要输入用户的登录密码

这个也要提权,不然就会报错哦

echo "ky66 ALL=(ALL) ALL" >> /etc/sudoers

2.8when条件判断

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

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

2.8.1调用command模块shutdown服务

---
- hosts: web-z1remote_user: roottasks:- name: shutdown hostcommand: /sbin/shutdown -r nowwhen: ansible_default_ipv4.address == "192.168.246.8"#when指令中的变量名不需要手动加上 {{}} 或者用它when: inventory_hostname == "<主机名>"

when用来进行条件判断的关键字 ,其作用只在你指定条件下会执行下面的任务,当条件为真时,任务就会被执行,否则任务将被跳过

2.8.2调用service模块关闭httpd服务

---
- hosts: web-z1remote_user: roottasks:- name: test whenservice: name=httpd state=stoppedwhen: ansible_default_ipv4.address == "192.168.246.8"#当内置的变量ipv4.address等于192.168.246.8时调用service模块关闭httpd服务


2.9迭代

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

2.9.1批量创建目录

---
- name: play1hosts: web-z1gather_facts: falsetasks:- name: create directoriesfile:path: "{{item}}"state: directorywith_items:- /mnt/nangjing- /mnt/hefei

2.9.2批量创建文件

---
- name: play1hosts: web-z1gather_facts: falsetasks:- name: create filefile:path: "{{item}}"state: touchwith_items:- /mnt/a.txt- /mnt/b.txt

远程主机查看

2.9.3批量创建目录、批量创建多个用户,并加入指定的组

---
- name: play1hosts: web-z1gather_facts: falsetasks:- name: create directoriesfile:path: "{{item}}"state: directorywith_items:          #等同于 loop:- /tmp/test1- /tmp/test2- name: add usersuser: name={{item.name}} state=present groups={{item.groups}}with_items:- name: test1groups: wheel- name: test2groups: root

远端主机查看

总结:

inventory主机清单管理
主机清单配置文件   /etc/ansible/hosts格式:
[组名]
主机IP[:ssh端口]     #默认是 22 端口
主机名[:ssh端口]
主机IP[0:255]        #设置连续的主机列表范围
主机名[a:z]    ansible_port=     ansible_user=    ansible_password=           #设置主机变量[组名:vars]             #设置组变量
ansible_port=
ansible_user=
ansible_password=[大组名:children]       #设置嵌套组
组名1
组名2
组名3playbook剧本
vim XXX.yaml  XXX.yml
---
- name:                 #设置play的名称hosts:                #指定执行此play的远程主机组remote_user:          #指定执行此play的用户#become:              #设置是否sudo切换#become_user:         #指定sudo切换的用户gather_facts:         #设置是否收集facts信息 yes|no|true|falsevars:                 #设置自定义变量tasks:                #指定此play的任务列表- name:                  #定义任务的名称模块名: 模块参数       #定义任务要使用的模块和参数(键值对格式)- name:  模块名: 模块参数ignore_errors: true    #忽略此任务的失败- name:  模块名: 模块参数notify: '任务名'       #定义此任务执行结果为changed状态时要触发的handlers任务- name:  模块名: 模块参数when:                  #定义条件表达式(== != > >= < <=),条件成立时执行此task任务,否则不执行此任务- name:  模块名: 模块参数={{item}}with_items:            #定义循环列表- name:  模块名: 模块参数tags:                  #定义任务的标签,ansible-playbook --tags="标签" 可实现仅执行拥有指定标签的任务(拥有always标签的任务总是执行)- 标签1- 标签2....handlers:- name: 任务名模块名: 模块参数ansible-playbook XXX.yaml -u -k -K  --syntax-check--list-task--list-hosts--start-at-task="任务名称"--tags="标签"tasks任务的模块语法格式:
纵向格式:模块名:参数1: 值参数2: "{{变量名}}"....
横向格式:模块名: 参数1=值  参数2={{变量名}} ....with_items 和 vars 的语法格式
纵向格式:- name:with_items:- 值1- 值2....模块名: 参数={{item}}vars:变量名:- 值1- 值2....tasks:- name:模块名: 参数={{item}}with_items: "{{变量名}}"#值为对象类型(键值对字段)时:with_items:- key1: 值1key2: 值2- key1: 值3key2: 值4....vars:变量名:- key1: 值1key2: 值2- key1: 值3key2: 值4....横向格式:#值为纯量类型时:with_items: [值1, 值2, ....]vars:变量名: [值1, 值2, ....]#值为对象类型(键值对字段)时:with_items:- {key1: 值1, key2: 值2}- {key1: 值3, key2: 值4}....template配置模板模块
1)先准备一个 XXX.j2 配置模板文件,在模板文件中使用 {{变量名}} 格式引用主机变量、组变量、facts信息字段变量或vars字段自定义的变量的值
2)编辑 playbook 文件,在文件中的 tasks 任务中定义 template 模块配置(template: src=XXX.j2文件路径 dest=远程主机文件路径)roles角色的作用?
可以把playbook剧本里的各个play看作为一个角色,将各个角色的tasks任务、vars变量、template模板和copy、script模块使用的相关文件等内容放置在指定角色的目录里统一管理,在需要的时候可在playbook中使用roles角色直接调用即可。也就是说roles角色可以在playbook中实现代码的复用。roles/                         #角色总目录,其每个子目录就是一个角色目录nginx/                         #相当于playbook中的每一个play主题,目录名就是角色名files/                         #存放copy、script模块调用的文件templates/                     #存放template模块调用的 XXX.j2 模板文件tasks/main.yml                 #定义此角色的tasks普通任务列表handlers/main.yml              #定义此角色通过notify触发时执行的handlers处理器任务列表vars/main.yml                  #定义此角色用的自定义变量defaults/main.yml              #定义此角色用的默认变量(一般不用)meta/main.yml                  #定义此角色的元数据信息和依赖关系mysql/.... php/....vim XXX.yaml
- name:hosts:remote_user:roles:- nginx- mysql- phpansible-playbook XXX.yaml

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

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

相关文章

RabbitMQ的介绍和使用

1.同步通讯和异步通讯 举个例子&#xff0c;同步通讯就像是在打电话&#xff0c;因此它时效性较强&#xff0c;可以立即得到结果&#xff0c;但如果你正在和一个MM打电话&#xff0c;其他MM找你的话&#xff0c;你们之间是不能进行消息的传递和响应的 异步通讯就像是微信&#…

05-06 周一 Shell工程目录划分和开发最佳实践

05-06 周一 Shell工程目录划分和开发最佳实践 时间版本修改人描述2024年5月6日10:34:13V0.1宋全恒新建文档2024年5月6日11:07:12V1.0宋全恒完成 简介 之前楼主曾经完成过一个shell工程的开发&#xff0c;记得当时项目名称叫做campus-shell&#xff0c;主要是用来一键完成多个模…

经典面试题之滑动窗口专题

class Solution { public:int minSubArrayLen(int target, vector<int>& nums) {// 长度最小的子数组 // 大于等于 targetint min_len INT32_MAX;// 总和int sum 0;int start 0; // 起点for(int i 0; i< nums.size(); i) {sum nums[i];while(sum > targe…

TitanIDE安装常见问题解答

在软件开发和编程的世界里&#xff0c;集成开发环境&#xff08;IDE&#xff09;扮演着至关重要的角色。TitanIDE作为一款功能强大的开发工具&#xff0c;深受广大开发者的喜爱。然而&#xff0c;在安装和使用TitanIDE的过程中&#xff0c;开发者们往往会遇到一些问题和挑战。针…

毕业就业信息|基于Springboot+vue的毕业就业信息管理系统的设计与实现(源码+数据库+文档)

毕业就业信息管理系统 目录 基于Springboot&#xff0b;vue的毕业就业信息管理系统设计与实现 一、前言 二、系统设计 三、系统功能设计 1学生信息管理 2 公司信息管理 3公告类型管理 4公告信息管理 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设…

【阿道的成长日记】明确自己的人生主线,摆脱内耗低效能!

在职场中&#xff0c;许多人都会陷入这样的困境&#xff1a; &#x1f614;“对现在的工作厌倦不已&#xff0c;每天都感到痛苦&#xff0c;想要辞职。” &#x1f635;‍&#x1f4ab;“不确定自己适合从事哪种工作&#xff1f;现在这份工作是否真正适合我&#xff1f;” &…

C++ 数据内存分布揭秘:从栈到堆的探索之旅

目录 1. 栈(Stack) 2. 堆(Heap) malloc和new的区别 堆与栈在C中的异同点详解 3. 数据段(Data Segment) 4. 代码段(Code Segment) 5. 动态内存分配的陷阱 当我们谈论C编程时&#xff0c;对内存布局的理解至关重要。本文将深入探讨C中各种变量和数据结构在内存中的分布情况…

【busybox记录】【shell指令】comm

目录 内容来源&#xff1a; 【GUN】【comm】指令介绍 【busybox】【comm】指令介绍 【linux】【comm】指令介绍 使用示例&#xff1a; 逐行比较两个排序后的文件 - 默认输出 逐行比较两个排序后的文件 - 如果一个文件的排序有问题&#xff0c;那么反错&#xff08;默认&…

[HUBUCTF 2022 新生赛]checkin

数组反序列化弱比较 <?php $info array(username>true,password>true); echo serialize($info); ?> //?infoa:2:{s:8:"username";b:1;s:8:"password";b:1;}1.构造不能用类&#xff0c;因为$data_unserialize只是一个变量&#xff0c;不能…

nginx模型设计和进程讲解

一. Nginx进程模型解析 1. master主进程 和 worker工作进程 [rootlocalhost sbin]# ps -ef|grep nginx root 15411 1 0 21:08 ? 00:00:00 nginx: master process ./nginx nobody 15412 15411 0 21:08 ? 00:00:00 nginx: worker process root…

VALSE 2024 Tutorial内容总结--开放词汇视觉感知

视觉与学习青年学者研讨会&#xff08;VALSE&#xff09;旨在为从事计算机视觉、图像处理、模式识别与机器学习研究的中国青年学者提供一个广泛而深入的学术交流平台。该平台旨在促进国内青年学者的思想交流和学术合作&#xff0c;以期在相关领域做出显著的学术贡献&#xff0c…

[正则表达式]正则表达式语法与运用(Regular Expression, Regex)

0. 在线工具 RegExr: Learn, Build, & Test RegEx 1. 场景列举 vim Linux命令行 sublime 编辑器 java、python等语言中 ... ... 不同场景、不同版本语法可能不一样 2. 以下示例数据与基本语法 &2024 &As20242024# 2024sA#abdcefgha_bdcefghABASDSADAASDASD…