目录
- 实验前准备
- Ansible部署
- 安装ansible
- 配置主机清单
- 配置密钥对验证
- 常用模块
- commond模块
- shell模块
- cron模块
- user模块
- group模块
- copy模块
- file模块
- ping模块
- yum模块
- service/systemd模块
- script模块
- setup模块
- 遇到的问题
- sshpass卡住
实验前准备
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只有从未连接过的主机需要进行确认
具体过程直接看图