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

本文主要是介绍自动化运维管理工具 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

这篇关于自动化运维管理工具 Ansible-----【inventory 主机清单和playbook剧本】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/968973

相关文章

浅谈主机加固,六种有效的主机加固方法

在数字化时代,数据的价值不言而喻,但随之而来的安全威胁也日益严峻。从勒索病毒到内部泄露,企业的数据安全面临着前所未有的挑战。为了应对这些挑战,一种全新的主机加固解决方案应运而生。 MCK主机加固解决方案,采用先进的安全容器中间件技术,构建起一套内核级的纵深立体防护体系。这一体系突破了传统安全防护的局限,即使在管理员权限被恶意利用的情况下,也能确保服务器的安全稳定运行。 普适主机加固措施:

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念

实例:如何统计当前主机的连接状态和连接数

统计当前主机的连接状态和连接数 在 Linux 中,可使用 ss 命令来查看主机的网络连接状态。以下是统计当前主机连接状态和连接主机数量的具体操作。 1. 统计当前主机的连接状态 使用 ss 命令结合 grep、cut、sort 和 uniq 命令来统计当前主机的 TCP 连接状态。 ss -nta | grep -v '^State' | cut -d " " -f 1 | sort |

如何使用Ansible实现CI/CD流水线的自动化

如何使用Ansible实现CI/CD流水线的自动化 持续集成(CI)和持续交付(CD)是现代软件开发过程中的核心实践,它们帮助团队更快地交付高质量的软件。Ansible,作为一个强大的自动化工具,可以在CI/CD流水线中发挥关键作用。本文将详细介绍如何使用Ansible实现CI/CD流水线的自动化,包括设计流水线的结构、配置管理、自动化测试、部署、以及集成Ansible与CI/CD工具(如Jen

BIRT 报表的自动化测试

来源:http://www.ibm.com/developerworks/cn/opensource/os-cn-ecl-birttest/如何为 BIRT 报表编写自动化测试用例 BIRT 是一项很受欢迎的报表制作工具,但目前对其的测试还是以人工测试为主。本文介绍了如何对 BIRT 报表进行自动化测试,以及在实际项目中的一些测试实践,从而提高了测试的效率和准确性 -------

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《考虑燃料电池和电解槽虚拟惯量支撑的电力系统优化调度方法》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源程序擅长文章解读,论文与完整源程序,等方面的知识,电网论文源程序关注python

【虚拟化】AIO主机安装PVE8,配置网络,安装win11(virtio,qcow2,scsi,oobe,adk)

【虚拟化】AIO主机安装PVE8,配置网络,安装win11(virtio,qcow2,scsi,oobe,adk) 文章目录 1、ESXI vs PVE,AIO主机系统二选一2、PVE网络配置(DNS,换源,网卡,https,概览)3、win11虚拟化配置(virtio,raw,qcow2)附,域名解析,rocky9.4,黑群晖 1、ESXI vs PVE,AIO主机系统二选

自动化表格处理的革命:智能文档系统技术解析

在当今数据驱动的商业环境中,表格数据的自动化处理成为了企业提高效率、降低成本的关键。企业智能文档系统在智能表格识别方面展现出卓越的性能,通过精准识别和处理各种通用表格,显著提升了企业文档管理的智能化水平。本文将深入探讨该系统在表格识别方面的关键技术和应用优势,以及如何通过行业定制化服务满足不同行业的需求。 1. 通用表格识别 智能文档系统通过先进的OCR技术和表格结构识别算法,能够精准

网络安全运维培训一般多少钱

在当今数字化时代,网络安全已成为企业和个人关注的焦点。而网络安全运维作为保障网络安全的重要环节,其专业人才的需求也日益增长。许多人都对网络安全运维培训感兴趣,那么,网络安全运维培训一般多少钱呢?   一、影响网络安全运维培训价格的因素   1. 培训内容的深度和广度   不同的网络安全运维培训课程涵盖的内容有所不同。一些基础的培训课程可能主要涉及网络安全基础知识、常见安全工具的使用等,价

ansible资料

ansible系列教程-强烈推荐看完ansible官方编写的例子ansible_uiJenkins配置ansiblegalaxy官方文档中文教程1中文教程2playbook进阶YAML语法fabric编写的自动化部署