自动化运维:Ansible基础与命令行模块操作
目录
一、理论
1. Ansible
2.部署Ansible自动化运维工具
3.Ansible常用模块
4.hostsinverntory主机清单
二、实验
1.部署Ansible自动化运维工具
2.ansible 命令行模块
3.hostsinverntory主机清单
三、问题
1. ansible远程shell失败
2.组变量查看webservers内主机ip报错
编辑
3.组嵌套查看webs内主机ip报错
四、总结
一、理论
1. Ansible
(1)概念
Ansible是基于模块工作的,只是提供了一种运行框架,本身没有完成任务的能力,真正操作的是Anisble的模块。每个模块都是独立的、实现了批量系统配置、批量程序部署、批量运行命令等功能。
Ansible是一款简洁、高效的运维自动化工具。只需要将ansible安装在主控机器上,就可以通过SSH协议实现针对大量受管服务器的批量化、剧本化的管理。通过过Ansible实现远程控制,主控机=被控机,通过SSH实现。基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
(2)架构
Ansible架构中有两种计算机类型,即控制节点和受管主机。 Ansible在控制节点上安装和运行,计算机上也含有Ansible项目文件的副本。控制节点可以是管理员的笔记本电脑、多个管理员共享的系统,或者运行红帽Ansible Tower的服务器。
受管主机列在清单中,清单还可以将这些系统组织到组中,以便于集中管理。清单可以在静态文本文件中定义,或者通过从外部来源获取信息的脚本来动态确定。
Ansible用户无需编写复杂的脚本,而只要创建高级别play即可确保主机或主机组处于特定状态。 Play按该play指定的顺序对主机执行一系列任务。这些play通过采用YAML格式的文本文件来表达。包含一个或多个play的文件称为playbook。
每个任务运行一个模块,即(使用Python, Powershell或某种其他语言编写的)一小段代码。各个模块基本上是您的工具包中的一个工具。Ansible随附了数百个实用模块,它们能够执行许多不同的自动化任务。它们可以作用于系统文件,安装软件或者进行AP调用。
在任务中使用时,模块通常确保计算机的某一特定方面处于特定的状态。例如,使用某一模块的任务可以确保某一文件存在且具有特定的权限和内容,而使用另一不同模块的任务可确保已挂载特定的文件系统。如果系统不处于指定的状态,任务应将它置于该状态。如果系统已处于该状态,则不执行任何操作。如果任务失败, Ansible的默认行为是对发生了错误的主机中止playbook的其余部分。
QA任务、play和playbook设计为具有幂等性。这意味着,您可以在相同主机上多次安全地运行一个playbooko当您的系统处于正确状态时, playbook在运行时不会进行任何更改。这意味着,您应该能够在相同主机上多次安全地运行一个playbook。当您的系统处于正确状态时, playbook在运行时不应进行任何更改。您可以使用多个模块来运行任意命令。但是,您必须小心使用这些模块,以确保它们以幂等方式运行。
Ansible也使用插件。插件是您可以添加到Ansible中的代码,以对它进行扩展并使它适合新的用途和平台。
Ansible架构是无代理的。通常,当管理员运行Ansible Playbook或临时命令时,控制节点使用SSH (默认)或WinRM连接受管主机。这意味着客户端无需在受管主机上安装特定于Ansible的代理,也不需要允许将特殊的网络流量传输到某一非标准端口。
(3)特点
①部署简单,只需要主控端部署Ansible环境,被控端无需做任何操作;
②默认使用SSH协议设备进行管理;
③主从集中化管理;
④配置简单、功能强大、扩展性强;
⑤支持API及自定义模块,可以通过Python轻松扩展
⑥通过playbooks来定制强大的配置、状态管理
⑦对云平台和大数据都有很好的支持
(4)优势
①轻便性:无需在被控制服务器上安装客户端,Ansible基于ssh协议
②幂等性:大部分模块有幂等性,即如果输入systemctl stop firewalld当发现要停止的服务已经停止就不会做任何操作了,多次停止不会改变结果。systemtl restart是非幂等的。
③判断性:大部分模块在执行时都会判断目标节点是否要执行任务,所有重复执行某个任务大部分时间不会产生副作用
④简介性:一个窗口即可管理所有需要控制的机器,无需开启多个窗口
(5)核心程序
①HostInventory:记录由Ansible管理的主机信息,端口,ip,密码等
②playbooks:'剧本'YAML格式文件,多任务定义在一个文件中,定义主机需要调用那些模块完成功能
③core modeules:核心模块主要操作通过调用核心模块来完成管理任务
④customodules:自定义模块,完成核心模块无法完成的模块,支持多种语言编写
⑤connectiontugins:连接插件,ansible和主机通信使用(ssh协议)
(6)工作原理及流程
①加载自己的配置文件,默认/etc/ansible/ansible.cfg
②查找对应的主机的配置文件,找到要执行的主机或组/etc/ansible/hosts文件
③加载自己对应的模块文件,如command、yum、ping、
④通过ansible将模块命令生成对应的临时py文件(类似python脚本),并将该文件传输至被管理端
⑤传输到在被控制端的对应用户的家目录下.ansible/tmp/xxx/xxx.py
⑥被控制端给传输过来的py文件加执行权限
⑦执行并返回结果,执行完成后删除py文件并sleep 0退出
2.部署Ansible自动化运维工具
环境
表1 主机
管理端 | 192.168.111.199 | ansible |
被管理端 | 192.168.111.69 | |
被管理端 | 192.168.111.186 | |
被管理端 | 192.168.111.100 |
(1)部署
yum install -y epel-release
#安装epel-release
yum install -y ansible
#安装ansible
#配置文件位置:/etc/ansible/ansible
#hosts文件位置:/etc/ansible/hosts
vim /etc/ansible/hosts
#编辑hosts文件添加被管理的机器,内容如下[webservers] #配置组名
192.168.204.69 #组里包含的被管理的主机IP地址或主机名(主机名需要先修改/etc/hosts文件)[dbservers]
192.168.204.186
#[webservers]、[dbservers]各为一个组,组内1个服务器,添加完毕保存退出
配置密钥对验证#使用ssh免交互,需要下载sshpass工具,参考sshpass免密登录
ssh-keygen -t rsa #一路回车,使用免密登录(配置密钥对验证)
sshpass -p '123123' ssh-copy-id root@192.168.204.69
sshpass -p '123123' ssh-copy-id root@192.168.204.186
或者直接输入ssh-copy-id root@192.168.204.69 #上传公钥到被控制端
ssh-copy-id root@192.168.204.185#进入生成的公钥路径将公钥传输给备管理的服务器,传输需要输入每台备管理服务的root密码ansible ansible-doc -l
#安装完毕,此命令可以查看有哪些ansible模块,按q退出ansible webservers -m command -a 'pwd'
#安装完成尝试管理webservers组输入pwd命令
ansible all -a 'ls'
#安装完成尝试管理所有hosts中主机输入ls命令,不指定模块默认为command模块
ansible 192.168.204.69 -m -a 'ls'
#安装完成尝试管理192.168.204.69服务器输入pwd命令
3.Ansible常用模块
(1) ansible命令行模块
命令格式:ansible <组名>/ip -m <模块> -a<参数列表>
ansible-doc -s 模块
#-s 列出指定模块的描述信息和操作动作
ansible-doc -s command
[root@ansible ansible]# ansible-doc -s command
- name: Execute commands on targetscommand:argv: # Passes the command as a list rather than a string. Use `argv' to avoid quoting values that would otherwise be interpretedincorrectly (for example "user name"). Only the string or the list form can be provided, not both.One or the other must be provided.chdir: # Change into this directory before running the command.cmd: # The command to run.creates: # A filename or (since 2.0) glob pattern. If it already exists, this step *won't* be run.free_form: # The command module takes a free form command to run. There is no actual parameter named 'free form'.removes: # A filename or (since 2.0) glob pattern. If it already exists, this step *will* be run.stdin: # Set the stdin of the command directly to the specified value.stdin_add_newline: # If set to `yes', append a newline to stdin data.strip_empty_ends: # Strip empty lines from the end of stdout/stderr in result.warn: # Enable or disable task warnings.
(2) command模块
此模块不能使用管道符和重定向,指定模块默认为commend模块
举例:ansible webservers -m command -a 'date'
调用command模块在192.168.204.69服务器上执行ls命令,若不指定则默认为command模块
#指定 ip 执行 date
ansible 192.168.204.69 -m command -a 'date'#指定组执行 date
ansible webservers -m command -a 'date'
ansible dbservers -m command -a 'date' #all 代表所有 hosts 主机
ansible all -m command -a 'date' #如省略 -m 模块,则默认运行 command 模块
ansible all -a 'ls /'
常用的参数:
表2 command常用参数
chdir | 在远程主机上运行命令前提前进入目录 |
creates | 判断指定文件是否存在,如果存在,不执行后面的操作 |
removes | 判断指定文件是否存在,如果存在,执行后面的操作 |
ansible all -m command -a "chdir=/home ls ./"
(3) shell模块
用远程主机的shell进程,打开一个子shell进行命令操作,支持管道符和重定向。
在远程主机执行命令,相当于调用远程主机的shell进程,然后在该shell下打开一个子shell运行命令(支持管道符号等功能)。
举例:ansible webservers -m shell -a 'ifconfig ens33 |awk "NR==2{print \$2}"'
提取webservers组中的所有ip地址,注意双引号不识别变量所以要加转义符\
列出指定模块的描述信息和操作动作
ansible-doc -s shell
首先在192.168.204.186服务器上创建一个用户
[root@localhost ~]# useradd test
使用shell给dbservers组中的服务器中的用户设置密码
ansible dbservers -m shell -a 'echo 666666 | passwd --stdin test'
截取dbservers组中主机的ip
ansible dbservers -m shell -a 'echo $(ifconfig ens33 | awk "NR==2 {print $2}") | cut -d " " -f2'ansible dbservers -m shell -a 'echo $(ifconfig ens33 | awk "NR==2 {print \$2}")'
(4)cron模块
远程主机定义计划任务,2种状态present(添加)和absent(移除),默认为present。
举例:ansible webservers -m cron -a 'name=crontest hour="*/12" day="*/1" job="/usr/bin/echo cron test " '
ansible webservers -m cron -a "name=crontest state=absent"
列出指定模块的描述信息和操作动作
#按 q 退出
ansible-doc -s cron
常用的参数:
表3 cron常用参数
minute/hour/day/month/weekday | 分/时/日/月/周 |
job | 任务计划要执行的命令 |
name | 任务计划的名称 |
#每年 10 月 21 日 每2个小时的10 30 50分,执行一次输出helloworld的操作,名字就叫做test cron
ansible webservers -m cron -a 'minute="*10,30,50" hour="*/2" day="21" month="10" job="/bin/echo helloworld" name="test cron"'#查看计划任务
ansible webservers -a 'crontab -l' #移除计划任务,假如该计划任务没有取名字,name=None即可
ansible webservers -m cron -a 'name="test cron" state=absent'
(5) user模块
用户管理模块
举例:ansible webservers -m user -a 'name="crontest" uid="10086" group="root"'
ansible webservers -m user -a 'name=crontest state=absent remove=yes'
列出指定模块的描述信息和操作动作
#按 q 退出
ansible-doc -s user
常用的参数:
表4 user常用参数
name | 用户名,必选参数 |
state=present|absent | 创建账号或者删除账号,present表示创建,absent表示删除 |
system=yes|no | 是否为系统账号 |
uid | 用户uid |
group | 用户基本组 |
shell | 默认使用的shell |
move_home=yse|no | 如果设置的家目录已经存在,是否将已经存在的家目录进行移动 |
password | 用户的密码,建议使用加密后的字符串 |
comment | 用户的注释信息 |
remove=yes|no | 当state=absent时,是否删除用户的家目录 |
#创建用户test0
ansible dbservers -m user -a 'name="test0"'
ansible dbservers -m command -a 'tail /etc/passwd'#删除用户test0
ansible dbservers -m user -a 'name="test0" state=absent'
(6) group模块
用户组模块
常用参数: name:组名称 gid:组id system:是否为系统组
列举指定模块的描述信息和操作动作
ansible-doc -s group
#创建mysql组
ansible dbservers -m group -a 'name=mysql gid=306 system=yes'
ansible dbservers -a 'tail /etc/group'#创建用户test01
ansible dbservers -m user -a 'name="test01"' #将test01用户添加到mysql组中
ansible dbservers -m user -a 'name=test01 uid=306 system=yes group=mysql'
ansible dbservers -a 'tail /etc/passwd'
ansible dbservers -a 'id test01'
(7) copy模块
复制文件或输出内容到被控制服务器上
举例: ansible webservers -m copy -a "src=/a.txt dest=/opt/"
ansible webservers -m copy -a 'content="123456" dest=/opt/a.txt'
列举指定模块的描述信息和操作动作
ansible-doc -s copy
常用的参数:
表5 copy常用参数
dest | 指出复制文件的目标及位置,使用绝对路径,如果是源目录,指目标也要是目录,如果目标文件已经存在会覆盖原有的内容 |
src | 指出源文件的路径,可以使用相对路径或绝对路径,支持直接指定目录,如果源是目录则目标也要是目录 |
mode | 指出复制时,目标文件的权限 |
owner | 指出复制时,目标文件的属主 |
group | 指出复制时,目标文件的属组 |
content | 指出复制到目标主机上的内容,不能与src一起使用 |
ansible dbservers -m copy -a 'src=/etc/fstab dest=/opt/fstab.bak owner=root mode=640'
ansible dbservers -a 'ls -l /opt'
ansible dbservers -a 'cat /opt/fstab.bak'#将helloworld写入/opt/hello.txt文件中
ansible dbservers -m copy -a 'content="helloworld" dest=/opt/hello.txt'
ansible dbservers -a 'cat /opt/hello.txt'
(8) file模块
文件属性管理模块
常用参数:owner:文件的属主;group:文件属组;mode:文件权限;path:文件路径
指定的属主和属组不存在会报错
举例:ansible webservers -m file -a 'ower=lhj group=lhj mode=777 path=/opt/a.txt'
列举指定模块的描述信息和操作动作
ansible-doc -s file
#修改文件的属主属组权限等
ansible dbservers -m file -a 'owner=test01 group=mysql mode=644 path=/opt/fstab.bak' #设置/opt/fstab.link为/opt/fstab.bak的链接文件
ansible dbservers -m file -a 'path=/opt/fstab.link src=/opt/fstab.bak state=link' #创建一个文件
ansible dbservers -m file -a "path=/opt/abc.txt state=touch"#删除一个文件
ansible dbservers -m file -a "path=/opt/abc.txt state=absent"
(9)hostname模块
修改被控制端的主机名
参数:name:指定被控端的主机名
举例:ansible webservers -m hostname -a "name=ansible"
列举指定模块的描述信息和操作动作
ansible-doc -s hostname
修改主机名
#将dbservers中服务器得主机名修改为mysql01
ansible dbservers -m hostname -a "name=mysql01"#回到dbservers服务器中查看
su
(10) ping模块
检测ansible与被控端的网络连通性
举例:ansible webservers -m ping
列举指定模块的描述信息和操作动作
ansible-doc -s ping
#检测远程主机得连通性
ansible all -m ping#指定ip检测
ansible 192.168.204.186 -m ping
(11)yum模块
在远程主机上yum安装与卸载软件包
常用参数:name:指定要安装卸载的软件;state=present/absent,默认persent添加,absent卸载
举例:ansible webservers -m yum -a "name=httpd"
列举指定模块的描述信息和操作动作
ansible-doc -s yum
#dsbsrvers检测是否安装httpd
systemctl status httpdUnit httpd.service could not be found.#ansible给dsbsrvers安装服务
ansible dbservers -m yum -a 'name=httpd'#dsbsrvers检测httpd状态
systemctl status httpd● httpd.service - The Apache HTTP ServerLoaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)Active: inactive (dead)Docs: man:httpd(8)man:apachectl(8)#ansible给dsbsrvers卸载服务
ansible dbservers -m yum -a 'name=httpd state=absent' #dsbsrvers检测httpd状态
systemctl status httpdUnit httpd.service could not be found.
(12)service/system模块
管理远程被控制主机上的管理服务的运行状态
举例:ansible webservers -m service -a 'enabled=yes name=httpd state=started'
列举指定模块的描述信息和操作动作
ansible-doc -s service
常用的参数:
表6 service/system常用参数
name | 被管理的服务名称 |
state=started|stopped|restarted | 动作包含启动关闭或者重启 |
enabled=yes|no | 表示是否设置该服务开机自启 |
runlevel | 如果设定了enabled开机自启去,则要定义在哪些运行目标下自启动 |
# 给webservers安装httpd服务
ansible webservers -m yum -a 'name=httpd'#查看web服务器httpd运行状态
ansible webservers -a 'systemctl status httpd' 192.168.204.69 | FAILED | rc=3 >>
● httpd.service - The Apache HTTP ServerLoaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)Active: inactive (dead)Docs: man:httpd(8)man:apachectl(8)non-zero return code#启动httpd服务
ansible webservers -m service -a 'enabled=true name=httpd state=started' #查看web服务器httpd运行状态
ansible webservers -a 'systemctl status httpd' 192.168.204.69 | CHANGED | rc=0 >>
● httpd.service - The Apache HTTP ServerLoaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)Active: active (running) since 一 2023-08-28 14:55:51 CST; 5s agoDocs: man:httpd(8)man:apachectl(8)Main PID: 5304 (httpd)Status: "Processing requests..."CGroup: /system.slice/httpd.service├─5304 /usr/sbin/httpd -DFOREGROUND├─5307 /usr/sbin/httpd -DFOREGROUND├─5308 /usr/sbin/httpd -DFOREGROUND├─5309 /usr/sbin/httpd -DFOREGROUND├─5310 /usr/sbin/httpd -DFOREGROUND└─5311 /usr/sbin/httpd -DFOREGROUND
(13)script模块
实现远程批量运行本地的shell脚本
列举指定模块的描述信息和操作动作
ansible-doc -s script
在本地编写一个脚本
ansible服务器:
vim /test.sh
#编写/下的test.sh脚本内容如下
#!/bin/bash
echo "hello ansible from script" > /opt/script.txtchmod +x test.sh
ansible webservers -m script -a 'test.sh'
ansible webservers -a 'cat /opt/script.txt'
(14)setup模块
setup 模块可以获取这些信息 facts 组件收集d 被管理节点信息
参数:filter 过滤可配合正则表达式。
ansible webservers -m setup -a 'filter=*ipv4'
列举指定模块的描述信息和操作动作
ansible-doc -s setup
#获取mysql组主机的facts信息
ansible webservers -m setup #使用filter可以筛选指定的facts信息
ansible dbservers -m setup -a 'filter=*ipv4'
4.hostsinverntory主机清单
hosts配置文件位置:/etc/ansible/hosts;
Inventory支持对主机进行分组,每个组内可以定义多个主机,每个主机都可以定义在任何一个或多个主机组内
如果是名称类似的主机,可以使用列表的方式标识各个主机。
vim /etc/ansible/hosts
[webservers]
192.168.204.186:2222 #冒号后定义远程连接端口,默认是 ssh 的 22 端口
192.168.204.18[5:7][dbservers]
db-[a:f].example.org #支持匹配 a~f
(1)inventory 中的变量含义
Inventory变量名 | 含义 |
ansible_host | ansible连接节点时的IP地址 |
ansible_port | 连接对方的端口号,ssh连接时默认为22 |
ansible_user | 连接对方主机时使用的主机名。不指定时,将使用执行ansible或ansible-playbook命令的用户 |
ansible_password | 连接时的用户的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 | 提升为指定用户权限时的密码 |
(2)主机变量使用
写法1:
#webservers组中被控制端192.168.204.69的端口号为22登录时用户是root密码为123123[webservers]
192.168.204.69 ansible_port=22 ansible_user=root ansible_password=123123
192.168.204.186 ansible_port=22 ansible_user=root ansible_password=123123写法2:
#如果是名称类似的主机,可以使用列表的方式标识各个主机[webservers]
192.168.204.6[8:9] ansible_port=22 ansible_user=root ansible_password=abc123写法3:
#默认ssh管理时的端口为22,若不是22则直接在被管理ip后加冒号和对应端口号[webservers]
192.168.204.69:22
192.168.204.186:22
添加一台主机
[webservers]
192.168.204.69
192.168.204.100 ansible_port=22 ansible_user=root ansible_password=123123[dbservers]
192.168.204.186
查看webservers内得主机ip
ansible webservers -m command -a 'ifconfig'
(3)组变量使用
#表示为 webservers 组内所有主机定义变量
[webservers:vars]
ansible_user=root
ansible_password=123123#表示为所有组内的所有主机定义变量
[all:vars]
ansible_port=22
webservers 组内所有主机定义变量
[webservers]
192.168.204.69
192.168.204.100
192.168.204.186#表示webservers 组内所有主机定义变量控制时使用root账户密码为123123
[webservers:vars]
ansible_port=22
ansible_user=root
ansible_password=123123
(4)组嵌套使用
##php组
[php]
192.168.204.100#nginx组
[nginx]
192.168.204.69#httpd组
[httpd]
192.168.204.186#组内嵌为web
#表示web组的成员即children的直译‘孩子’包括php、nginx和httpd组
[web:children]
php
nginx
httpd
二、实验
1.部署Ansible自动化运维工具
(1)管理端安装 ansible
完成
如果要查看ansible的目录结构,可以安装树形查询工具
添加被管理主机的ip到管理端的配置组名中
配置密钥对验证
使用ssh免交互,需要下载sshpass工具
2.ansible 命令行模块
(1)查看ansible的命令模块
列出所有已安装的模块,按q退出
(2)command 模块
列举指定模块的描述信息和操作动作
指定 ip 执行 date
指定组执行 date
查看所有 hosts 主机
如省略 -m 模块,则默认运行 command 模块
查看右几个用户的家目录
(3)shell 模块
列举指定模块的描述信息和操作动作
首先在192.168.204.186服务器上创建一个用户
使用shell给dbservers组中的服务器中的用户设置密码
截取dbservers组中主机的ip
(4)cron 模块
列举指定模块的描述信息和操作动作
每年 10 月 21 日 每2个小时的10 30 50分,执行一次输出helloworld的操作,名字就叫做test cron
查看计划任务
移除计划任务
(5) user 模块
列举指定模块的描述信息和操作动作
创建用户test0
查看用户
删除用户test0
(6)group 模块
列举指定模块的描述信息和操作动作
创建mysql组
查看组
创建用户test01
将test01用户添加到mysql组中
查看用户
查看用户id和组id
(7)copy 模块
列举指定模块的描述信息和操作动作
将dbservers组中得/etc/fstab文件复制到 /opt目录中,并改名为fstab.bak,属主为root,权限为640
查看/opt目录中得文件属性
查看是否复制
将helloworld写入/opt/hello.txt文件中
查看文档内容
(8)file模块
列举指定模块的描述信息和操作动作
修改文件的属主属组权限等
设置/opt/fstab.link为/opt/fstab.bak的链接文件
创建一个文件
删除一个文件
(9)hostname 模块
列举指定模块的描述信息和操作动作
回到dbservers得服务器查看,可以切换名称
(10) ping 模块
列举指定模块的描述信息和操作动作
检测远程主机得连通性
指定ip检测
(11)yum 模块
列举指定模块的描述信息和操作动作
查看dbservers是否安装httpd服务
ansible给dbservers安装httpd服务
dbservers检测httpd服务
ansible给dbservers卸载服务
dbservers又找不到服务了
(12)service/systemd 模块
列举指定模块的描述信息和操作动作
给webservers安装httpd服务
查看webservers得httpd状态
启动httpd服务
再次 查看webservers得httpd状态
(13)script模块
列举指定模块的描述信息和操作动作
在本地编写一个脚本
给程序一个可执行得权限,执行程序,查看
(14)setup 模块
列举指定模块的描述信息和操作动作
获取mysql组主机的facts信息
使用filter可以筛选指定的facts信息
3.hostsinverntory主机清单
(1)主机变量
在ansible配置文件中添加一台新的主机
成功查看ip
(2) 组变量
编辑配置文件
为 webservers 组内所有主机定义变量
成功查看
(3)组嵌套
编辑配置文件
webs主机组包含php、nginx和httpd组
成功查看
三、问题
1. ansible远程shell失败
(1)报错
(2)原因分析
replace
过滤器中的一个逃逸问题。您需要替换双引号,该双引号将字符串转换为\"
。由于该字符串本身位于双引号字符串内,因此必须转义=> \\\n
(3)解决方法
去掉多余的双引号
2.组变量查看webservers内主机ip报错
(1)报错
(2)原因分析
从输出提示上基本可以了解到由于在本机的~/.ssh/known_hosts文件中并有fingerprint key串,ssh第一次连接的时候一般会提示输入yes 进行确认为将key字符串加入到 ~/.ssh/known_hosts 文件中
(3)解决方法
第一种:在本地先SSH登录一下对方设备,下次ansible 就可以正常操作了,但是比较麻烦
第二种:设置参数为不检查key
vim /etc/ansible/ansible.cfghost_key_checking = False #71行取消注释
如继续操作出现如下报错,需要修改被管理端/etc/hosts
注释被管理端域名
如继续操作出现如下报错,修改 /etc/ansible/hosts
返现密码输入错误
修改前
修改后
成功查看ip
3.组嵌套查看webs内主机ip报错
(1)报错
(2)原因分析
组嵌套名称错误
nginx与httpd主机已配置密钥对验证,需要对php做密钥对验
#一路回车,使用免密登录(配置密钥对验证)
ssh-keygen -t rsa [root@ansible ansible]# sshpass -p '123123' ssh-copy-id root@192.168.204.100
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keysNumber of key(s) added: 1Now try logging into the machine, with: "ssh 'root@192.168.204.100'"
and check to make sure that only the key(s) you wanted were added.
(3)解决方法
组嵌套名称web修改为webs
修改配置文件
修改前
修改后
ansible服务器对php做密钥对验
成功查询
四、总结
沟通是DevOps的关键。Ansible是第一款可以在整个IT范围读取和编写的自动化语言。它也是唯能够从头至尾自动化应用生命周期和持续交付管道的自动化引擎。
Ansible用户无需编写复杂的脚本,而只要创建高级别play即可确保主机或主机组处于特定状态。 Play按该play指定的顺序对主机执行一系列任务。这些play通过采用YAML格式的文本文件来表达。包含一个或多个play的文件称为playbook。
相关文章:

