目录
官网:Ansible is Simple IT Automation
参考文档:Ansible入门与playbook实战-~学无止境,学以致用 ^ _ ^-51CTO博客
2、playbook 模块:剧本(配置文件) --》让主机清单里的主机去批量完成的任务 --》脚本
4、plugins 模块:插件 依附于ansible的一个小软件,实现某个小功能。
1、先在sever和client之间建立单向信任关系,server端产生密钥对,上传公钥到client上
参考文档:Ansible入门与playbook实战-~学无止境,学以致用 ^ _ ^-51CTO博客
参考:paramiko模块_51CTO博客_paramiko模块详解Python模块之psutil详解_python psutil_程序员老华的博客-CSDN博客
playbook -->告诉ansible去批量完成工作的文件--》传参给ansible程序
方法一:修改生成一个样本文件(就是redis的配置文件中将bind修改为0.0.0.0)
创建redis_secend.yaml,用来传输redis.conf文件(直接调用)
将停止防火墙和selinux功能写为脚本(stop_fw_selinux.sh ):
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博客
1、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文件
2、playbook 模块:剧本(配置文件) --》让主机清单里的主机去批量完成的任务 --》脚本
3、module 模块:模块 实现一个个功能的程序
4、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
#中括号里的scweb是什么? 答案:一个分组的名字,我们可以在这个分组里添加很多需要去管理的机器的ip地址
#分组的名字可以自定义(自己定义,随便写,但是需要有意义)
分布式:
[root@ansible ansible]# vim ansible.cfg
forks = 15 #并发控制,同时15个进程或者进程去处理
4、尝试运行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博客
到底ansible的模块能干什么?
到底ansible的模块能干什么? --》就是我们日常的运维工作
1.复制文件在不同的机器之间
2.执行脚本(备份、安装、检查、监控等)
3.安装/卸载软件
4.制定计划任务
5.修改配置等
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]#
paramiko模块和psutil模块(自动化运维)
参考:paramiko模块_51CTO博客_paramiko模块详解Python模块之psutil详解_python psutil_程序员老华的博客-CSDN博客
paramiko是一个基于SSH用于连接远程服务器并执行相关操作(SSHClient和SFTPClinet,即一个是远程连接,一个是上传下载服务),使用该模块可以对远程服务器进行命令或文件操作,值得一说的是,fabric和ansible内部的远程管理就是使用的paramiko来现实。
psutil是一个跨平台库(http://pythonhosted.org/psutil/)能够轻松实现获取系统运行的进程和系统利用率(包括CPU、内存、磁盘、网络等)信息。它主要用来做系统监控,性能分析,进程管理。它实现了同等命令行工具提供的功能,如ps、top、lsof、netstat、ifconfig、who、df、kill、free、nice、ionice、iostat、iotop、uptime、pidof、tty、taskset、pmap等。目前支持32位和64位的Linux、Windows、OS X、FreeBSD和Sun Solaris等操作系统.
python---》ssh--》paramiko--》ssh远程连接
paramiko模块实现python里的ssh远程连接和控制
psutil模块用于获取cpu、内存、磁盘、网络流量信息的库
python/go编写monitor.py monitor.go
1.连接到对方的服务器上
paramiko模块,ssh模块--->密码认证或者密钥认证
实现ssh远程连接的功能
2. psutil 和gopsutil 获取需要监控的cpu,内存,磁盘,网络带宽等信息
yum install gcc gcc-devel python3-devel -y
pip3 install psutil
playbook模块的使用
playbook是Ansible的配置,部署和编排的语言。他们可以描述你所希望的远程系统强制执行的政策,或者在一般的IT流程的一组步骤;形象点的说就是:如果ansible的各模块(能实现各种功能)是车间里的各工具;playbook就是指导手册,目标远程主机就是库存和原料对象.
playbook是基于YAML语言格式配置,关于YAML,更多playbook官方说明参考
yaml是一种标记语言 --》html
yaml是一个语言,主要用来存储数据,里面使用空格、缩进、换行,key、value键值对的方式来表达里面数据的含义,主要给其他的程序传递参数
playbook -->告诉ansible去批量完成工作的文件--》传参给ansible程序
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: "stop firewalld" #关闭防火墙
service: name=firewalld state=stopped enabled=false
- name: "disable selinux" #关闭selinux
shell:
cmd: |
setenforce 0
sed -i '/^SELINUX=/ s/enforcing/disabled/' /etc/selinux/config
- 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
将停止防火墙和selinux功能写为脚本(stop_fw_selinux.sh ):
[root@ansible playbook2]# cat stop_fw_selinux.sh
#!/bin/bash
#停止防火墙服务和清除iptables规则
service firewalld stop
iptables -F
iptables -t nat -F
#设置firewalld 开机不启动
systemctl disable firewalld
#临时禁用selinux
setenforce 0
#永久禁用selinux
sed -i '/^SELINUX=/ s/enforcing/disabled/' /etc/selinux/config
[root@ansible playbook2]#
然后在 redis_three.yaml内调用该脚本
[root@ansible playbook2]# cat redis_three.yaml
- hosts: scweb
remote_user: root
tasks:
# - name: "stop firewalld"
# service: name=firewalld state=stopped enabled=false
# - name: "disable selinux"
# shell:
# cmd: |
# setenforce 0
# sed -i '/^SELINUX=/ s/enforcing/disabled/' /etc/selinux/config
- name: "stop firewalld and selinux"
script: /playbook2/stop_fw_selinux.sh
- name: "install redis"
yum: name=redis state=installed
- name: "copy config file to node servers"
copy: src=/playbook2/redis.conf dest=/etc/redis.conf owner=redis
notify: "restart redis"
tags: configfile
- name: "start redis"
service: name=redis state=started
handlers:
- name: "restart redis"
service: name=redis state=restarted
[root@ansible playbook2]#
再次测试并执行
[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
可以发现只是加了一个配置文件,所有的任务都执行了,可否只应用新添加的任务?当然可以
这里就要通过ansible-playbook -t TAGS_NAME 来执行了
验证
[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 /]#
ansible总结:
ansible通过常用模块在命令行就可以针对主机清单来管理配置远程主机,无需要代理客户端程序,但需要目标主机有ssh和python2.4+;
基于ssh协议既可以通过用户名和密码,也可以通过私钥,推荐使用私钥;
windows上需要安装powershell及winrm服务也可以做到,关于这方面 可以参考我之前的博客 ansible自动化管理windows,通过ansib-doc来获取模块信息及指定模块帮助信息;
ansible-playbook 基于YAML语法配置;可以对playbook文件进行测试,解析并执行应用于指定无端主机,非常方便我们统一编排分发管理远程主机;