DevOps自动化运维实践_ansible-playbook的使用
DevOps自动化运维实践_命令行模式使用Ansiblehttps://blog.csdn.net/xiaochenXIHUA/article/details/159720420一、ansible-playbook的简介1.1、ansible-playbook的介绍playbook字面意思剧本现实中由演员按照剧本表演在Ansible中这次由计算机进行表演由计算机安装部署应用提供对外服务以及组织计算机处理各种各样的事情。1.2、为什么需要使用ansible-playbook执行一些简单的任务使用命令行模式可以方便的解决问题但是有时一个设施过于复杂需要大量的操作时候执行命令行模式是不适合的这时最好使用playbook就像执行shell命令与写shell脚本一样也可以理解为批处理任务不过playbook有自己的语法格式。1.3、ansible-playbook文件的格式ansible-playbook文件由YAML语言编写。YAML是一个类似 XML、JSON的标记性语言YAML强调以数据为中心并不是以标识语言为重点。因而YAML本身的定义比较简单号称“一种人性化的数据格式语言”。首先学习了解一下YAML的格式对后面书写playbook很有帮助。以下为playbook常用到的YAML格式序号yaml常用格式说明1大小写敏感2使用空格作为嵌套缩进工具缩进时不允许使用Tab键3缩进的空格数目不重要只要相同层级的元素左侧对齐即可4使用“-”横线 单个空格表示单个列表项5使用 “:”冒号 空格表示单个键值对6使用{}表示一个键值表playbook文件是通过【ansible-playbook】命令进行解析的ansbile-playbook命令会根据自上而下的顺序依次执行playbook文件中的内容。同时playbook开创了很多特性,它可以允许传输某个命令的状态到后面的指令,它也可以从一台机器的文件中抓取内容并附为变量然后在另一台机器中使用这使得playbook可以实现一些复杂的部署机制,这是ansible命令无法实现的。---- #文档开始 - 前言 - 目录 # 客户订单 date: 2026-04-06 customer: - name: ck items: - no: 20260406CP6534 - desc: cpu# Playbook文件格式 - apple - banana - Orange service: namehttpd staterestarted # 等价于如下的json格式 [ “apple”, “banana”, “orange” ]二、playbook的构成playbook是由一个或多个“play”组成的列表。play的主要功能在于将事先合并为一组的主机装扮成事先通过ansible定义好的角色。将多个play组织在一个playbook中就可以让它们联同起来按事先编排的机制完成一系列复杂的任务。playbook的构成部分说明target部分定义将要执行 playbook 的远程主机组variable部分定义playbook运行时需要使用的变量task部分定义将要在远程主机上执行的任务列表handler部分定义task 执行完成以后需要调用的任务2.1、Hosts和Usersplaybook中的每一个play的目的都是为了让某个或某些主机以某个指定的用户身份执行任务。playbook选项说明hosts用于指定要执行指定任务的主机每个playbook都必须指定hostshosts也可以使用通配符格式。主机或主机组在inventory清单中指定可以使用系统默认的【/etc/ansible/hosts】也可以自己编辑在运行的时候加上-i选项可指定自定义主机清单的位置。在运行清单文件的时候--list-hosts选项会显示那些主机将会参与执行任务的过程中。remote_user用于指定在远程主机上执行任务的用户。可以指定任意用户也可以使用sudo但是用户必须要有执行相应任务的权限。2.2、任务列表tasks listplay的主体部分是task list。内容说明任务执行task list中的各任务按次序逐个在hosts中指定的所有主机上执行即在所有主机上完成第一个任务后再开始第二个。在运行自上而下某playbook时如果中途发生错误则所有已执行任务都将回滚因此在更正playbook后需要重新执行一次。执行幂等性task的目的是使用指定的参数执行模块而在模块参数中可以使用变量。模块执行是幂等的幂等性 即一个命令,即使执行一次或多次, 其结果也一样这意味着多次执行是安全的因为其结果均一致。tasks包含name和要执行的模块name是可选的只是为了便于用户阅读建议加上去模块是必须的同时也要给予模块相应的参数。#定义tasks推荐使用module: options”的格式 service: namehttpd staterunning2.3、handlers用于当关注的资源发生变化时采取一定的操作。handlers是和“notify”配合使用的。【notify】这个动作可用于在每个play的最后被触发这样可以避免多次有改变发生时每次都执行指定的操作通过“notify”仅在所有的变化发生完成后一次性地执行指定操作。在notify中列出的操作称为handler也就是说notify用来调用handler中定义的操作。注意在 notify中定义的内容一定要和handlers中定义的“ - name”内容一样这样才能达到触发的效果否则会不生效。2.4、tagstags用于让用户选择运行或略过playbook中的部分代码。ansible具有幂等性因此会自动跳过没有变化的部分但是当一个playbook任务比较多时一个一个的判断每个部分是否发生了变化也需要很长时间。因此如果确定某些部分没有发生变化就可以通过tags跳过这些代码片断。2.5、playbook执行结果解析使用ansible-playbook运行playbook文件输出的内容为JSON格式。并且由不同颜色组成便于识别。一般而言输出内容中执行结果颜色绿色代表执行成功但系统保持原样黄色代表系统状态发生改变也就是执行的操作生效红色代表执行失败会显示错误信息。三、ansible-playbook各模块及应用示例3.1、shell模块#在远程主机(192.168.1.30)上执行命令用法与【command】模块一样不过shell模块执行命令时使用的是【/bin/sh】可执行任何命令 vi shell.yml #【shell.yml】文件的完整内容 - hosts: 192.168.1.30 remote_user: root vars: ansible_ssh_port: 22222 ansible_ssh_pass: admin123456 tasks: - name: ansible shell shell: ps -ef | grep sshd/tmp/sshd1.log; mkdir -p /data/cktest - name: ansible command command: touch /data/cktest/ck.log #执行命令 ansible-playbook shell.yml3.2、raw模块raw模块功能类似与前面说的command、shell能够完成的操作raw也都能完成。不同的是raw模块不需要远程主机上的python环境。ansible要执行自动化操作需要管理机上装ansible客户机上也需要安装python如果客户机上没有安装python模块那么command、shell模块将无法工作而raw却可以正常工作因此如果有的机器是没有装python或者说安装的python版本在python2.4以下就可以使用raw模块来装python、python-simplejson等。#raw模块示例 vi raw.yml #【raw.yml】完整内容 - hosts: 192.168.1.30 remote_user: root vars: ansible_ssh_port: 22222 ansible_ssh_pass: admin123456 tasks: - name: ansible raw test1 raw: ps -ef | grep sshd | awk {print $2}/tmp/sshd2.log - name: ansible raw test2 raw: dnf -y install python36-devel #执行命令 ansible-playbook raw.yml3.3、file模块file模块主要用于远程主机上的文件操作。file模块包含如下选项file模块选项说明force需要在两种情况下强制创建软链接《1》是源文件不存在但之后会建立的情况下《2》是目标软链接已存在,需要先取消之前的软链然后创建新的软链。有两个选项yes|nogroup定义文件/目录的属组mode定义文件/目录的权限owner定义文件/目录的属主path必选项定义文件/目录的路径recurse递归的设置文件的属性只对目录有效src要被链接的源文件的路径只应用于statelink的情况dest被链接到的目标路径只应用于statelink的情况state有如下几个选项directory表示目录如果目录不存在则创建目录。link创建软链接hard创建硬链接touch如果文件不存在则会创建一个新的文件如果文件或目录已存在则更新其最后修改时间absent删除目录、文件或者取消链接文件。#file模块示例 vi file.yml #【file.yml】文件的完整内容 - hosts: 192.168.1.30 remote_user: root vars: ansible_ssh_port: 22222 ansible_ssh_pass: admin123456 tasks: - name: mkdir ckdir directory file: path/data/ckdir statedirectory mode0755 - name: chmod siege file: dest/data/siege mode0755 recurseyes - name: link files file: src/etc/ssh/sshd_config dest/mnt/sshd_config ownersshd statelink - name: delete files file: path/mnt/Python-3.12.13.tgz stateabsent - name: chown files file: path/data/text1.txt ownernobody groupnobody mode0644 #执行命令 ansible-playbook file.yml3.4、Copy模块Copy模块用于复制文件到远程主机copy模块包含如下选项Copy模块选项说明backup在覆盖之前将原文件备份备份文件包含时间信息。有两个选项yes|nodest必选项。要将源文件复制到的远程主机的绝对路径如果源文件是一个目录那么该路径也必须是个目录directory_mode递归的设定目录的权限默认为系统默认权限force如果目标主机包含该文件但内容不同《1》如果设置为yes则强制覆盖《2》如果为no则只有当目标主机的目标位置不存在该文件时才复制。默认为yessrc要复制到远程主机的文件在本地的地址可以是绝对路径也可以是相对路径。如果路径是一个目录它将递归复制在这种情况下《1》如果路径使用”/”来结尾则只复制目录里的内容《2》如果没有使用”/”来结尾则包含目录在内的整个内容全部复制类似于rsync。#copy模块示例 vi copy.yml #【copy.yml】完整内容 - hosts: 192.168.1.30 remote_user: root gather_facts: false vars: ansible_ssh_port: 22222 ansible_ssh_pass: admin123456 tasks: - name: copy and chown copy: src/etc/sudoers dest/mnt/sudoers ownerroot grouproot mode440 backupyes - name: checking files copy: src/etc/sudoers dest/mnt/sudoers validatevisudo -cf %s - name: copy directory copy: src/etc/yum/ dest/mnt/bak ownercoffeemilk groupcoffeemilk directory_mode644 #执行命令 ansible-playbook copy.yml3.5、synchronize模块synchronize模块常用的选项有如下几个synchronize模块选项说明compress是否开启压缩默认开启copy_links复制链接文件默认为nodelete表示删除管理机中没有但远程主机存在的文件使两边内容一样以管理机为主默认为nosrc要复制到远程主机的文件在管理机上的路径如果路径是一个目录它将递归复制在这种情况下《1》如果路径使用”/”来结尾则只复制目录里的内容《2》如果没有使用”/”来结尾则包含目录在内的整个内容全部复制类似于rsync。dest要将文件复制到的远程主机的绝对路径dest_port默认为22端口走ssh协议表示远程主机端口mode可选push和pull模块《1》push模块的话一般用于从管理机向远程主机上传文件《2》pull模式用于从远程主机上取文件到管理机。注意使用这个模块的时候必须保证远程主机上有rsync这个命令不然会报错。#synchronize模块示例 #查看ansible所在主机是否已经安装了sync rpm -qa | grep rsync #创建synchronize示例文件 vi synchronize.yml #【synchronize.yml】文件的完整内容 - hosts: 192.168.1.30 remote_user: root vars: ansible_ssh_port: 22222 ansible_ssh_pass: admin123456 tasks: - name: synchronize rsync diretory synchronize: src/data/openclaw-main dest/mnt/sync deleteyes - name: synchronize rsync direcoty files synchronize: src/data/openclaw-main/ dest/mnt/sync2 deleteyes #执行命令 ansible-playbook synchronize.yml3.6、unarchive模块unarchive模块用来实现解压缩也就是将压缩文件解压分发到远程不同节点上。只需记住如下几个参数即可unarchive模块选项说明src源文件路径这个源文件在管理机上dest指定远程主机的文件路径mode设置远程主机上文件权限#unarchive模块示例 vi unarchive.yml #【unarchive.yml】文件完整内容 - hosts: 192.168.1.30 remote_user: root gather_facts: false vars: ansible_ssh_port: 22222 ansible_ssh_pass: admin123456 tasks: - name: unarchive files unarchive: src/data/HashTool_v1.4.0.zip dest/data - name: create directory file: path/data/HashTool666 statedirectory mode755 - name: unarchive files to speical directory unarchive: src/data/HashTool_v1.4.0.zip dest/data/HashTool666 #执行命令 ansible-playbook unarchive.yml3.7、service模块用于管理远程主机上的服务service模块选项说明enabled是否开机启动 yes|noname必选项服务名称pattern定义一个模式如果通过status指令来查看服务的状态时没有响应就会通过ps指令在进程中根据该模式进行查找如果匹配到则认为该服务依然在运行sleep如果执行了restarted在则stop和start之间沉睡几秒钟state对当前服务执行启动停止、重启、重新加载等操作started,stopped,restarted,reloaded#service模块示例 vi service.yml #【service.yml】文件的完整内容 - hosts: 192.168.1.30 remote_user: root gather_facts: false vars: ansible_ssh_port: 22222 ansible_ssh_pass: admin123456 tasks: - name: nginx restart service: namenginx staterestarted enabledyes #执行命令 ansible-playbook service.yml3.8、cron模块用于管理计划任务cron模块的选项说明backup对远程主机上的原任务计划内容修改之前做备份cron_file用来指定一个计划任务文件也就是将计划任务写到远程主机上/etc/cron.d目录下创建一个文件对应的计划任务。minute分钟0-59**/2……hour小时0-23**/2……day日1-31**/2,……month月1-12**/2……weekday周0-7*……job要执行的任务依赖于statepresentname定义定时任务的描述信息special_time特殊的时间范围参数reboot重启时,annually每年,monthly每月,weekly每周,daily每天,hourly每小时state确认该任务计划是创建还是删除,分别是present和absentpresent表示创建定时任务absent表示删除定时任务默认为present。user以哪个用户的身份执行job指定的任务。#cron模块示例 vi cron.yml #【cron.yml】文件的完整内容 - hosts: 192.168.1.30 remote_user: root gather_facts: false vars: ansible_ssh_port: 22222 ansible_ssh_pass: admin123456 tasks: - name: cron demo cron: backuptrue nameautobackup day*/1 hour3 minute16 userroot job/home/coffeemilk/backup.sh - name: delete cron cron: nameautobackup stateabsent #执行命令 ansible-playbook cron.yml3.9、yum模块使用yum包管理器来管理软件包yum模块选项说明config_fileyum的配置文件disable_gpg_check关闭gpg_checkdisablerepo禁用某个源enablerepo启用某个源name要进行操作的软件包的名字state表示要安装还是删除软件包要安装软件包可选择present安装、installed安装、 latest安装最新版本删除软件包可选择absent、removed。#yum模块示例 vi yum.yml #【yum.yml】文件的完整内容 - hosts: 192.168.1.30 remote_user: root gather_facts: false vars: ansible_ssh_port: 22222 ansible_ssh_pass: admin123456 tasks: - name: yum install epel yum: nameepel-release statelatest - name: yum install redis yum: nameredis statelatest enablerepoepel - name: redis restart service: nameredis staterestarted enabledyes4.0、user模块与group模块user模块是请求的是【useradd】【userdel】【usermod】三个指令goup模块请求的是【groupadd】【groupdel】【groupmod】三个指令。user模块与group模块选项说明name指定用户名group指定用户的主组groups指定附加组如果指定为(groups)表示删除所有组shell指定默认shellstate设置帐号状态不指定为默认为present表示创建指定值为absent表示删除remove当使用状态为stateabsent时使用类似于userdel --remove选项#user模块与group模块示例 vi user-group.yml #【user-group.yml】文件的完整内容 - hosts: 192.168.1.30 remote_user: root gather_facts: false vars: ansible_ssh_port: 22222 ansible_ssh_pass: admin123456 tasks: - name: create group group: namecktest statepresent - name: batch create user user: name{{item}} groupscoffeemilk,wheel with_items: - ck01 - ck02 - ck03 #执行命令 ansible-playbook user-group.yml4.1、lineinfile模块lineinfile模块实现对文件进行内容替换lineinfile模块选项说明path操作的远程主机上的文件路径regexp正则表达式要替换的内容规则line指定替换后的文本内容state当设置为absent代表删除匹配的行insertafter可以将文本插入到“指定的行”之后insertbefore可以将文本插入到“指定的行”之前backup进行替换操作前是否进行备份#lineinfile模块示例 vi lineinfile.yml #【lineinfile.yml】文件的完整内容 - hosts: 192.168.1.30 remote_user: root gather_facts: false vars: ansible_ssh_port: 22222 ansible_ssh_pass: admin123456 tasks: - name: 在ulimit开头的行后插入数据 lineinfile: path/data/testfile/profile insertafterulimit(.*) lineulimit -c ulimited - name: 将内容插入到文件末尾 lineinfile: path/data/testfile/profile lineexport JAVA_HOME/usr/jdk - name: 匹配文件中的内容然后将该行内容替换为指定内容 lineinfile: path/data/testfile/config regexpSELINUX(.*) lineSELINUXdisabled - name: 匹配文件中的内容然后将该行内容删除 lineinfile: path/data/testfile/resolv.conf regexpsearch(.*) stateabsent #执行命令 ansible-playbook lineinfile.yml4.2、setup模块获取Ansible facts信息Ansible facts是远程主机上的系统信息主要包含IP地址、操作系统版本、网络设备、mac地址、内存、磁盘、硬件等信息。这些信息对于需要根据远程主机的信息作为执行条件操作的场景非常有用。Ansible提供了一个setup模块来收集远程主机的系统信息这些facts信息可以直接以变量的形式使用。playbooks中经常会用到的一个参数【gather_facts】就与该模块相关gather_facts默认值为yes也就是说在使用Ansible对远程主机执行任何一个playbook之前总会先通过setup模块获取facts并将信息暂存在内存中直到该playbook执行结束。#获取远程主机的所有系统信息 ansible 192.168.1.30 -e ansible_port22222 -m setup -k #获取的所有系统信息数据格式都是JSON格式facts还支持查看指定信息使用关键字【filter】过滤如查看ipv4的信息 ansible 192.168.1.30 -e ansible_port22222 -m setup -k -a filteransible_all_ipv4_addresses