自动化运维:Ansible基础与命令行模块操作
目录 一、理论 1. Ansible 2.部署Ansible自动化运维工具 3.Ansible常用模块 4.hostsinverntory主机清单 二、实验 1.部署Ansible自动化运维工具 2.ansible 命令行模块 3.hostsinverntory主机清单 三、问题 1. ansible远程shell失败 2.组变量查看webservers内主机ip报…...

深度学习6:自然语言处理-Natural language processing | NLP
目录 NLP 为什么重要? 什么是自然语言处理 – NLP NLP 的2大核心任务 自然语言理解 – NLU|NLI 自然语言生成 – NLG NLP(自然语言处理) 的5个难点 NLP 的4个典型应用 NLP 的 2 种途径、3 个核心步骤 总结 自然语言处理 NLP 为什么重要? “语言…...

Mysql多表操作
文章目录 1. 概述2. 内连接3. 外连接4. 自连接5. 联合查询-union,union all6. 子查询 1. 概述 在项目开发中,在进行数据库表结构设计是,会根据业务需求和业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所…...

【leetcode 力扣刷题】数学题之计算次幂//次方:快速幂
利用乘法求解次幂问题—快速幂 50. Pow(x, n)372. 超级次方 50. Pow(x, n) 题目链接:50. Pow(x, n) 题目内容: 题目就是要求我们去实现计算x的n次方的功能函数,类似c的power()函数。但是我们不能使用power()函数直接得到答案,那…...

