Ansible常用模块

发布时间:2024年01月21日

实验前准备

Ansible管理机:192.168.188.17 安装ansible
待管理主机1:192.168.188.11
待管理主机2:192.168.188.12
关闭防火墙
systemctl stop firewalld
setenforce 0

Ansible部署

以下操作不做说明都在ansible管理机上操作

安装ansible

yum install -y epel-release
yum install -y ansible
Ansible默认安装在/etc/ansible,目录结构如下:
/etc/ansible/
├── ansible.cfg #配置文件,一般不改
├── hosts #主机清单,储存需要管理的远程主机的相关信息
└── roles #公共角色目录

配置主机清单

cd /etc/ansible
vim hosts
在这里插入图片描述

配置密钥对验证

ssh-keygen -t rsa
一路回车,密码也回车,这样姑且算是免密登录
这里的’123’是我的客户机的root密码
sshpass -p ‘123’ ssh-copy-id root@192.168.188.11
sshpass -p ‘123’ ssh-copy-id root@192.168.188.12
Ansible命令行模块
命令格式:ansible <组名> -m <模块> -a <参数列表>
查看已安装的模块
ansible-doc -l
按q退出

常用模块

commond模块

在目标主机上执行命令,不支持管道、重定向等shell的特性
查看commond模块的描述信息和操作动作
ansible-doc -s command
在这里插入图片描述

指定IP执行date命令
ansible 192.168.188.11 -m command -a ‘date’
在这里插入图片描述

指定组执行ls命令
ansible webservers -m command -a ‘ls /opt’
在这里插入图片描述

另一个组也可以试一下
在这里插入图片描述

所有组就用all
ansible all -m command -a ‘ls /opt’
在这里插入图片描述

如果不加-m指定模块,默认运行command模块
常用参数:
chdir:在远程主机上运行命令前提前进入目录
creates:判断指定文件是否存在,如果存在,不执行后面的操作
removes:判断指定文件是否存在,如果存在,执行后面的操作
ansible all -m command -a
在这里插入图片描述

shell模块

在目标主机执行命令,相当于调用目标主机的shell进程,然后在该shell下打开一个子shell运行命令,支持管道等功能
查看shell模块相关信息和动作
在这里插入图片描述

格式上都一样,就是具体命令不一样,随便展示两个
ansible dbservers -m shell -a ‘echo 123456 | passwd --stdin dzd’
在这里插入图片描述

ansible dbservers -m shell -a ‘echo $(ifconfig ens33 | awk “NR==2 {print $2}”)’
在这里插入图片描述

cron模块

在目标主机上定义计划任务,这里有一个状态参数(state),present表示添加,默认就是这个状态,可以省略,absent表示移除,下面例子会有演示
常用参数:
minute/hour/day/month/weekday:分/时/日/月/周
job:任务计划要执行的命令
name:任务计划的名称
示例:
ansible webservers -m cron -a ‘minute=“*/1” job=“/bin/echo helloword” name=“test cron”’
在这里插入图片描述

使用command模块查看
ansible webservers -a ‘crontab -l’
在这里插入图片描述

移除任务,假如计划没有名字,直接写name=None即可
ansible webservers -m cron -a ‘name=“test cron” state=absent’
在这里插入图片描述

user模块

用户管理的模块
ansible-doc -s 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时,是否删除用户的家目录

示例:
创建用户tsh
ansible dbservers -m user -a ‘name=“tsh”’
在这里插入图片描述

检查一下
ansible dbservers -m command -a ‘tail /etc/passwd’
在这里插入图片描述

删除用户tsh
ansible dbservers -m user -a ‘name=“tsh” state=absent’
在这里插入图片描述

再查看已经没有了
ansible dbservers -m command -a ‘tail /etc/passwd’
在这里插入图片描述

group模块

用户组管理的模块
ansible-doc -s group
基本上和user模块差不多
示例
创建mysql组
ansible dbservers -m group -a ‘name=“mysql” gid=306 system=yes’
在这里插入图片描述

