Bootstrap

Ansible自动化运维

Ansible自动化运维

介绍

自动化运维

  • 当管理的服务器很多时,假设有1000台,如果想要在1000台服务器上做一个简单的操作:

    • 按照传统方法,一台连着一台服务器的ssh登录,然后手动操作,效率太低;
    • 若写脚本实现,会有以下缺点
      • 管理的机器平台不一致,脚本可能不具备通用性
      • 传密码麻烦(在非免密登录的环境下, 需要expect来传密码)
      • 效率较低,循环1000次也需要一个一个的完成,如果用&符放到后台执行,则会产生1000个进程
  • 自动化运维:将日常IT运维中大量的重复性工作,小到简单的日常检查、配置变更和软件安装,大到整个变更流程的组织调度,由过去的手工执行转为自动化操作,从而减少乃至消除运维中的延迟,实现“零延时”的IT运维

  • 管理多台服务器,自动化运维需要关注以下几个方面

    • 管理机与被管理机的连接(管理机如何将管理指令发送给被管理机)

    • 服务器信息收集 (如果被管理的服务器有centos7.5外还有其它linux发行版,如suse,ubuntu等。当你要做的事情在不同OS上有所不同,你需要收集信息,并将其分开处理)

    • 服务器分组(因为有些时候我要做的事情不是针对所有服务器,可能只针对某一个分组)

    • 管理内容的主要分类

      • 文件目录管理(包括文件的创建,删除,修改,查看状态,远程拷贝等)
      • 用户和组管理
      • cron时间任务管理
      • yum源配置与通过yum管理软件包
      • 服务管理
      • 远程执行脚本
      • 远程执行命令
  • 常见自动化运维工具

    • puppet

      基于ruby语言,成熟稳定。适合于大型架构,相对于ansible和saltstack会复杂些。

    • saltstack

      基于python语言,相对简单,大并发能力比ansible要好, 但需要维护被管理端的服务。如果服务断开,连接就会出问题。

    • ansible

      基于python语言,简单快捷,被管理端不需要启服务直接走ssh协议,需要验证所以机器多的话速度会较慢。

Ansible

  • ansible是一种由Python开发的自动化运维工具,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能

  • ansible是基于模块工作的,本身没有批量部署的能力,真正具有批量部署能力的是ansible运行的模块,ansible只是提供一个框架。

  • 特点

    • 不需要在被监控端上安装任何服务程序,部署简单
    • 无服务器端,使用时直接运行命令即可
    • 基于模块工作,可以使用任意语言开发
    • 使用yaml语言编写playbook,可以通过playbook(剧本)进行多个任务的编排
    • 基于ssh工作
    • 可实现多级指挥
    • 具有幂等性,一种操作重复多次执行结果相同
  • 执行过程

    • 加载自己的配置文件,默认为/etc/ansible/ansible.cfg
    • 加载自己对应的模块文件
    • 通过ansible将模块或命令生成对应的临时py文件,并将该文件传输至远程服务器
    • 对应执行用户的家目录的.ansible/tmp/xx.py文件
    • 给文件+x执行权限
    • 执行并将返回结果,删除临时py文件,sleep 0 退出
  • 核心组件

    • ansbile:核心程序
    • modules:包括ansible自带的核心模块以及自定义模块
    • plugins:完成模块功能的补充,包括连接插件,邮箱插件
    • palybooks:剧本,定义ansbile多任务配置文件,由ansible自动执行
    • inventory:定义ansbile管理的主机清单
    • connection plugins:负责和被监控端实现通信

在这里插入图片描述

安装部署ansible

虚拟机 IP地址 作用
server1 192.168.139.10 管理节点
server2 192.168.139.20 被管理节点
server3 192.168.139.30 被管理节点
  • 基本环境配置
域名解析
cat >> /etc/hosts <<EOF
	192.168.139.10 server1
	192.168.139.20 server2
	192.168.139.30 server3
	EOF

关闭防火墙,selinux
systemctl stop firewalld
systemctl disable firewalld
iptables -F
setenforce 0
sed -i 's/SELINUX=enforced/SELINUX=disabled/' /etc/selinux/config

时间同步
ntpdate cn.ntp.org.cn

yum源配置
yum install -y epel-release.noarch
  • 管理节点安装ansible