【核心复现】基于改进灰狼算法的并网交流微电网经济优化调度(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

Cannal监听binlog
文章目录 一、canal概念二、canal使用场景四、Canal工作原理Mysql主从复制原理 binlog中的二进制日志binlog格式选择 Canal消费方式应用实践总结 一、canal概念 canal是用java开发的基于数据库增量日志解析,提供增量数据订阅&消费的中间件。目前,ca…...

从零开发JavaWeb入门项目--十天掌握
原文网址:从零开发JavaWeb入门项目--十天掌握_IT利刃出鞘的博客-CSDN博客 简介 这是一个靠谱的JavaWeb入门项目实战,名字叫蚂蚁爱购。从零开发项目,视频加文档,十天就能学会开发JavaWeb项目,教程路线是:搭…...

数据结构——哈希表
哈希表 这里没有讲哈希表底层的概念,什么转红黑树,什么链表的,这篇文章主要讲的是如何用C实现哈希表,以及哈希表的基本概念。后面我会出一篇文章来讲C中hashmap中的底层逻辑的知识。 哈希表的概念 哈希表是一种数据结构࿰…...

Kafka3.0.0版本——手动调整分区副本示例
目录 一、服务器信息二、启动zookeeper和kafka集群2.1、先启动zookeeper集群2.2、再启动kafka集群 三、手动调整分区副本3.1、手动调整分区副本的前提条件3.2、手动调整分区副本的示例需求3.3、手动调整分区副本的示例 一、服务器信息 四台服务器 原始服务器名称原始服务器ip节…...

玩客云 线刷Armbian 搭配Alist 阿里云盘 Jellyfin NovaVideoPlayer搞电视墙
啰嗦的背景 喜欢看电影,买了个投影仪,是这一切折腾的开端。 投影仪虽然有当贝系统,但是想看的电影总是需要**电视会员,那我肯定是不用的。因为有爱腾优的会员,最开始都是使用手机投屏,当呗的投影仪好就好…...

9月1日,每日信息差
1、华大智造:已实现海外基因测序仪和测序试剂的量产,实现了海外基因测序仪和测序试剂的量产 2、邮储银行下调定存利率。价格表显示,整存整取,一年期存款年利率为1.58%,二年期年利率为1.85%,三年期年利率为…...

【大数据】Flink 详解(六):源码篇 Ⅰ
Flink 详解(六):源码篇 Ⅰ 55、Flink 作业的提交流程?56、Flink 作业提交分为几种方式?57、Flink JobGraph 是在什么时候生成的?58、那在 JobGraph 提交集群之前都经历哪些过程?59、看你提到 Pi…...

ShardingSphere——弹性伸缩原理
摘要 支持自定义分片算法,减少数据伸缩及迁移时的业务影响,提供一站式的通用弹性伸缩解决方案,是 Apache ShardingSphere 弹性伸缩的主要设计目标。对于使用单数据库运行的系统来说,如何安全简单地将数据迁移至水平分片的数据库上…...

Linux项目自动化构建工具-make/Makefile
一、什么是make和makefile make是一条指令 Makefile是当前目录下的一个文件 二、makefile文件编写 依赖关系::前为要目标文件,后为其依赖的文件 依赖方法:用依赖文件生成目标文件的具体指令 简便写法: $:表示目标文件 $^:表示…...

Python爬虫实战:自动化数据采集与分析
在大数据时代,数据采集与分析已经成为了许多行业的核心竞争力。Python作为一门广泛应用的编程语言,拥有丰富的爬虫库,使得我们能够轻松实现自动化数据采集与分析。本文将通过一个简单的示例,带您了解如何使用Python进行爬虫实战。…...

视频智能分析平台EasyCVR安防视频汇聚平台助力森林公园防火安全的应用方案
一、研发背景 随着经济的发展和人们生活水平的提高,越来越多的人喜欢在周末去周边的森林公园旅游,享受大自然的美景,并进行野炊和烧烤等娱乐活动。然而,近年来由于烟蒂和烧烤碳渣等人为因素,森林公园火灾频繁发生。森…...

跨境做独立站,如何低成本引流?
大家都知道,海外的消费习惯与国内不同,独立站一向是海外消费者的最喜欢的购物方式之一,这也吸引了许多跨境商家开设独立站。 独立站不同于其他的第三方平台,其他平台可以靠平台自身流量来获得转化,而独立站本身没有流…...

leetcode55.跳跃游戏 【贪心】
题目: 给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。 示例…...

探秘C语言扫雷游戏实现技巧
本篇博客会讲解,如何使用C语言实现扫雷小游戏。 0.思路及准备工作 使用2个二维数组mine和show,分别来存储雷的位置信息和排查出来的雷的信息,前者隐藏,后者展示给玩家。假设盘面大小是99,这2个二维数组都要开大一圈…...

Leetcode112. 路径总和
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 t…...

生成12位短id,自增且不连续,永不重复,不依赖数据库
基本思路: 设计模式:单例模式 是否加锁:是 synchronized 获取最后一次生成的时间戳值T0 限定初始时间为2023-08-01 00:00:00,获取当前时间时间戳T1,T1与初始时间的毫秒差值T2,转为16进制,转为字符串为r1,获取该字符串的长度L1…...

Zip压缩文件夹php打包函数代码
Zip压缩文件夹php打包函数代码,Zip相关函数是PHP的扩展功能,此函数可以直接复制使用。 以下是代码: <?php # 将文件夹的文件压缩到文件里 class Zip {/*** 将目标文件夹下的内容压缩到zip中(zip包含文件夹目录)* @param $sourcePath *文件夹路径 例: /home/test* @p…...

RISC-V交叉工具链riscv-gnu-toolchain编译
文章目录 1、下载2、编译1. 依赖安装2. 编译 3、运行 1、下载 $ sudo apt-get install git wget build-essential $ git clone https://github.com/riscv-collab/riscv-gnu-toolchain $ git checkout 2023.06.02注意上面 clone 的仓库,我们称其为构建脚本仓库&…...

我能“C“——指针进阶(上)
目录 指针的概念 1. 字符指针 2. 指针数组 3. 数组指针 3.1 数组指针的定义 3.2 &数组名VS数组名 3.3 数组指针的使用 4. 数组参数、指针参数 4.1 一维数组传参 4.2 二维数组传参 4.3 一级指针传参 4.4 二级指针传参 5. 函数指针 阅读两段有趣的代码&…...

SQLServer2008数据库还原失败 恢复失败
源地址:http://www.taodudu.cc/news/show-1609349.html?actiononClick 还原数据库问题解决方案 在还原数据库“Dsideal_school_db”时,有时会遇见上图中的问题“因为数据库正在使用,所以无法获得对数据库的独占访问权”,此时我们…...

【微服务部署】04-ForwardedHeaders
文章目录 1. ForwardedHeaders1.1 场景1.2 关键的HTTP头1.3 核心处理要点 1. ForwardedHeaders 1.1 场景 获取用户IP获取用户请求的原始URL 1.2 关键的HTTP头 X-Forwarded-ForX-Forwarded-ProtoX-Forwarded-Host 1.3 核心处理要点 设置PathBase设置ForwardedHeaders中间件…...

JVM 垃圾收集器
重点:CMS,G1,ZGC 主要垃圾收集器如下,图中标出了它们的工作区域、垃圾收集算法,以及配合关系。 Serial 收集器 Serial 收集器是最基础、历史最悠久的收集器。 如同它的名字(串行),…...

CSS 样式使用link和@import有什么区别
在页面导入样式时,使用link和import有以下区别: 位置:link标签可以放置在HTML文档的head或body中的任何位置,而import规则必须出现在CSS样式表的顶部。 加载方式:当浏览器解析到link标签时,会立即请求并加…...

LeetCode-2511-最多可以摧毁的敌人城堡数目
题目链接 代码实现: class Solution {/** 找 1 -> -1 的时候,经过0的最大个数* 解题思路:双指针*/public int captureForts(int[] forts) {int len forts.length;if(len1){return 0;}int max Integer.MIN_VALUE;boolean flag false;boo…...

iOS开发Swift-2-图片视图、App图标-赏月App
1.创建新项目 点击File - New - Project。 选择Single View App,点击Next。 填写文件信息,点击Next。 选择文件位置,点击Create。 修改App显示名称为 “赏月”。 2.设置背景色 选择Main,点击View界面,选择右边属性&…...