一,安装
# 在控制端安装
yum install -y epel-release #先安装epel源
yum install -y ansible
# 查看版本
ansible --version
目录结构:
/etc/ansible/
|——ansible.cfg # ansible的配置文件,一般无需修改
|——hosts # ansible的主机清单,用于存储需要管理的远程主机的相关信息
|——roles/ # 公共角色目录
二,配置
1,主机清单 /etc/ansible/hosts
# cat /etc/ansible/hosts
# Ex 1: 无分组主机写法.
green.example.com
blue.example.com
192.168.100.1
192.168.100.10
# Ex 2: 有分组主机写法.例如分组名为:'webservers'
[webservers]
alpha.example.org
beta.example.org
192.168.1.100
192.168.1.110
www[001:006].example.com # 代表www001.example.com ~ www006.example.com 共6个主机名
2,认证方式
2-1 公钥认证
将当前主机公钥发给指定机器:例如:192.168.40.101
ssh-keygen -t rsa #一路回车,使用免密登录
sshpass -p '123456' ssh-copy-id root@192.168.111.80
sshpass -p '123456' ssh-copy-id root@192.168.111.90
2-2 密码认证
字段 | 含义 |
---|---|
ansible_user | 用户名 |
ansible_password | 密码 |
ansible_port | 端口 |
配置主机清单 /etc/ansible/hosts
。以主机192.168.40.100为例:
1.给特定一台机器,添加密码,端口的信息
[web1]
172.16.1.41 ansible_port=22 ansible_password='123123'
2.给特定机器组,批量添加密码,端口的信息。并且,配置公共变量,需要分行写
[web2:vars]
ansible_port=22
ansible_password='123123'
[web2]
172.16.1.[10:90]
3,忽略指纹确认
# vim /etc/ansible/ansible.cfg
host_key_checking = False
# 后续就进入了认证方式阶段,选择密码,还是公钥
三,命令格式
命令格式: ansible <组名> -m <模块> -a <参数列表>
#列出所有已安装的模块,按q退出
ansible-doc -l
# 获取所有清单里的主机名 用all
ansible all -m shell -a "hostname"
# 或者使用指定组名
ansible 组名 -m shell -a "hostname"
四,模块
以下命令均已web组
为例
命令:ansible-doc --help
查看所有模块:ansible-doc -l
查看模块的说明:ansible-doc -s 模块名
- ansible的状态,就是如下的颜色区分,看到不同的状态
绿色:命令以用户期望的执行成功,但是状态没有发生改变
黄色:命令以用户期望的执行成功,并且状态发生了改变
紫色:警告信息,说明ansible提示你有更合适的用法
红色:命令错误,执行失败
蓝色:详细的执行过程
ping 检测目标机器存活
# ping命令 返回值为pong
ansible 组名 -m ping
command 简单命令
- 是ansible的默认模块,可以省略
- 命令不得用变量($HOME)
- 命令不得出现特殊符号,如管道符 | 等
# 获取主机名
ansible web -m command -a 'hostname'
ansible web -a 'hostname'
# 获取主机内存
ansible web -m command -a 'free -m'
# 创建文件,查看文件
ansible web -m command -a 'touch /opt/1.log'
ansible web -m command -a 'ls /opt/'
# 查看远程机器负载
ansible web -m command -a 'uptime'
# 执行命令关闭警告信息
ansible web -m command -a 'rm -rf /opt/1.log warn=false'
# 先进入到/目录:chdir ,在备份.
ansible web -m command -a 'tar -zcf /opt/log.tgz /var/log chdir=/'
# 目标目录不存在,则跳过执行:removes=/backup_config
ansible web -a "tar /backup_config/etc.tgz etc chdir=/ removes=/backup_config
所以事先执行如下命令才行:
ansible web -a "mkdir -p /backup_config
shell(万能模块)
- 特殊字符需要用
\
转译
# 远程过滤ssh的进程信息
ansible web -m shell -a 'ps -ef | grep ssh'
# 支持重定向符合:将时间信息写入文件
ansible web -m shell -a 'date > /timg.log'
# 获取服务端的ip地址:$前需要加\
ansible web -m shell -a "ifconfig -a | grep -w inet | awk '{print \$2}'"
copy 批量分发文件
copy模块是远程推送数据模块,只能把数据推送给远程主机节点,无法拉取数据到本地。
既然是文件拷贝,可用参数也就是围绕文件属性。
# 将本地文件dnf.sh 发送到所有主机上,所属组为www,权限为600,并且备份(默认时间戳)
ansible web -m copy -a "src=/tmp/dnf.sh dest=/tmp/web-dnf.sh group=www owner=www
mode=600 backup=yes"
# 直接写入内容,会覆盖内容,所以一般加入backup=yes,进行备份
ansible web -m copy -a "content='学习linux重要' dest=/tmp/web-dnf.sh backup=yes"
# 拷贝目录/opt/下的所有内容
ansible web -m copy -a "/opt/ /tmp/"
# 拷贝目录/opt,包含opt
ansible web -m copy -a "/opt /tmp/"
cron模块
- 在远程主机定义任务计划时,有两种状态(state) :
- present 表示添加(可以省略)
- absent 表示移除。
- 常用参数
参数 | 说明 |
---|---|
minute/hour/day/minute/weekday | 分/时/日/月/周 |
job | 任务计划要执行的命令 |
name | 任务计划的名称 |
ansible web -m cron -a 'minute="*/1" job="/bin/echo helloworld" name="test"'
ansible web -a 'crontab -l'
ansible web -m cron -a 'name="test" state=absent'
#移除计划任务,假如该计划任务没有取名字,name=None即可
user模块
- 常用的参数
参数 | 说明 |
---|---|
name | 用户名,必选参数 |
state=present | present:添加 absent:移除 |
system=yes or no | 是否为系统账号 |
uid | 用户uid |
group | 用户基本组 |
shell | 默认使用的shell |
move_home=yse or no | 如果设置的家目录已经存在,是否将已经存在的家目录进行移动 |
password | 用户的密码,建议使用加密后的字符串 |
comment | 用户的注释信息 |
remove=yes or no | 当state=absent时, 是否删除用户的家目录 |
ansible web -m user -a 'name="user01"' #创建用户user01
ansible web -m command -a 'tail /etc/passwd'
ansible web -m user -a 'name="user01" state=absent' #删除用户user01
group模块
用户组管理模块
ansible web -m group -a 'name=mysql gid=306 system=yes' # 创建mysq1组
ansible web -a 'tail /etc/group'
ansible web -m user -a 'name=user01 uid=306 system=yes group=mysql' # 将user01用户添加到mysq1l组中
ansible web -a 'tail /etc/passwd'
ansible web -a 'id user01'
file 模块
ansible web -m file -a "path=/opt/abc.txt state=touch" #创建一个文件
ansible web -m file -a "path=/opt/abc.txt state=absent" #删除一个文件
ansible web -m file -a "path=/opt/name/ state=directory" #创建一个文件夹
#修改文件的属主属组权限等
ansible web -m file -a 'owner=www group=www mode=644 path=/opt/fstab.bak'
# 创建软连接文件
ansible web -m file -a 'path=/opt/fstab.link src=/opt/fstab.bak state=link'
hostname模块
用于管理远程主机上的主机名
ansible web -m hostname -a "name=node01"
yum模块
在远程主机上安装与卸载软件包
ansible web -m yum -a 'name=httpd' #安装服务
ansible web -m yum -a 'name=httpd state=absent' #卸载服务
service / systemd 模块
用于管理远程主机上的管理服务的运行状态
- 常用参数
参数 | 说明 |
---|---|
name | 被管理的服务名称 |
state=started、stopped、restarted | 动作包含启动关闭或者重启 |
enabled=yes、no | 表示是否设置该服务开机自启 |
runlevel | 如果设定了enabled开机自启去,则要定义在哪些运行目标下自启动 |
#查看web服务器httpd运行状态
ansible web -a 'systemctl status httpd'
#启动httpd服务,设置开机启动
ansible web -m systemd -a 'name=httpd state=started enabled=true'
script模块
实现远程批量运行本地的shell脚本
# 创建一个脚本
vim test.sh
#!/bin/bash
echo "hello ansible from script" > /opt/script.txt
chmod +x test.sh
ansible web -m script -a 'test.sh'
ansible web -a 'cat /opt/script.txt'
【注意】查看命令执行详细过程:
-vvvvvv 参数显示详细过程,v越多,越详细
setup 模块
facts组件是用来收集被管理节点信息的,使用setup 模块可以获取这些信息
ansible webservers -m setup #获取mysql组主机的facts信息
ansible dbservers -m setup -a 'filter=*ipv4' #使用filter可以筛选指定的facts信息