文章目录

展开

自动化运维工具 - Ansible 基础

Ansible 基本概述

什么是 Ansible

Ansible 是一个自动化统一配置管理工具,自动化主要体现在 Ansible 集成了丰富模块以及功能组件,可以通过一个命令完成一系列的操作,进而能减少重复性的工作和维护成本,可以提高工作效率。

Ansible 同款软件

  • Ansible Python2 基于 SSH 协议
  • Saltstack Python2 和 Python3 可以基于 SSH 协议也可以基于客户端 TCP 协议
  • Puppet Ruby
对比 puppet Ansible Saltstack
开发语言 ruby python Pytho
远程执行功能 没有 有、串行 有、并行
客户端 没有 没有
架构 SSH C/S、也支持SSH
消息队列

Ansible 的优点

  • 远程执行
    • 批量执行远程命令,可以对多台主机进行远程操作
  • 配置管理
    • 批量配置软件服务,可以进行自动化方式配置,服务的统一配置管理,和启停
  • 事件驱动
    • 通过 Ansible 的模块,对服务进行不同的事件驱动
    • 比如:
    • 1)修改配置后重启
    • 2)只修改配置文件,不重启
    • 3)修改配置文件后,重新加载
    • 4)远程启停服务管理
  • 管理公有云
    • 通过 API 接口的方式管理公有云,不过这方面做的不如 saltstack. saltstack 本身可以通过 saltcloud 管理各大云厂商的云平台。
  • 二次开发
    • 因为语法是 Python,所以便于运维进行二次开发。
  • 任务编排
    • 可以通过 playbook 的方式来统一管理服务,并且可以使用一条命令,实现一套架构的部署
  • 跨平台,跨系统
    • 几乎不受到平台和系统的限制,比如安装 apache 和启动服务
    • 在 Ubuntu 上安装 apache 服务名字叫 apache2
    • 在 CentOS 上安装 apache 服务名字叫 httpd
    • 在 CentOS6 上启动服务器使用命令:/etc/init.d/nginx start
    • 在 CentOS7 上启动服务器使用命令:systemctl start nginx

Ansible 的架构

1、连接插件 connection plugins 用于连接主机 用来连接被管理端

2、核心模块 core modules 连接主机实现操作, 它依赖于具体的模块来做具体的事情

3、自定义模块 custom modules 根据自己的需求编写具体的模块

4、插件 plugins 完成模块功能的补充

5、剧本 playbookansible 的配置文件,将多个任务定义在剧本中,由 ansible 自动执行

6、主机清单 inventor 定义 ansible 需要操作主机的范围 最重要的一点是 ansible 是模块化的 它所有的操作都依赖于模块

image-20230905223516698

Ansible 的执行流程

1.Ansible 读取 playbook 剧本,剧本中会记录对哪些主机执行哪些任务。

2.首先 Ansible 通过主机清单找到要执行的主机,然后调用具体的模块。

3.其次 Ansible 会通过连接插件连接对应的主机并推送对应的任务列表。

4.最后被管理的主机会将 Ansible 发送过来的任务解析为本地 Shell 命令执行。

Ansible安装部署

环境准备

主机名 WanIP LanIP 角色
m01 10.0.0.61 172.16.1.61 Ansible控制端
web01 10.0.0.7 172.16.1.7 被控端
web02 10.0.0.8 172.16.1.8 被控端

安装ansible

# 1.安装ansible 有epel源
[root@m01 ~]# yum install -y ansible

# 2.ansible命令选项
--version  # ansible版本信息
-v  # 显示详细信息
-i  # 主机清单文件路径,默认是在/etc/ansible/hosts
-m  # 使用的模块名称,默认使用command模块
-a  # 使用的模块参数,模块的具体动作
-k  # 提示输入ssh密码,而不使用基于ssh的密钥认证
-C  # 模拟执行测试,但不会真的执行
-T  # 执行命令的超时

[root@m01 ~]# ansible --version
## ansible版本号
ansible 2.9.27
   ## ansible默认配置文件
  config file = /etc/ansible/ansible.cfg
   ## 配置文件模块路径
  configured module search path = [u'/root/.ansible/plugins/modules',u'/usr/share/ansible/plugins/modules']
   ## python模块路径
  ansible python module location = /usr/lib/python2.7/site-packages/ansible
   ## ansible可执行命令的路径
  executable location = /usr/bin/ansible
   ## Python版本
  python version = 2.7.5 (default, Oct 30 2018, 23:45:53) [GCC 4.8.5 20150623 (Red Hat4.8.5-36)]

ansible配置文件读取顺序

1、 $ANSIBLE_CONFIG

2、 ./ansible.cfg