[root@server1 ~]# yum install ansible -y
[root@server1 ~]# ansible --version
ansible 2.9.25
  config file = /etc/ansible/ansible.cfg
  configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python2.7/site-packages/ansible
  executable location = /usr/bin/ansible
  python version = 2.7.5 (default, Nov 16 2020, 22:23:17) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]
  • 免密登陆
[root@server1 ~]# ssh-keygen
[root@server1 ~]# ssh-copy-id 192.168.139.20
[root@server1 ~]# ssh-copy-id 192.168.139.30
  • 定义主机组
[root@server1 ~]# vim /etc/ansible/hosts 
[root@server1 ~]# cat /etc/ansible/hosts |grep -Ev '^#|^$'
[mygroup]
192.168.139.20
192.168.139.30
  • 测试连接
[root@server1 ~]# ansible -m ping all
192.168.139.20 | SUCCESS => {
   
    "ansible_facts": {
   
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}
192.168.139.30 | SUCCESS => {
   
    "ansible_facts": {
   
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}
[root@server1 ~]# ansible -m ping mygroup
192.168.139.20 | SUCCESS => {
   
    "ansible_facts": {
   
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}
192.168.139.30 | SUCCESS => {
   
    "ansible_facts": {
   
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}

服务器分组

  • ansible组件inventory:用于定义ansbile管理的主机清单
  • 默认主机清单配置文件为/etc/ansible/hosts,可在该文件中进行服务器分组
  • 分组方法
多台合写
apache[1:10].aaa.com	表示apache1.aaa.com到apache10.aaa.com这10台机器
nginx[a:z].aaa.com		表示nginxa.aaa.com到nginxz.aaa.com共26台机器
10.1.1.[11:15]			表示10.1.1.11到10.1.1.15这5台机器

定义端口
10.1.1.13:2222			

定义别名(定义10.1.1.12:2222这台服务器的别名为nginx1)
nginx1 ansible_ssh_host=10.1.1.13 ansible_ssh_port=2222

指定用户名和密码
nginx1  ansible_ssh_host=10.1.1.13 ansible_ssh_port=2222 ansible_ssh_user=root ansible_ssh_pass="123456"

利用别名分组
ginx1  ansible_ssh_host=10.1.1.13 ansible_ssh_port=2222 ansible_ssh_user=root ansible_ssh_pass="123456"
nginx2  ansible_ssh_host=10.1.1.12

[nginx]
nginx1
nginx2

ansible模块

介绍

官网模块文档地址: https://docs.ansible.com/ansible/latest/modules/list_of_all_modules.html

ansible的执行状态

  • 绿色:执行成功并且不需要做改变的操作
  • 黄色:执行成功并且对目标主机做变更
  • 红色:执行失败
  • 粉色:警告信息
  • 蓝色:显示ansible命令执行的过程

查看模块用法

ansible-doc 模块名

使用模块的基本格式

ansible 操作对象(域名|IP地址|组名) -m 模块名 -a "参数1=值1 参数2=值2"

ping

  • 主机连通性测试
[root@server1 ~]# ansible -m ping mygroup
192.168.139.30 | SUCCESS => {
   
    "ansible_facts": {
   
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}
192.168.139.20 | SUCCESS => {
   
    "ansible_facts": {
   
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}

hostname

  • 修改主机名(注意: 它不能修改/etc/hosts文件)
[root@server1 ~]# ansible 192.168.139.20 -m hostname -a 'name=server2'
192.168.139.20 | CHANGED => {
   
    "ansible_facts": {
   
        "ansible_domain": "", 
        "ansible_fqdn": "server2", 
        "ansible_hostname": "server2", 
        "ansible_nodename": "server2", 
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "name": "server2"
}

file

创建目录
[root@server1 ~]# ansible mygroup -m file -a 'path=/test state=directory'

创建文件
[root@server1 ~]# ansible mygroup -m file -a 'path=/test/file1 state=touch'

创建软连接
[root@server1 ~]# ansible mygroup -m file -a 'src=/etc/fstab path=/tmp/fstab state=link'

创建硬链接
[root@server1 ~]# ansible mygroup -m file -a 'src=/etc/fstab path=/tmp/fstab1 state=hard'

递归修改owner,group,mode
[root@server1 ~]# ansible mygroup -m file -a 'path=/test recurse=yes owner=bin group=daemon mode=1777'

删除文件
[root@server1 ~]# ansible mygroup -m file -a 'path=/test/file1 state=absent'

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;