文章目录
什么是ansible
ansible是新出现的自动化运维工具,基于Python开发
他有什么用
实现了批量系统配置、批量程序部署、批量运行命令等功能。
他的特点
- 部署简单,只需在主控端部署Ansible环境,被控端无需做任何操作;
- 默认使用SSH协议对设备进行管理;
- 有大量常规运维操作模块,可实现日常绝大部分操作;
- 配置简单、功能强大、扩展性强;
- 支持API及自定义模块,可通过Python轻松扩展;
- 通过Playbooks来定制强大的配置、状态管理;
- 轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可;
- 提供一个功能强大、操作性强的Web管理界面和REST API接口——AWX平台。
ansible 架构图
Ansible
:Ansible核心程序。
HostInventory
:记录由Ansible管理的主机信息,包括端口、密码、ip等。
Playbooks
:“剧本”YAML格式文件,多个任务定义在一个文件中,定义主机需要调用哪些模块来完成的功能。
CoreModules
:核心模块,主要操作是通过调用核心模块来完成管理任务。
CustomModules
:自定义模块,完成核心模块无法完成的功能,支持多种语言。
ConnectionPlugins
:连接插件,Ansible和Host通信使用
简单来说:
Ansible
是核心程序
还要三个核心组件:
HostInventory
: 这个是主机清单,里边记录了:ansible管理的机器
Modules
:多个模块,比方说:copy, yum, shell等
Plugins
:插件,也可以理解成 模块
重中之重是: PlayBook
—》他就相当于剧本,写好之后,其余组件去执行
操作一下
第一步
准备三台虚拟机
并建立单向免密通过
server: 192.168.209.144 —》在这台上安装ansible
client: 192.168.209.145
agent: 192.168.209.146
建立免密通道
1.在客户机上使用root用户登陆
[root@server~]# ssh-keygen
使用这个命令之后会生成公钥和私钥对
2. 第二步上传公钥到服务器
在服务器端输入下边这两条命令就可以了
ssh-copy-id root@192.168.209.145
ssh-copy-id root@192.168.209.146
3.测试登陆
ssh 'root@192.168.209.145'
ssh 'root@192.168.209.146'
如果可以直接连接上,那就说明你成功了
第二步
进入 /etc/ansible/ 文件
奥,对了,没有安装ansible的小伙伴们先安装一下,很简单的
[root@ansible ~] yum install epel-release -y //安装epel源
[root@ansible ~] yum install ansible -y //安装epel源之后,才能下载ansible
#查看版本
[root@ansible ~] ansible --version
ansible 2.4.2.0
[root@server ~] cd /etc/ansible/
[root@server ansible] ls
ansible.cfg hosts roles
[root@server ansible]#
添加主机清单的内容
进入hosts文件里边
添加一个组 [scweb]
组下边 添加 刚刚建立免密通道的两个ip地址
当然 也不是非要建立免密通道,可以直接在后边写上用户名和密码,但是这样暴露出来不安全
保存之后,进行第三步
来个简单的例子:
ansible scweb -m shell -a "ip add"
我解释一下:
ansible +组名(刚才定义的) 然后是-m 后边根一个模块 -a 后边必须加个引号,里边是你的操作
-m代表使用哪个模块 -a后边接参数 用双引号引起来
[root@server ansible] vim hosts
[root@server ansible] ansible scweb -m shell -a "ip add"
192.168.209.146 | CHANGED | rc=0 >>
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:dc:41:fe brd ff:ff:ff:ff:ff:ff
inet 192.168.209.146/24 brd 192.168.209.255 scope global noprefixroute dynamic ens33
valid_lft 1293sec preferred_lft 1293sec
inet6 fe80::3046:b047:13b8:b84b/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: br-47f42d61c6c0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:2d:a4:cb:b6 brd ff:ff:ff:ff:ff:ff
inet 192.168.250.1/24 brd 192.168.250.255 scope global br-47f42d61c6c0
valid_lft forever preferred_lft forever
inet6 fe80::42:2dff:fea4:cbb6/64 scope link
valid_lft forever preferred_lft forever
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:a6:17:bc:24 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
6: vethd81afa7@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-47f42d61c6c0 state UP group default
link/ether 62:9f:b1:ff:4f:8d brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet6 fe80::609f:b1ff:feff:4f8d/64 scope link
valid_lft forever preferred_lft forever
8: veth9ca38a7@if7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-47f42d61c6c0 state UP group default
link/ether 42:f7:54:ef:c1:48 brd ff:ff:ff:ff:ff:ff link-netnsid 2
inet6 fe80::40f7:54ff:feef:c148/64 scope link
valid_lft forever preferred_lft forever
10: veth593e5b1@if9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-47f42d61c6c0 state UP group default
link/ether 8a:be:68:3a:8b:c7 brd ff:ff:ff:ff:ff:ff link-netnsid 1
inet6 fe80::88be:68ff:fe3a:8bc7/64 scope link
valid_lft forever preferred_lft forever
12: veth585f5dd@if11: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-47f42d61c6c0 state UP group default
link/ether 56:cf:fc:3c:ca:2c brd ff:ff:ff:ff:ff:ff link-netnsid 5
inet6 fe80::54cf:fcff:fe3c:ca2c/64 scope link
valid_lft forever preferred_lft forever
14: vetha817879@if13: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-47f42d61c6c0 state UP group default
link/ether 82:78:d1:35:cc:5f brd ff:ff:ff:ff:ff:ff link-netnsid 3
inet6 fe80::8078:d1ff:fe35:cc5f/64 scope link
valid_lft forever preferred_lft forever
16: veth6425130@if15: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-47f42d61c6c0 state UP group default
link/ether 2e:5c:1e:fb:74:f8 brd ff:ff:ff:ff:ff:ff link-netnsid 4
inet6 fe80::2c5c:1eff:fefb:74f8/64 scope link
valid_lft forever preferred_lft forever
18: veth890d100@if17: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-47f42d61c6c0 state UP group default
link/ether c6:5a:56:9e:eb:04 brd ff:ff:ff:ff:ff:ff link-netnsid 7
inet6 fe80::c45a:56ff:fe9e:eb04/64 scope link
valid_lft forever preferred_lft forever
20: veth04e3cb7@if19: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-47f42d61c6c0 state UP group default
link/ether 3e:3d:cc:9e:79:ad brd ff:ff:ff:ff:ff:ff link-netnsid 6
inet6 fe80::3c3d:ccff:fe9e:79ad/64 scope link
valid_lft forever preferred_lft forever
[root@server ansible]#
ansible 操作一台机器 和 100台机器是怎样的
他是一台一台的去操纵的,串行的
命令
ansible
ansible -doc -l
ansible -doc -s 加模块名
具体模块的操作建议大家去搜一下,因为学了playbook之后就很少利用刚刚的方法去操作,一键部署不是更香吗?
学习playbook
重中之重
playbook是什么?
就像一个剧本,做一系列事情,批量操作,告诉ansible去批量完成
首先建立一个 mkdir /playbook 文件
[root@server test] mkdir /playbook
[root@server test] cd /playbook/
[root@server playbook] ls
要注意几个知识点:
yaml 是一种标记语言 —》适合传参
-开头 表示数组
举个例子:
通过playbook安装管理redis服务
在家目录下创建playbooks,编写 redis_first.yaml文件
-host 表示你要操作的组
remote_user表示操作的用户
tasks表示任务
- name 是tasks下边的说明自己要干什么
yum和nane属于同一个数组里的 这个里边是具体安装什么什么,具体格式的话我列举一下
这是yum模块,是后边引号里的内容哈 name是要下载的东西,state是状态
ansible all -m yum -a “name=epel-release state=installed”
这是copy模块,src= 源文件路径,dest= 目标路径,mode权限
ansible all -m copy -a “src=/etc/fstab dest=/tmp/fstab.ansible mode=600”
这是fetch模块,从远程主机拉取文件到本地
ansible all -m fetch -a “src=/tmp/hi.txt dest=/tmp”
这是shell模块,引号里边直接是写命令
ansible all -m shell -a “ifconfig|grep lo”
这是file模块,用来创建文件的,path是目标路径,state后边表示的是你需要文件还是空文件,或者link软连接
ansible all -m file -a “path=/var/tmp/hello.dir state=directory”
这是cron模块,name: 本次计划任务的名称,state: present 生成(默认) |absent 删除 (基于name)
ansible all -m cron -a “minute=*/3 job=‘/usr/sbin/update time.windows.com &>/dev/null’ name=update_time”
删除计划任务
ansible all -m cron -a “name=update_time state=absent”
这是服务器模块,name:服务名,name:服务名,enabled: 是否开机启动 true|false
ansible all -m service -a “name=nginx state=started enabled=true”
其他模块的使用可通过官方模块列表获得~
[root@ansible ~] mkidr playbooks
[root@ansible ~] cd playbooks
[root@ansible playbooks] cat redis_first.yaml
- hosts: all
remote_user: root
tasks:
- name: install redis
yum: name=redis state=latest
- name: start redis
service: name=redis state=started
做个练习就懂了:
任务:使用playbook完成
1.yum安装nginx
2.修改nginx的配置的端口号9900
3.将配置文件下发到所有的node节点服务器
4.启动nginx
5.卸载tree命令软件
6.在所有的node节点服务器上新建/backup目录
7.编写一个脚本实现备份/etc/passwd和/etc/shadow文件到/backup下,文件名里包含当天的日期,例如2023-5-23-passwd_shadow.tar.gz 添加一个计划任务,每天的3:30去执行,在所有的node节点服务器上实施。
[root@server playbook] cat redis_3.yaml
- hosts: my_server
remote_user: root
tasks:
- name: install epel-release
yum:
name: epel-release
state: latest
- name: install nginx
yum:
name: nginx
state: latest
- name: amend port
shell: cd /etc/nginx/ && sed -i 's/listen 80;/listen 9900;/g' nginx.conf
- name: start nginx
service:
name: nginx
state: started
- name: unload
yum:
name: tree
state: absent
- name: mkdir /backup
file:
path: /backup
state: directory
- name: backup
copy:
src: "/test/playbook/backup.sh"
dest: /backup
- name: automation
cron:
name: "bash /backup/backup.sh"
minute: 30
hour: 3
- hosts: scweb
remote_user: root
tasks:
- name: install epel-release
yum:
name: epel-release
state: latest
- name: install nginx
yum:
name: nginx
state: latest
- name: send
copy:
src: /etc/nginx/nginx.conf
dest: /etc/nginx/nginx.conf
force: true
- name: start nginx
service:
name: nginx
state: started
- name: unload
yum:
name: tree
state: absent
- name: mkdir /backup
file:
path: /backup
state: directory
- name: backup
copy:
src: "/test/playbook/backup.sh"
dest: /backup
- name: automation
cron:
name: "bash /backup/backup.sh"
minute: 30
hour: 3
这是备份脚本:
#!/bin/bash
DATE=$(date +%F)
# 创建备份文件的文件名
FILENAME="$DATE-passwd_shadow.tar.gz"
# 备份/etc/passwd和/etc/shadow文件到/backup目录,并将文件压缩为tar.gz格式
tar -zcf /backup/"$FILENAME" /etc/passwd /etc/shadow
我的server虚拟机,配置太低了,运行贼慢,跑了10几分钟没跑完,卡的要死,就不展示了,但是代码没问题。