3、 ~/.ansible.cfg

4、 /etc/ansible/ansible.cfg

[root@m01 ~]# vim /etc/ansible/ansible.cfg
log_path = /var/log/ansible.log # 111
host_key_checking = False # 71
## 开启删除以上两行内容的注释 使得和其他机器连接时不需要输入yes认证

#inventory = /etc/ansible/hosts         #主机列表配置文件
#library = /usr/share/my_modules/       #库文件存放目录
#remote_tmp = ~/.ansible/tmp            #临时py文件存放在远程主机目录
#local_tmp = ~/.ansible/tmp             #本机的临时执行目录
#forks = 5                              #默认并发数
#sudo_user = root                       #默认sudo用户
#ask_sudo_pass = True                   #每次执行是否询问sudo的ssh密码
#ask_pass = True                        #每次执行是否询问ssh密码
#remote_port = 22                       #远程主机端口
host_key_checking = False               #跳过检查主机指纹
log_path = /var/log/ansible.log         #ansible日志

Ansible Inventory(主机清单)

 使用IP+端口+用户+密码的方式

[root@m01 ~]# vim /etc/ansible/hosts
[web_group] # 标签名
# IP             连接的端口     连接的用户             该用户的密码
10.0.0.7 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='1'
10.0.0.8 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='1'

## 检测web_group主机是否通
[root@m01 ~]# ansible web_group -m ping
10.0.0.7 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}
10.0.0.8 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}

主机名+密码的方式

## 注意:该方式,需要做域名解析,把主机名解析在IP上,否则ansible无法识别
[root@m01 ~]# vim /etc/ansible/hosts
[web_group]
web0[1:2] ansible_ssh_pass='1'

[root@m01 ~]# vim /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
10.0.0.7 web01
10.0.0.8 web02

[root@m01 ~]# ansible web_group -m ping
web01 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}
web02 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}

变量方式,主机名+密码

## 使用变量的写法 也需要解析IP
[web_group]
web0[1:2]
[web_group:vars] # vars是针对标签变量名web_group设置的变量 底下是vars的变量名和变量值
ansible_ssh_pass='1' 

[root@m01 ~]# vim /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
10.0.0.7 web01
10.0.0.8 web02

使用秘钥连接的方式

# 1.先在管理机上生成秘钥对
[root@m01 ~]# ssh-keygen

# 2.推送公钥
[root@m01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub 172.16.1.7
[root@m01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub 172.16.1.8

## 跳过指纹验证(跳过yes)
[root@m01 ~]# yum install -y sshpass
ssh -o StrictHostKeyChecking=no IP

# 3.修改主机清单
[root@m01 ~]# vim /etc/ansible/hosts
[web_group]
10.0.0.7
10.0.0.8

[root@m01 ~]# ansible web_group -m ping
10.0.0.7 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}
10.0.0.8 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}

## 免密发送公钥脚本
[root@m01 ~]# cat ssh_key.sh 
#!/bin/bash

. /etc/init.d/functions

for num in 5 6 7 8 9 31 41 51 61;do
ping -W1  -c1 10.0.0.$num &>/dev/null
if [ $? -eq 0 ];then
  sshpass -p '1' ssh-copy-id -o StrictHostKeyChecking=no -i ~/.ssh/id_rsa.pub root@10.0.0.$num &>/dev/null
  action "主机:10.0.0.$num" /bin/true
else
  action "主机:10.0.0.$num" /bin/false
fi
done

企业使用的方式

## 需要先推送密钥
[root@m01 ~]# vim /etc/ansible/hosts
[web_group]
web01 ansible_ssh_host=10.0.0.7
web02 ansible_ssh_host=10.0.0.8

配置主机标签组

## 标签组配置语法
[标签组名字:children]
主机标签名1
主机标签名2

## 例:
[root@m01 ~]# vim /etc/ansible/hosts
[web_group]
web01 ansible_ssh_host=10.0.0.7
web02 ansible_ssh_host=10.0.0.8

[db_group]
db01 ansible_ssh_host=10.0.0.51
db02 ansible_ssh_host=10.0.0.52

[dw:children]
db_group
web_group
# 只需使用wd就可以使用web与db组
ansible dw -m ping

## ansible主机写法:
### 主机清单中的所有主机
[root@m01 ~]# ansible all -m ping

### 只针对某一台主机
[root@m01 ~]# ansible web01 -m ping

### 针对某一个IP
[root@m01 ~]# ansible 10.0.0.7 -m ping

### 指定某一个标签名中的所有主机
[root@m01 ~]# ansible web_group -m ping

### 指定某一个标签组中的所有主机
[root@m01 ~]# ansible lnmp -m ping