将dzd用户添加到mysql组中
ansible dbservers -m user -a ‘name=dzd uid=306 system=yes group=mysql’
在这里插入图片描述

检查一下
ansible dbservers -a ‘id dzd’
在这里插入图片描述

copy模块

用于复制指定主机文件到远程主机的
ansible-doc -s 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/’
在这里插入图片描述

使用copy完成语句的写入
ansible dbservers -m copy -a ‘content=“i am tsh” dest=/opt/hello.txt’
查看
ansible dbservers -a ‘cat /opt/hello.txt’
在这里插入图片描述

file模块

设置文件属性
ansible-doc -s file
示例:
修改文件的属主属组权限等
ansible dbservers -m file -a ‘owner=dzd group=mysql mode=664 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”
hostname模块
用于管理远程主机上的主机名
ansible-doc -s hostname
示例:
ansible dbservers -m hostname -a ‘name=mysql01’
在这里插入图片描述

去主机2看一下
在这里插入图片描述

ping模块

检测远程主机的连通性
ansible all -m ping

yum模块

在远程主机上安装与卸载软件包
ansible-doc -s yum
示例:
安装服务
ansible webservers -m yum -a ‘name=httpd’
去主机1检查一下
rpm -q httpd
在这里插入图片描述

卸载服务
ansible webservers -m yum -a ‘name=httpd state=absent’
再去检查一下
在这里插入图片描述

service/systemd模块

用于管理远程主机上的管理服务的运行状态
ansible-doc -s service
常用参数:
name:被管理的服务名称
state=started|stopped|restarted:动作包含启动关闭或者重启
enabled=yes|no:表示是否设置该服务开机自启
runlevel:如果设定了enabled开机自启去,则要定义在哪些运行目标下自启动

示例:
先查看web服务器上httpd的状态,如果没有就用yum模块安装
ansible webservers -a ‘systemctl status httpd’
在这里插入图片描述

我现在是关闭状态,那么直接开启
ansible webservers -m service -a ‘enabled=true name=httpd state=started’
在这里插入图片描述

再查看状态
在这里插入图片描述

script模块

/实现远程批量运行本地的 shell 脚本
ansible-doc -s script
示例:
先在ansible服务器上写个简单的脚本
vim test.sh
#!/bin/bash
echo “hello ansible from script” > /opt/script.txt
赋权
chmod +x test.sh
运行脚本
ansible webservers -m script -a ‘test.sh’
在这里插入图片描述

查看主机1上是否生成了script.txt
ansible webservers -a ‘cat /opt/script.txt’
在这里插入图片描述

setup模块

facts 组件是用来收集被管理节点信息的,使用 setup 模块可以获取这些信息
ansible-doc -s setup
示例:
获取webservers组主机的facts信息
ansible webservers -m setup
很长一段不截图了
使用filter可以筛选指定的facts信息
ansible webservers -m setup -a ‘filter=*ipv4’
在这里插入图片描述

遇到的问题

sshpass卡住

具体问题
[root@localhost ansible]# sshpass -p ‘123’ ssh-copy-id root@192.168.188.12
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: “/root/.ssh/id_rsa.pub”
[root@localhost ansible]#
正常来说应该会有很长一串,但是我遇到了这样的情况,然后用ssh命令或者ansible命令测试的时候发现并没有成功配置免密登录
问题分析:首先这里的问题并不是网上说的已存在公钥的问题,我试过并没有解决。经过网上翻阅资料,我发现是sshpass的问题,对于从未连接过的主机,使用sshpass连接的话需要输入yes
解决办法
第一种办法是对sshd服务进行优化,让它不需要在第一次连接时进行确认
vim /etc/ssh/ssh_config
在这里插入图片描述
在这里插入图片描述

然后重启服务
systemctl restart sshd
再尝试
在这里插入图片描述

第二种方法是比较简单,就是先用ssh连接一下(失败也行),因为sshpass只有从未连接过的主机需要进行确认
具体过程直接看图
在这里插入图片描述

文章来源:https://blog.csdn.net/qq_53772682/article/details/135731116
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。