Ansible自动化运维

在这里插入图片描述

1.Ansible 介绍和架构

1.1 Ansible 发展历史

作者:Michael DeHaan( Cobbler 与 Func 作者) ansible 的名称来自科幻小说《安德的游戏》中跨 越时空的即时通信工具,使用它可以在相距数光年的距离,远程实时控制前线的舰队战斗。 2012-03-09,发布0.0.1版,2015-10-17,Red Hat宣布1.5亿美元收购 ,IBM收购了红帽

官网:https://www.ansible.com/
官方文档:https://docs.ansible.com/

1.2 Ansible特性

​ Ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、chef、func、 fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。 Ansible是基于 paramiko 开发的,并且基于模块化工作,本身没有批量部署的能力。真正具有批量部署 的是Ansible所运行的模块,Ansible只是提供一种框架。Ansible不需要在远程主机上安装 client/agents,因为它们是基于ssh来和远程主机通讯的。Ansible目前已经已经被红帽官方收购,是自动化运维工具中大家认可度最高的,并且上手容易,学习简单。是每位运维工程师必须掌握的技能之 一

  • 部署简单,只需在主控端部署Ansible环境,被控端无需做任何操作
  • Ansible自动化工具基于python语言
  • Ansible自动化管理基于SSH远程连接协议
  • 模块化:调用特定的模块完成特定任务,支持自定义模块,可使用任何编程语言写模块
  • 幂等性:一个任务执行1遍和执行n遍效果一样,不因重复执行带来意外情况
  • 支持playbook编排任务,YAML格式,编排任务,支持丰富的数据结构
  • 较强大的多层解决方案 role

1.3 Ansible架构

img
  • INVENTORY:Ansible管理主机的清单/etc/anaible/hosts
  • MODULES:Ansible执行命令的功能模块,多数为内置核心模块,也可自定义
  • PLUGINS:模块功能的补充,如连接类型插件、循环插件、变量插件、过滤插件等,该功能不常用
  • API:供第三方程序调用的应用程序编程接口
  • USER 普通用户,即SYSTEM ADMINISTRATOR
  • PLAYBOOKS:任务剧本(任务集),编排定义Ansible任务集的配置文件,由Ansible顺序依次执 行,通常是JSON格式的YML文件
  • CMDB(配置管理数据库)API 调用
  • PUBLIC/PRIVATE CLOUD API调用
  • USER-> Ansible Playbook -> Ansibil

1.4 注意事项

  • 执行ansible的主机一般称为主控端,中控,master或堡垒机

  • 主控端Python版本需要2.6或以上

  • 被控端Python版本小于2.4,需要安装python-simplejson

  • 被控端如开启SELinux需要安装libselinux-python

  • windows 不能做为主控端

2.Ansible安装

2.1 基于EPEL源安装

实验环境:Centos 7

# 安装epel源 
[root@web ~]# yum install -y https://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
# 查看系统中是否安装源
[root@web ~]# rpm -qa | grep epel
epel-release-7-14.noarch
[root@web ~]# yum info ansible  #查看ansible包信息
[root@web ~]# yum -y install ansible
[root@web ~]# ansible --version # 查看ansible版本信息

2.2 Redhat 8安装报错信息

在这里插入图片描述

# 报错信息:
没有提供ansible-5.4.0-3.el8.noarch所需的(ansible core>=2.12.2,ansible core<2.13)
(尝试添加“–skip break”以跳过可卸载的包,或添加“–nobest”以不仅使用最佳候选包)
# 解决办法:
更换yum源
配置yum源使用Centos-stream.repo
上传到 /etc/yum.repos.d/目录

2.3 安装Ansible出现依赖关系

# 解决办法:
1.清除所有的yum源
[root@ansible-master ~]# cd /etc/yum.repos.d/
[root@ansible-master yum.repos.d]# rm -rf *

