目录
ansible学习思路:
ansible是什么?
官网:Ansible is Simple IT Automation
ansible的组成:
参考文档:Ansible入门与playbook实战-~学无止境,学以致用 ^ _ ^-51CTO博客
ansible操作体验:
1、先在sever和client之间建立单向信任关系,server端产生密钥对,上传公钥到client上
2、安装ansible,在管理节点上
3、打开ansible,并配置主机清单
ansible 常用模块
参考文档:Ansible入门与playbook实战-~学无止境,学以致用 ^ _ ^-51CTO博客
1、copy模块
2、shell模块
3、fetch模块
4、file模块
5、yum模块
6、script模块
7、service模块
8、cron模块
playbook的使用
1、playbook的核心元素
2、通过playbook安装管理redis服务
3、带配置文件的安装管理redis
ansible学习思路:
ssh - 批量管理10台服务器思路
ansible是什么?
ansible 一款自动化运维工具的名称(Ansible is Simple IT Automation)
ansible是自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
批量的去完成日常运维的工作
日常linux运维工作:
1.安装软件
2.启动服务
3.运行脚本
4.修改配置
5.升级软件
6.备份复制文件
等
官网:Ansible is Simple IT Automation
目的是:提升效率、降低人力成本
ansible的组成:
ansible的组成:
1.host inventory 主机清单 --》可以控制的其他的电脑的名单
2.playbook 剧本(配置文件) --》让主机清单里的主机去批量完成的任务 --》脚本
3.module 模块 实现一个个功能的程序
4.plugins 插件 :依附于ansible的一个小软件,实现某个小功能。ansible就是让什么主机使用什么工具做什么事情 --》自动化运维工具,批量部署,批量操作运维
参考文档:Ansible入门与playbook实战-~学无止境,学以致用 ^ _ ^-51CTO博客
host inventory模块:主机清单
写明控制的机器的信息,例如ip地址、ssh端口号、域名、用户名和密码
[webservers]
192.168.0.190
192.168.0.191
[dbservers]
192.168.0.192:22 ansible_ssh_user='cali'
[nfs]
192.168.0.139:2233 ansible_ssh_user='root' ansible_ssh_pass='123456'
指定用户名和密码的配置,需要连接一次,获取对方服务器的公钥到know_hosts文件
playbook 模块:剧本(配置文件) --》让主机清单里的主机去批量完成的任务 --》脚本
module 模块:模块 实现一个个功能的程序
plugins 模块:插件 依附于ansible的一个小软件,实现某个小功能。
ansible操作体验:
准备两台服务器
server:172.20.10.9 Centos7.9
client: 172.20.10.7 Centos7.9
1、先在sever和client之间建立单向信任关系,server端产生密钥对,上传公钥到client上
在server上运行
[root@mysql ~]# ssh-keygen #生成公钥
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): y
Enter passphrase (empty for no passphrase):
Enter same passphrase again: #无密码
Your identification has been saved in y.
Your public key has been saved in y.pub.
The key fingerprint is:
SHA256:X9/EaTPSTL80kYC/goD7GBsj7tJXXIIm33ig1XCOE5w root@mysql
The key's randomart image is:
+---[RSA 2048]----+
| . . .. |
| E . . . .|
| X . + |
| . O = . .+.+|
| * B S . ...X+|
| o B = o o o+o=|
| o . X . . ...|
| . o + . |
| o.. |
+----[SHA256]-----+
[root@mysql ~]# cd /root/.ssh/
[root@mysql .ssh]# ls
authorized_keys id_rsa id_rsa.pub known_hosts
[root@mysql .ssh]#
[root@mysql .ssh]# ssh-copy-id -i id_rsa.pub root@172.20.10.7 #将公钥传递到client机器上去,从而建立免密通道
[root@mysql .ssh]# ssh 'root@172.20.10.7' #测试免密通道是否建立成功
Last login: Tue Apr 18 18:21:12 2023 from 172.20.10.4
[root@mysql ~]# ls
all_db.sql anaconda-ks.cfg mysql-5.7.41-linux-glibc2.12-x86_64.tar.gz onekey_install_mysql_binary.sh
[root@mysql ~]# exit
登出
Connection to 172.20.10.7 closed.
[root@mysql .ssh]#
2、安装ansible,在管理节点上
[root@mysql .ssh]# yum install epel-release -y
[root@mysql .ssh]# yum install ansible -y #安装ansible
3、打开ansible,并配置主机清单
[root@server ~]# cd /etc/ansible/
[root@server ansible]# ls
ansible.cfg hosts roles
[root@server ansible]#
ansible.cfg 是ansible的配置文件
hosts 里面定义主机清单
[root@server ansible]# vim hosts
[scweb]
172.20.10.7
尝试运行shell命令:
[root@server ansible]# ansible scweb -m shell -a "ip add"
scweb 表示主机组别
-m 表示模块
-a 表示需要运行的参数
同理可以运行下载模块命令:
[root@server ansible]# ansible all -m yum -a "name=epel-release state=installed"
[root@server ansible]# ansible all -m yum -a "name=htop state=installed"
all 表示所有主机
name 表示需要下载的软件名称
state 表示需要进行的状态
ansible-doc 获取帮助信息
ansible模块比较多,可以通过ansible-doc --help 显示帮助信息
ansible doc -l 获取所有当前版本下的可用模块及简要信息
ansible-doc -s 模块名 获取指定模块帮助信息说明``
ansible 常用模块
参考文档:Ansible入门与playbook实战-~学无止境,学以致用 ^ _ ^-51CTO博客
1、copy模块
从本地copy文件分发到目录主机路径
上传/test/while.sh文件到 scweb主机清单里面的主机上的/tmp/目录下,权限为755
参数说明:
src= 源文件路径
dest= 目标路径
注意src= 路径后面带/ 表示带里面的所有内容复制到目标目录下,不带/是目录递归复制过去
content= 自行填充的文件内容
owner 属主
group 属组
mode权限
2、shell模块
使用shell命令运行刚刚传过去的脚本
后台运行
3、fetch模块
从远程主机拉取文件到本地
将客户机上的/etc/passwd文件 拉取到本机的/test文件夹下
4、file模块
设置文件属性(创建文件)
其中属性(state)
touch 空文件
directory 目录
link 软链接文件
hard 硬链接文件
创建文件夹
常用参数:
path 目标路径
state directory为目录, link为软件链接
group 目录属组
owner 属主
等,其他参数通过ansible-doc -s file 获取
创建空文件
5、yum模块
故名思义就是yum安装软件包的模块;
[root@mysql ~]# rpm -e tree #卸载tree命令
[root@mysql ~]# tree
-bash: /usr/bin/tree: 没有那个文件或目录
[root@mysql ~]#
安装tree命令
常用参数说明:
enablerepo,disablerepo表示启用与禁用某repo库
name 安装包名
state (present' or
installed',latest')表示安装, (
absent' or `removed') 表示
6、script模块
把本地的脚本传到远端执行;前提是到远端可以执行,不要把Linux下的脚本同步到windows下执行;
7、service模块
服务管理模块
常用参数:
name:服务名
state:服务状态
enabled: 是否开机启动 true|false
runlevel: 启动级别 (systemed方式忽略)
8、cron模块
通过cron模块对目标主机生成计划任务
常用参数:
除了分(minute)时(hour)日(day)月(month)周(week)外
name: 本次计划任务的名称
state: present 生成(默认) |absent 删除 (基于name)
[root@mysql test]# cat backup.sh
#!/bin/bash
#mkdir /backup
mkdir -p /backup
#backup
tar czf /backup/passwd.tar.gz /etc/passwd
[root@mysql test]#
[root@mysql test]# ansible all -m copy -a "src=backup.sh dest=/tmp"
#将写好的任务脚本发送给client机器
[root@mysql test]# ansible all -m cron -a "minute=30 hour=2 job='bash /tmp/backup.sh' name=backup_passwd state=present "
#在client机器上设置计划任务
在client上查看计划任务是否设置成功
[root@mysql tmp]# crontab -l
#Ansible: backup_passwd
30 2 * * * bash /tmp/backup.sh
[root@mysql tmp]#
#删除计划任务
ansible all -m cron -a "name=backup_passwd state=absent"
#验证
[root@mysql tmp]# crontab -l
[root@mysql tmp]#
playbook的使用
playbook是Ansible的配置,部署和编排的语言。他们可以描述你所希望的远程系统强制执行的政策,或者在一般的IT流程的一组步骤;形象点的说就是:如果ansible的各模块(能实现各种功能)是车间里的各工具;playbook就是指导手册,目标远程主机就是库存和原料对象.
playbook是基于YAML语言格式配置,关于YAML
更多playbook官方说明参考官方说明参考官方说明参考
1、playbook的核心元素
hosts : playbook配置文件作用的主机
tasks: 任务列表
variables: 变量
templates:包含模板语法的文本文件
handlers :由特定条件触发的任务
roles :用于层次性、结构化地组织playbook。roles 能够根据层次型结构自动装载变量文件、tasks以及handlers等
因此我们可以认为
playbook 是告诉ansible去批量完成工作的文件 --》传参给ansible
2、通过playbook安装管理redis服务
yaml是一种标记语言 与 html相似
[root@mysql /]# mkdir playbook
[root@mysql /]# cd playbook/
[root@mysql playbook]# ls
[root@mysql playbook]# vim redis_first.yaml #创建 下载并运行redis的playbook脚本
[root@mysql playbook]# cat redis_first.yaml
#在scweb主机清单对应的分组
- hosts: scweb #接主机清单名称
remote_user: root #执行程序的用户是root用户
tasks: #接执行的任务
- name: install redis #接任务名称
yum: name=redis state=latest #调用yum模块,安装软件redis,latest表示安装
- name: start redis #第二个任务名称
service: name=redis state=started #调用service模块,started表示打开redis
[root@mysql playbook]#
#检查playbook 程序语法是否出现错误
[root@mysql playbook]# ansible-playbook --syntax-check redis_first.yaml
playbook: redis_first.yaml
[root@mysql playbook]#
#执行plybook程序
[root@mysql playbook]# ansible-playbook redis_first.yaml
PLAY [scweb] ********************************************************************************************************************************************************************************
TASK [Gathering Facts] **********************************************************************************************************************************************************************
ok: [172.20.10.7]
TASK [install redis] ************************************************************************************************************************************************************************
ok: [172.20.10.7]
TASK [start redis] **************************************************************************************************************************************************************************
changed: [172.20.10.7]
PLAY RECAP **********************************************************************************************************************************************************************************
172.20.10.7 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[root@mysql playbook]#
我们能通过在client上检查端口和进程查看playbook是否运行成功
[root@mysql tmp]# ps aux|grep redis
redis 8679 0.0 0.2 143056 2484 ? Ssl 04:12 0:00 /usr/bin/redis-server 127.0.0.1:6379
root 8693 0.0 0.0 112824 988 pts/0 R+ 04:13 0:00 grep --color=auto redis
[root@mysql tmp]# netstat -anpult| grep redis
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 8679/redis-server 1
[root@mysql tmp]#
3、带配置文件的安装管理redis
redis配置文件目录:/etc/redis.conf
因为redis的配置文件中,只允许本地机器访问redis,因此我们需要修改redis的配置文件
bind 127.0.0.1
修改为
bind 0.0.0.0
方法一:
修改生成一个样本文件(就是redis的配置文件中将bind修改为0.0.0.0)
将样本文件拷贝到宿主机上去
[root@mysql /]# scp /etc/redis.conf root@172.20.10.9:/playbook/
最后使用playbook将样本文件传递到主机清单中的redis中
方法二:
首先复制一个redis.conf到本地并进行修改
#使用fetch拉取redis的配置文件到本地
[root@mysql playbook]# ansible 172.20.10.7 -m fetch -a "src=/etc/redis.conf dest=./"
172.20.10.7 | CHANGED => {
"changed": true,
"checksum": "c647a110949602d13a3d52429bbb57b563dae47e",
"dest": "/playbook/172.20.10.7/etc/redis.conf",
"md5sum": "375f2bc6dfa3bdacfbcdd24b29d08daf",
"remote_checksum": "c647a110949602d13a3d52429bbb57b563dae47e",
"remote_md5sum": null
}
[root@mysql playbook]# ls
172.20.10.7 redis_first.yaml
[root@mysql playbook]#
将配置文件修改名字,并将bind修改为0.0.0.0
[root@mysql playbook]# mv ./172.20.10.7/etc/redis.conf redis.conf
[root@mysql playbook]# ls
172.20.10.7 redis.conf redis_first.yaml
[root@mysql playbook]# vim redis.conf
[root@mysql playbook]#
创建redis_secend.yaml,用来传输redis.conf文件
[root@mysql playbook]# vim redis_secend.yaml;
[root@mysql playbook]# ls
172.20.10.7 redis.conf redis_first.yaml redis_secend.yaml
#在scweb主机清单对应的分组
- hosts: scweb #接主机清单名称
remote_user: root #执行程序的用户是root用户
tasks: #接执行的任务
- name: install redis #接任务名称
yum: name=redis state=latest #调用yum模块,安装软件redis,latest表示安装
- name: copy config file #任务之复制同步配置文件到远程目标主机
copy: src=/playbook/redis.conf dest=/etc/redis.conf owner=redis #动作copy模块执行
notify: restart redis #触发的动作
tags: config file #任务标记名config file
- name: start redis #启动redis
service: name=redis state=started #调用service模块,started表示打开redis
handlers: #特定情况下,接收到其他任务的通知时被触发
- name: restart redis
service: name=redis state=restarted
运行 redis_secend.yaml
[root@mysql playbook]# ansible-playbook redis_secend.yaml
PLAY [scweb] ********************************************************************************************************************************************************************************
TASK [Gathering Facts] **********************************************************************************************************************************************************************
ok: [172.20.10.7]
TASK [install redis] ************************************************************************************************************************************************************************
ok: [172.20.10.7]
TASK [copy config file] *********************************************************************************************************************************************************************
ok: [172.20.10.7]
TASK [start redis] **************************************************************************************************************************************************************************
ok: [172.20.10.7]
PLAY RECAP **********************************************************************************************************************************************************************************
172.20.10.7 : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
#验证
[root@mysql /]# netstat -anpult | grep redis;
tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN 9794/redis-server 0
[root@mysql /]#