自动化运维: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.199ansible
被管理端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_hostansible连接节点时的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。
 

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

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

相关文章

基于Java+SpringBoot+Vue前后端分离美食推荐商城设计和实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

时间和日期--Python

1. 时间&#xff1a;time模块 总结&#xff1a;2. datetime模块 相比与time模块&#xff0c;datetime模块的接口更直观、更容易调用 2.1 datetime模块定义的类 &#xff08;1&#xff09;datetime.date:表示日期的类。常用的属性有&#xff1a;year、month、day; &#xff…

vue中form、table和input标签过长

form标签过长 效果&#xff1a; 代码&#xff1a; <el-form-item v-for"(item,index) in ticketEditTable1" :label"item.fieldNameCn" :propitem.fieldName :key"item.fieldNameCn" overflow"":rules"form[item.fieldName…

Android中使用JT808协议进行车载终端通信的实现和优化

JT808是一种在中国广泛应用的车载终端通信协议&#xff0c;用于车辆与监控中心之间的数据通信。下面是关于Android平台上使用JT808协议进行通信的一般步骤和注意事项&#xff1a; 协议了解&#xff1a;首先&#xff0c;您需要详细了解JT808协议的规范和定义。该协议包含了通信消…

【halcon深度学习】图像分割数据集格式的转换

前言 目前用于**图像分割的**数据集&#xff0c;我目前接触到的用的比较多的有&#xff1a; 1 PASCAL VOC 2 COCO 3 YOLO 4 Halcon自己的格式&#xff08;其实就是Halcon字典类型&#xff09;当前我涉及到计算机视觉中的数据集格式有&#xff0c;PASCAL VOC、COCO 和 YOLO 用于…

软件设计师学习笔记3-CPU组成

目录 1.计算机结构 1.1计算机的外设与主机 1.2计算机各部分之间的联系(了解一下即可) 2.CPU结构 1.计算机结构 1.1计算机的外设与主机 1.2计算机各部分之间的联系(了解一下即可) 该图片来自希赛软考 注&#xff1a;黄色的是传递数据的数据总线&#xff0c;白色的是传递控…

表和Json的相互操作

目录 一、表转Json 1.使用 for json path 2.如何返回单个Json 3.如何给返回的Json增加一个根节点呢 4.如何给返回的Json增加上一个节点 二、对Json基本操作 1.判断给的字符串是否是Json格式 2.从 JSON 字符串中提取标量值 3. 从 JSON 字符串中提取对象或数组 4. 更…

【Linux】进程概念,轻松入门【下篇】

目录 1. 基本概念 2. 常见环境变量 常见环境变量指令 &#xff08;1. PATH &#xff08;2. HOME &#xff08;3. SHELL 3.环境变量的组织形式 &#xff08;1&#xff09;通过代码如何获取环境变量 &#xff08;2&#xff09;普通变量与环境变量的区别 &#xff08;3&…

206.Flink(一):flink概述,flink集群搭建,flink中执行任务,单节点、yarn运行模式,三种部署模式的具体实现

一、Flink概述 1.基本描述 Flink官网地址:Apache Flink — Stateful Computations over Data Streams | Apache Flink Flink是一个框架和分布式处理引擎,用于对无界和有界数据流进行有状态计算。 2.有界流和无界流 无界流(流): 有定义流的开始,没有定义结束。会无休止…

[当前就业]2023年8月25日-计算机视觉就业现状分析

计算机视觉就业现状分析 前言&#xff1a;超越YOLO&#xff1a;计算机视觉市场蓬勃发展 如今&#xff0c;YOLO&#xff08;You Only Look Once&#xff09;新版本的发布周期很快&#xff0c;每次迭代的性能都优于其前身。每 3 到 4 个月就会推出一个升级版 YOLO 变体&#xf…

数据通信——RIP协议

