ansible

什么是ansible

ansible是新出现的自动化运维工具,基于Python开发

他有什么用

实现了批量系统配置、批量程序部署、批量运行命令等功能。

他的特点

  1. 部署简单,只需在主控端部署Ansible环境,被控端无需做任何操作;
  2. 默认使用SSH协议对设备进行管理;
  3. 有大量常规运维操作模块,可实现日常绝大部分操作;
  4. 配置简单、功能强大、扩展性强;
  5. 支持API及自定义模块,可通过Python轻松扩展;
  6. 通过Playbooks来定制强大的配置、状态管理;
  7. 轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可;
  8. 提供一个功能强大、操作性强的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几分钟没跑完,卡的要死,就不展示了,但是代码没问题。

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不冤不乐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值