2.重新拉取阿里镜像源
[root@ansible-master ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo

3.安装epel源,使用rpm包的方式
[root@ansible-master ~]# rpm -Uvh http://mirrors.ustc.edu.cn/epel/epel-release-latest-7.noarch.rpm

4.清除yum
[root@ansible-master ~]# yum clean all

5.重新建立缓存
[root@ansible-master ~]# yum makecache 

6.重新下载Ansible软件包
[root@ansible-master ~]# yum -y install ansible

3.Ansible相关文件

3.1 Ansible主配置文件

Ansible的主配置文件:/etc/ansible/ansible.cfg,其中配置文件中大部分配置被注释,使用默认配置

[root@localhost~]#vim /etc/ansible/ansible.cfg
[defaults]
$ansible主机清单列表文件:定义ansible管理主机IP地址
#inventory = /etc/ansible/hosts
$库文件存放目录
#library        = /usr/share/my_modules/
$ansible管理远程主机时,生成ansible临时文件路径
#remote_tmp = ~/.ansible/tmp
$ansible管理端本地临时文件
#local_tmp = ~/.ansible/tmp
$ansible管理并发数
#forks = 5
$设置默认执行ansible命令的用户
#sudo_user = root
$每次执行ansible命令需要输入远程主机sudo用户密码
#ask_sudo_pass = True
$默认连接的端口号
#remote_port    = 22
$检查对应服务器的host_key,建议取消注释 
#host_key_checking = False
$日志文件
#log_path = /var/log/ansible.log

配置如下

[root@localhost ~ ]# egrep -v '^$|^#' /etc/ansible/ansible.cfg
[defaults]
host_key_checking = False
log_path = /var/log/ansible.log

Ansible常用参数详解:

[defaults]          #通用默认配置
inventory      = /etc/ansible/hosts     #被控制端IP或者DNS列表
library        = /usr/share/my_modules/     ##默认搜寻模块的位置
remote_tmp     = ~/.ansible/tmp            #远程执行临时文件
local_tmp      = ~/.ansible/tmp
plugin_filters_cfg = /etc/ansible/plugin_filters.yml
forks          = 5      ##并行线程数
poll_interval  = 15     ##回频率或轮询间隔时间
sudo_user      = root       ##sudo远程执行用户名
ask_sudo_pass = True        ##使用sudo,是否需要输入密码
ask_pass      = True        ##是否需要输入密码
transport      = smart      ##通信机制
remote_port    = 22         ##远程SSH端口
module_lang    = C          ##模块和系统之间通信的语言
module_set_locale = False
gathering = implicit        ##控制默认facts收集(远程系统变量)
gather_subset = all
gather_timeout = 10
roles_path    = /etc/ansible/roles      ##使用playbook搜索Ansible roles
host_key_checking = False       ##是否检查远程主机密钥
sudo_exe = sudo         ##sudo远程执行命令
sudo_flags = -H -S -n       ##传递sudo之外的参数
timeout = 10            ##SSH超时时间
remote_user = root      ##远程登录用户名
log_path = /var/log/ansible.log     ##日志文件存放路径
module_name = command       ##Ansible命令默认执行的模块
executable = /bin/sh        ##执行的shell环境,用户shell模块
hash_behaviour = replace    ##特定的优先级覆盖变量
jinja2_extensions = jinja2.ext.do,jinja2.ext.i18    ##允许开启jinja2扩展模块
private_key_file = /path/to/file    ##私钥文件存储位置
display_skipped_hosts = True        ##显示跳过任何任务的状态
system_warnings = True      ##禁用系统运行Ansible潜在问题警告
deprecation_warnings = True     ##PlayBook输出禁用“不建议使用”警告
command_warnings = False    ##command模块Ansible默认发出警告
nocolor = 1         ##输出带上颜色区别,0表示开启,1表示关闭
pipelining = False      ##开启pipe SSH通道优化

[accelerate]        ##accelerate缓存加速
accelerate_port = 5099      ##加速连接端口5099
accelerate_timeout = 30     ##命令执行超过时间,单位为s
accelerate_connect_timeout = 5.0    ##上一个活动连接的时间,单位为min
accelerate_daemon_timeout = 30      ##允许多个私钥被加载到daemon
accelerate_multi_key = yes      ##任何客户端想要连接daemon都要开启这个选项

Ansible配置文件优先级

Ansible的配置文件优先级遵循一定的规则,以下是配置文件的优先级顺序:

  1. 执行ansible命令的当前目录中是否存在 ansible.cfg 文件
  2. 当前用户的家目录下是否存在 .ansible.cfg 文件
  3. /etc/ansible/ansible.cfg默认配置文件

​ 在运行Ansible命令时,命令将会按照以上顺序查找配置文件,优先使用高优先级的配置文件中的设置。如果当前目录下存在ansible.cfg 文件,则优先使用该文件中的配置,忽略其他低优先级的配置文件。如果当前目录下不存在 ansible.cfg 文件,但当前用户的家目录下存在 .ansible.cfg 文件,则使用该配置文件中的设置。如果以上两个路径下的配置文件都不存在,则使用默认的 /etc/ansible/ansible.cfg 配置文件中的设置。

​ 此外,还可以通过环境变量来设置Ansible的配置,例如设置 ANSIBLE_CONFIG 环境变量来指定配置文件的路径。使用环境变量可以覆盖其他配置文件中的设置,具有最高的优先级。

3.2 Ansible 主机清单 inventory

​ Ansible的主要功用在于批量主机操作,为了便捷地使用其中的部分主机,可以在inventory file主机清单文件找那个定义管理目标主机信息(IP地址,SSH端口,SSH密码);默认的inventory file为/etc/ansible/hosts

3.2.1 指明地址

直接指明主机地址或主机名(需要在/etc/hosts解析)

[root@ansible-master ~]# vim /etc/hosts
[root@ansible-master ~]# tail -n 3 /etc/hosts
192.168.80.132 ansible-master
192.168.80.147 ansible-apache
192.168.80.151 ansible-mysql
3.2.2 地址分组

把管理相同主机分为一组,统一进行管理
示例

[组名]
IP: [SSH_PORT]

例如:
[root@ansible-master ~]# vim /etc/ansible/hosts 
[root@ansible-master ~]# egrep -v '^$|^#' /etc/ansible/hosts 
[Apache]  #把主机分组整合,便于执行相同操作
192.168.80.147:22 # 默认端口号为22,可以省略不写
[MySQL]
192.168.80.151
[root@ansible-master ~]# 
3.2.3 通配符

利用通配符配置多台连续主机IP地址

[websrvs]
www[1:100].example.com
[dbsrvs]
db-[a:f].example.com
[appsrvs]
10.0.0.[1:100]
3.2.4 主机变量

你可以为主机定义变量,这些变量可以在 playbook、任务或模块中使用。在主机清单中,你可以使用缩进的方式定义变量,如下所示:

[kps_server]
server1 ansible_host=119.96.231.32 ansible_user=root ansible_ssh_port=9022 ansible_ssh_pass=Gizakps@1289 ansible_python_interpreter=/usr/bin/python
server2 ansible_host=36.111.203.105 ansible_user=root ansible_ssh_port=9022 ansible_ssh_pass=Gizakps@1289 ansible_python_interpreter=/usr/bin/python
3.2.5 主机元数据和条件语句

主机元数据和条件语句来进一步定制化你的主机清单。例如,你可以使用条件语句来根据主机的操作系统或其他条件来应用不同的配置或变量

[webservers]  
web1.example.com ansible_os_family=Debian web_server_port=80 web_server_proto=http  
web2.example.com ansible_os_family=RedHat web_server_port=80 web_server_proto=https
3.2.6 自定义清单文件路径

​ 使用自定义的清单文件路径而不是默认路径,可以使用 -i 参数指定路径。例如:ansible -i /path/to/inventory ...这将告诉 Ansible 在指定的路径下查找清单文件。确保指定的路径是正确的,并且清单文件具有正确的格式和语法

3.3 Ansible相关工具

工具命令 说明
ansible 主程序,临时命令执行工具
ansible-doc 查看配置文档,模块功能查看工具,相当于man
ansible-playbook 定制自动化任务,编排剧本工具,相当于脚本
ansible-pull 远程执行命令的工具
ansible-vault 文件加密工具
ansible-console 基于Console界面与用户交互的执行工具
ansible-galaxy 下载/上传优秀代码或Roles模块的官网平台
3.3.1 Ansible

主程序,临时命令执行工具

# 语法:ansible <host-pattern> [option] [-m module_name] [-a args]
#host-pattern 从主机清单文件中匹配指定管理的主机
#optional ansible参数
#module_name ansible管理模块
#args 复杂模块需要指定模块的参数
参数 说明
ansible --version 显示ansible版本信息
ansible -v 显示执行命令详细过程,-vv -vvv -vvvv -vvvvv 更加详细
ansible --list | --list-hosts 显示主机列表
ansible -k ansible默认基于ssh秘钥验证,ansible -k 以密码口令验证,只允许输入一次
ansible -C 检查,并不执行
ansible -T <10> 执行命令的超时时间,默认10s
ansible -u 执行远程执行的用户
ansible -b 执行sudo
ansible --become-user= 指定sudo的runas用户,默认为root
ansible -K 提示输入sudo时的口令

1.查看主机清单

[root@ansible-master ~]# ansible all --list-hosts  # 查看所有的主机清单
  hosts (2):
    192.168.80.147
    192.168.80.151
[root@ansible-master ~]# ansible MySQL --list-hosts # 查看组名为MySQL的主机清单
  hosts (1):
    192.168.80.151
[root@ansible-master ~]# ansible Apache --list-hosts
  hosts (2):
    192.168.80.147
    192.168.80.151
[root@ansible-master ~]# ansible '*' --list-hosts  # 支持通配符
  hosts (2):
    192.168.80.147
    192.168.80.151
[root@ansible-master ~]# ansible 192.168.80.* --list-hosts
  hosts (2):
    192.168.80.151
    192.168.80.147
[root@ansible-master ~]# ansible 'Apache:MySQL' --list-hosts # 逻辑或:匹配多个主机清单并集
  hosts (2):
    192.168.80.147
    192.168.80.151
[root@ansible-master ~]# ansible 'Apache:&MySQL' --list-hosts # 逻辑与:匹配多个主机清单交集
  hosts (1):
    192.168.80.151
[root@ansible-master ~]# ansible 'Apache:!MySQL' --list-hosts # 逻辑非:匹配第一个主机清单与其他主机清单中独有的主机
  hosts (1):
    192.168.80.147
[root@ansible-master ~]# 

2.以用户root的身份进行连接

[root@ansible-master ~]# ansible MySQL -u root -k -m command -a 'ls /root'
SSH password: 
192.168.80.151 | CHANGED | rc=0 >>
anaconda-ks.cfg
ecshop
ecshop-4.1.12.zip
ecshop.zip
LOIC-1.0.8-binary.zip
PikachuSQL布尔盲注.txt
充值系统.zip
[root@ansible-master ~]#

3.支持正则表达式

[root@ansible-master ~]# ansible "~(MySQL|Apache)" -m ping
192.168.80.147 | SUCCESS => {
   
   
    "ansible_facts": {
   
   
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}
192.168.80.151 | SUCCESS => {
   
   
    "ansible_facts": {
   
   
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}
[root@ansible-master ~]# 

Ansible命令执行过程

  1. 加载自己的配置文件,默认 /etc/ansible/ansible.cfg
  2. 查找对应的主机配置文件,找到要执行的主机或者组
  3. 加载自己对应的模块文件,如 command
  4. 通过ansible将模块或命令生成对应的临时py文件(python脚本), 并将该文件传输至远程服务器
  5. 对应执行用户的家目录的 .ansible/tmp/XXX/XXX.PY 文件
  6. 给文件 +x 执行权限
  7. 执行并返回结果
  8. 删除临时py文件, exit 0 退出

Ansible执行状态

  • 绿色:执行成功并且不需要做改变的操作

  • 黄色:执行成功并且对主机做变更

  • 红色:执行失败

  • 紫色:警告信息(忠告|建议)

  • 蓝色: 显示Ansible命令执行的过程

    可以通过修改配置文件来修改Ansible默认状态
    ……
    [colors]
    #highlight = white
    #verbose = blue
    #warn = bright purple
    #error = red
    #debug = dark gray
    #deprecate = purple
    #skip = cyan
    #unreachable = red
    #ok = green
    #changed = yellow
    #diff_add = green
    #diff_remove = red
    #diff_lines = cyan
    ……
    
3.3.2 Ansible-doc

查看配置文档,模块功能查看工具,相当于man帮助

# 语法:ansible-doc [option][module....]

# ansible-doc -l :查看ansible模块列表,支持vim的搜索操作

# ansible-doc -s :查看ansible模块的简要说明
1.列出所有的模块
[root@ansible-master ~]# ansible-doc -l 
[root@ansible-master ~]# ansible-doc -l | wc -l  # 查看所有模块的个数
3387
2.查看指定模块的帮助用法
[root@ansible-master ~]# ansible-doc ping
3.查看指定模块的简要的说明
[root@ansible-master ~]# ansible-doc -s ping
3.3.3 Ansible-vault

ansible-vault命令:用于加密解密yml文件

[root@ansible-master ~]# ansible-vault create new.yml  #创建新的加密文件
New Vault password:  # 输入加密密码
Confirm New Vault password:  # 确认加密密码
[root@ansible-master ~]# ansible-vault view new.yml  # 查看文件
Vault password:  # 输入加密的密码
hello yml
hello world
hello ansible

[root@ansible-master ~]# cat new.yml #查看加密后的文件,会发现加密
$ANSIBLE_VAULT;1.1;AES256
64366534373361376439313037313637343237643337376262633531643631343731336262303538
3034616530343063313239333037316565323934613265320a326433656264386461663338316633
33363931623334346162363034666632646539343966393661623532383332623935393132616166
6532643165343333620a646432396630343365613633386635353835313832623438396533383334
66623638343633626564313637623763326136383864363636313837366434353361306330656231
6465323563343435316263353262353036353562313863626534
[root@ansible-master ~]# ansible-vault decrypt new.yml  #解密加密的文件
Vault password: 
Decryption successful
[root@ansible-master ~]# cat new.yml  # 查看文件
hello yml
hello world
hello ansible

[root@ansible-master ~]# ansible-vault encrypt new.yml  # 加密文件
New Vault password: 
Confirm New Vault password: 
Encryption successful
[root@ansible-master ~]# ansible-vault edit new.yml   # 编辑加密文件 
Vault password:  
[root@ansible-master ~]# ansible-vault rekey new.yml  # 修改加密文件的密码
Vault password: 
New Vault password: 
Confirm New Vault password: 
Rekey successful
[root@ansible-master ~]# 

3.3.4 Ansible-console

此工具可交互执行命令,支持tab,ansible 2.0+新增

提示符格式

执行用户@当前操作的主机组(当前组的主机数量)[f:并发数]$

常用子命令

  • 设置并发数: forks n 例如: forks 10
  • 切换组: cd 主机组 例如: cd web
  • 列出当前组主机列表: list
  • 列出所有的内置命令: ?或help

示例:

[root@ansible-master ~]# ansible-console
Welcome to the ansible console.
Type help or ? to list commands.
# 切换管理主机组
root@all (2)[f:5]$ cd Apache
# 并发数
root@Apache (2)[f:5]$ forks 10
# 查看组的主机列表
root@Apache (2)[f:10]$ list
192.168.80.147
192.168.80.151
# 执行模块
root@Apache (2)[f:10]$ ping
192.168.80.151 | SUCCESS => {
   
   
    "ansible_facts": {
   
   
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}
192.168.80.147 | SUCCESS => {
   
   
    "ansible_facts": {
   
   
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}
root@Apache (2)[f:10]$ 
3.3.5 Ansible-galaxy

ansible-galaxy命令:会连接 https://galaxy.ansible.com 下载相应的roles剧本

#列出所有已安装的galaxy
ansible-galaxy list
#安装galaxy
ansible-galaxy install geerlingguy.mysql
ansible-galaxy install geerlingguy.redis
#删除galaxy
ansible-galaxy remove geerlingguy.redis

4.如何双机互信

4.1 生成密钥

[root@ansible-master ~]# ssh-keygen 

4.2 发送密钥

[root@ansible-master ~]# ssh-copy-id -i 192.168.80.147
……
[email protected]'s password:  # 目标主机的密码
……

[root@ansible-master ~]# ssh-copy-id -i 192.168.80.151
……
[email protected]'s password: # 目标主机的密码
……
[root@ansible-master ~]# 

4.3 验证密钥

[root@ansible-master ~]# ssh ansible-mysql
Last login: Sun Oct 30 22:14:29 2022 from master
[root@ansible-mysql ~]# exit
登出
Connection to ansible-mysql closed.
[root@ansible-master ~]# ssh ansible-apache 
Last login: Sun Oct 30 22:14:37 2022 from master
[root@ansible-apache ~]# exit
登出
Connection to ansible-apache closed.
[root@ansible-master ~]# 

5.Ansible常用模块

5.1 command模块

command模块:通过command模块实现在远程主机上执行命令,是ansible默认模块,可以忽略 ansible -m 选项

注意:command模块不支持一些符号: $ > >> << < | ; &&

模块子命令 说明
cmd 在远程主机上执行的命令
chdir 远程切换目录
creates 指定文件若存在,则不执行cmd
removes 指定文件若存在,则执行cmd,但是creates优先级高于removes
[root@ansible-master ~]# ansible all -a 'cat /etc/redhat-release'  # 在远程主机上查看系统版本
192.168.80.151 | CHANGED | rc=0 >> 
CentOS Linux release 7.9.2009 (Core)
192.168.80.147 | CHANGED | rc=0 >>
CentOS Linux release 7.9.2009 (Core)
[root@ansible-master ~]# ansible MySQL -a 'date'   # 在远程组上查看系统时间
192.168.80.151 | CHANGED | rc=0 >>
20221031日 星期一 10:29:57 CST
[root@ansible-master ~]# ansible 192.168.80.147 -a 'chdir=/etc cat hostname'  # 切换文件目录,查看文件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值