一&#xff0c;实验背景 你们公司又订购了一批设备&#xff0c;你以为还要为新员工设计静态路由&#xff0c;结果领导说&#xff0c;不是有动态路由吗&#xff1f;用动态路由&#xff0c;就用什么R的那个。“垃圾RIP&#xff0c;用RIP还不如静态&#xff0c;RIP缺点太多&#x…

25-非父子通信 - event bus 事件总线

作用:非父子组件之间&#xff0c;进行简易消息传递。(复杂场景 -> Vuex) 1.创建一个都能访问到的事件总线(空 Vue 实例) -> utils/EventBus.js import Vue from vue const Bus new Vue() export default Bus 2. A组件(接收方),监听 Bus实例 的事件(支持多个组件同时监…

SSL核心概念 SSL类型级别

SSL&#xff1a;SSL&#xff08;Secure Sockets Layer&#xff09;即安全套接层&#xff0c;及其继任者传输层安全&#xff08;Transport Layer Security&#xff0c;TLS&#xff09;是为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层对网络连接进行加密。 H…

探索内网穿透工具:实现局域网SQL Server数据库的公网远程访问方法

文章目录 1.前言2.本地安装和设置SQL Server2.1 SQL Server下载2.2 SQL Server本地连接测试2.3 Cpolar内网穿透的下载和安装2.3 Cpolar内网穿透的注册 3.本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4.公网访问测试5.结语 1.前言 数据库的重要性相信大家都有所了解&…

下一代存储解决方案:湖仓一体

文章首发地址 湖仓一体是将数据湖和数据仓库相结合的一种数据架构&#xff0c;它可以同时满足大数据存储和传统数据仓库的需求。具体来说&#xff0c;湖仓一体可以实现以下几个方面的功能&#xff1a; 数据集成&#xff1a; 湖仓一体可以集成多个数据源&#xff0c;包括结构…

私有化部署即时通讯平台,30分钟替换钉钉和企业微信

随着企业对即时通讯和协作工具的需求不断增长&#xff0c;私有化部署的即时通讯平台成为企业的首选。WorkPlus作为有10余年行业深耕经验与技术沉淀品牌&#xff0c;以其安全高效的私有化部署即时通讯解决方案&#xff0c;帮助企业在30分钟内替换钉钉和企业微信。本文将深入探讨…

JavaWeb学习-Day10

SpringBootWeb案例 准备工作 开发流程&#xff1a; 开发接口步骤&#xff1a; 删除部门&#xff1a; 新增部门&#xff1a; 简化代码&#xff1a; limit:分页展示&#xff0c;公式&#xff1a;&#xff08;页数-1&#xff09;*页面总数&#xff0c;页面总数 目前出现的问题&am…

STM32 CubeMX (H750)RGB屏幕 LTDC

STM32 CubeMX STM32 RGB888 LTDC STM32 CubeMX一、STM32 CubeMX 设置时钟树LTDC使能设置屏幕参数修改RGB888的GPIO 二、代码部分效果 RGB屏幕线束定义&#xff1a; 一、STM32 CubeMX 设置 时钟树 这里设置的时钟&#xff0c;关于刷新速度 举例子&#xff1a;LCD_CLK24MHz 时…

【大数据知识】大数据平台和数据中台的定义、区别以及联系

数据行业有太多数据名词&#xff0c;例如大数据、大数据平台、数据中台、数据仓库等等。但大家很容易混淆&#xff0c;也很容易产生疑问&#xff0c;今天我们就来简单聊聊大数据平台和数据中台的定义、区别以及联系。 大数据平台和数据中台的定义 大数据平台&#xff1a;一个…

浅谈 Linux 下 vim 的使用

Vim 是从 vi 发展出来的一个文本编辑器&#xff0c;其代码补全、编译及错误跳转等方便编程的功能特别丰富&#xff0c;在程序员中被广泛使用。 Vi 是老式的字处理器&#xff0c;功能虽然已经很齐全了&#xff0c;但还有可以进步的地方。Vim 可以说是程序开发者的一项很好用的工…