一、自动化运维应用场景
1、运维职业发展路线
2、企业实际应用场景分析
DEV开始环境-》测试环境-》预发布环境-》发布环境-》生产环境-》灰度环境
3、常见自动化运维工具
Ansible:python,Agentless,中小型应用环境 Saltstack:python,一般需部署agent,执行效率更高 Puppet:ruby, 功能强大,配置复杂,重型,适合大型环境 Fabric:python,agentless Chef:ruby,国内应用少 Cfengine func
二、Ansible 介绍和架构 公司计划在年底做一次大型市场促销活动,全面冲刺下交易额,为明年的上市做准备。公司要求各业务组对年底大促做准备,运维部要求所有业务容量进行三倍的扩容,并搭建出多套环境可以供开发和测试 人员使用,运维老大为了在年底有所表现,要求运维部门同学尽快实现,当你接到这个任务时,有没有更快的解决方案?
1、Ansible 发展史 作者:Michael DeHaan( Cobbler 与 Func 作者) Ansible 的名称来自科幻小说《安德的游戏》中跨越时空的即时通信工具,使用它可以在相距数光年的距离,远程实时控制前线的舰队战斗 2012-03-09,发布0.0.1版,2015-10-17,Red Hat宣布1.5亿美元收购 官网:https://www.ansible.com/ 官方文档:https://docs.ansible.com/
2、Ansible 功能
批量执行远程命令,可以对远程的多台主机同时进行命令的执行 批量安装和配置软件服务,可以对远程的多台主机进行自动化的方式配置和管理各种服务 编排高级的企业级复杂的IT架构任务, Ansible的Playbook和role可以轻松实现大型的IT复杂架构 提供自动化运维工具的开发API, 有很多运维工具,如jumpserver就是基于 ansible 实现自动化管理功能
3、Ansible 特点
(1)优点
功能丰富的模块:提供了多达数千个的各种功能的模块,完成特定任务只需调用特定模块即可,还支持自定义模块,可使用任何编程语言写模块 使用和部署简单: 无需安装专用代理软件,基于python和SSH(默认已安装)实现 安全: 基于OpenSSH实现安全通讯无需专用协议 幂等性:一个任务执行1遍和执行n遍效果一样,不因重复执行带来意外情况,此特性和模块有关 支持playbook编排任务,YAML格式,编排任务,支持丰富的数据结构 较强大的多层解决方案 Role Python语言实现, 基于Paramiko(python对ssh的实现),PyYAML,Jinja2(模板语言)三个关键模块 属于红帽(IBM)公司产品,背景强大,未来发展前景光明
(2)缺点 如果管理的主机较多时,执行效率不如saltstack高 当前还不支持像MySQL数据库一样的事务回滚
4、Ansible 架构
(1)Ansible 组成
组合INVENTORY、API、MODULES、PLUGINS的绿框,为ansible命令工具,其为核心执行工具
INVENTORY:Ansible管理主机的清单文件,默认为 /etc/ansible/hosts MODULES:Ansible执行命令的功能模块,多数为内置核心模块,也可自定义 PLUGINS:模块功能的补充,如连接类型插件、循环插件、变量插件、过滤插件等,该功能不常用 API:供第三方程序调用的应用程序编程接口
(2)Ansible 命令执行来源 USER 普通用户,即SYSTEM ADMINISTRATOR PLAYBOOKS:任务剧本(任务集),编排定义Ansible任务集的配置文件,由Ansible顺序依次执行,通常是JSON格式的YML文件 CMDB(配置管理数据库) API 调用 PUBLIC/PRIVATE CLOUD API调用 USER-> Ansible Playbook -> Ansibile (3)注意事项 执行ansible的主机一般称为管理端, 主控端,中控,master或堡垒机 主控端Python版本需要2.6或以上 被控端Python版本小于2.4,需要安装python-simplejson 被控端如开启SELinux需要安装libselinux-python windows 不能做为主控端,只能做为被控制端
二、Ansible 安装和常见模块
1、Ansible 安装
ansible的安装方法有多种 官方文档
https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html https://docs.ansible.com/ansible/latest/installation_guide/index.html
下载
https://releases.ansible.com/ansible/
pip 下载
https://pypi.org/project/ansible/
(1)包安装方式
#CentOS 的EPEL源的rpm包安装 [root@centos ~]#yum install ansible #ubuntu 安装 [root@ubuntu ~]#apt -y install ansible
(2)pip 安装
pip 是安装Python包的管理器,类似 yum 范例: 在rocky8上通过pip3安装ansible
[root@rocky8 ~]#yum -y install python39 rust [root@rocky8 ~]#pip3 install ansible [root@rocky8 ~]#ansible --version [root@rocky8 ~]#yum -y install python38 python38-pip [root@rocky8 ~]#pip3 install --upgrade pip -i https://pypi.douban.com/simple [root@rocky8 ~]#pip3 install ansible -i https://pypi.douban.com/simple/ [root@rocky8 ~]#ansible --version
2、Ansible 相关文件
(1)Ansible 配置文件列表
/etc/ansible/ansible.cfg 主配置文件,配置ansible工作特性,也可以在项目的目录中创建此文件,当前目录下如果也有ansible.cfg,则此文件优先生效,建议每个项目目录下,创建独有的ansible.cfg文件 /etc/ansible/hosts 主机清单 /etc/ansible/roles/ 存放角色的目录
(2)Ansible 主配置文件
Ansible 的配置文件可以放在多个不同地方,优先级从高到低顺序如下
ANSIBLE_CONFIG #环境变量,注意:指定目录下的ansible.cfg文件必须存在才能生效 ./ansible.cfg #当前目录下的ansible.cfg,一般一个项目对应一个专用配置文件,推荐使 用 ~/.ansible.cfg #当前用户家目录下的.ansible.cfg /etc/ansible/ansible.cfg #系统默认配置文件
Ansible 的默认配置文件 /etc/ansible/ansible.cfg ,其中大部分的配置内容无需进行修改
[defaults] #inventory = /etc/ansible/hosts #主机列表配置文件 #library = /usr/share/my_modules/ #库文件存放目录 #remote_tmp = $HOME/.ansible/tmp #临时py命令文件存放在远程主机目录 #local_tmp = $HOME/.ansible/tmp #本机的临时命令执行目录 #forks = 5 #默认并发数 #sudo_user = root #默认sudo 用户 #ask_sudo_pass = True #每次执行ansible命令是否询问ssh密码 #ask_pass = True #remote_port = 22 #host_key_checking = False #检查对应服务器的host_key,建议取消此行注释,实现第一次连 接自动信任目标主机 #log_path=/var/log/ansible.log #日志文件,建议启用 #module_name = command #默认模块,可以修改为shell模块 [privilege_escalation] #普通用户提权配置 #become=True #become_method=sudo #become_user=root #become_ask_pass=False
(3) Inventory 主机清单文件
ansible的主要功用在于批量主机操作,为了便捷地使用其中的部分主机,可以在inventory 主机清单文件中将其分组组织 默认的inventory file为 /etc/ansible/hosts inventory file可以有多个,且也可以通过Dynamic Inventory来动态生成 注意: 生产建议在每个项目目录下创建项目独立的hosts文件 通过项目目录下的ansible.cfg文件中的 inventory = ./hosts实现 官方文档:
https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html
主机清单文件格式 inventory文件遵循INI文件风格,中括号中的字符为组名。可以将同一个主机同时归并到多个不同的组中 此外,当如若目标主机使用了非默认的SSH端口,还可以在主机名称之后使用冒号加端口号来标明 如果主机名称遵循相似的命名模式,还可以使用列表的方式标识各主机 Inventory 参数说明
3、Ansible相关工具
/usr/bin/ansible 主程序,临时命令执行工具
/usr/bin/ansible-doc 查看配置文档,模块功能查看工具,相当于man /usr/bin/ansible-playbook 定制自动化任务,编排剧本工具,相当于脚本 /usr/bin/ansible-pull 远程执行命令的工具 /usr/bin/ansible-vault 文件加密工具 /usr/bin/ansible-console 基于Console界面与用户交互的执行工具 /usr/bin/ansible-galaxy 下载/上传优秀代码或Roles模块的官网平台 利用ansible实现管理的主要方式: Ansible Ad-Hoc 即利用ansible命令,主要用于临时命令使用场景 Ansible playbook 主要用于长期规划好的,大型项目的场景,需要有前期的规划过程 ansible 使用前准备 ansible 相关工具大多数是通过ssh协议,实现对远程主机的配置管理、应用部署、任务执行等功能 建议:使用此工具前,先配置ansible主控端能基于密钥认证的方式联系各个被管理节点
(1)ansible-doc
此工具用来显示模块帮助,相当于man
格式
ansible-doc [options] [module...] -l, --list #列出可用模块 -s, --snippet #显示指定模块的playbook片段
(2)ansible
Ansible Ad-Hoc 介绍 Ansible Ad-Hoc 的执行方式的主要工具就是 ansible 特点: 一次性的执行,不会保存执行命令信息,只适合临时性或测试性的任务 3.3.2.2 ansible 命令用法 格式:
ansible <host-pattern> [-m module_name] [-a args]
选项说明:
(3)ansible-console
此工具可交互执行命令,支持tab,ansible 2.0+新增
提示符格式:
执行用户@当前操作的主机组 (当前组的主机数量)[f:并发数]$
常用子命令:
设置并发数: forks n 例如: forks 10 切换组: cd 主机组 例如: cd web 列出当前组主机列表: list 列出所有的内置命令: ?或help
4、Ansible常用模块
虽然模块众多,但最常用的模块也就2,30个而已,针对特定业务只需要熟悉10几个模块即可 常用模块帮助文档参考:
https://docs.ansible.com/ansible/2.9/modules/modules_by_category.html https://docs.ansible.com/ansible/2.9/modules/list_of_all_modules.html https://docs.ansible.com/ansible/latest/modules/list_of_all_modules.html https://docs.ansible.com/ansible/latest/modules/modules_by_category.html
(1)Command 模块
功能:在远程主机执行命令,此为默认模块,可忽略 -m 选项 注意:此命令不支持 $VARNAME < > | ; & 等,可能用shell模块实现 注意:此模块不具有幂等性 常见选项
chdir=dir #执行命令前,先切换至目录dir creates=file #当file不存在时才会执行 removes=file #当file存在时才会执行
(2)Shell 模块
功能:和command相似,用shell执行命令,支持各种符号,比如:*,$, > , 相当于增强版的command模块 注意:此模块不具有幂等性,建议能不能就用此模块,最好使用专用模块 常见选项
chdir=dir #执行命令前,先切换至目录dir creates=file #当file不存在时才会执行 removes=file #当file存在时才会执行
注意:调用bash执行命令 类似 cat /tmp/test.md | awk -F’|’ ‘{print $1,$2}’ &> /tmp/example.txt 这些复杂命令,即使使用shell也可能会失败,解决办法:写到脚本时,copy到远程,执行,再把需要的结果拉回执行命令的机器
(3)Script 模块
功能:在远程主机上运行ansible服务器上的脚本(无需执行权限) 注意:此模块不具有幂等性 常见选项
chdir=dir #执行命令前,先切换至目录dir cmd #指定ansible主机的命令 creates=file #当file不存在时才会执行 removes=file #当file存在时才会执行
(4)Copy 模块
功能:复制ansible服务器主控端或远程的本机的文件到远程主机 注意: src=file 如果是没指明路径,则为当前目录或当前目录下的files目录下的file文件 常见选项
src #控制端的源文件路径 dest #被控端的文件路径 owner #属主 group #属组 mode #权限 backup #是否备份 validate #验证成功才会执行copy remote_src #no是默认值,表示src文件在ansible主机,yes表示src文件在远程主机
(5)Get_url 模块 功能: 用于将文件从http、https或ftp下载到被管理机节点上 常用参数如下:
(6)Fetch 模块
功能:从远程主机提取文件至ansible的主控端,copy相反,目前不支持目录 常见选项
src #被控制端的源文件路径,只支持文件 dest #ansible控制端的目录路径
(7)File 模块
功能:设置文件属性,创建文件,目录和软链接等 常见选项
(8)stat 模块
功能:检查文件或文件系统的状态 注意:对于Windows目标,请改用win_stat模块 常见选项
path #文件/对象的完整路径(必须)
常用的返回值判断:
exists: 判断是否存在 isuid: 调用用户的ID与所有者ID是否匹配
(9)unarchive 模块
功能:解包解压缩 实现有两种用法: 将ansible主机上的压缩包传到远程主机后解压缩至特定目录,设置remote_src=no,此为默认值,可 省略 将远程本主机上或非ansible的其它主机的某个压缩包解压缩到远程主机本机的指定路径下,需要 设置remote_src=yes 常见参数:
(10)Archive 模块
功能:打包压缩保存在被管理节点 常见选项
path #压缩的文件或目录 dest #压缩后的文件 format #压缩格式,支持gz,bz2,xz,tar,zip
(11)Hostname 模块
功能:管理主机名 常见选项
name #修改后的主机名称
(12)Cron 模块
功能:计划任务 支持时间:minute,hour,day,month,weekday 常见选项
name #描述脚本的作用 minute #分钟 hour #小时 weekday #周 user #任务由哪个用户运行;默认root job #任务
(13)Yum 和 Apt 模块
功能:管理软件包 yum 管理软件包,只支持RHEL,CentOS,fedora,不支持Ubuntu其它版本 apt 模块管理 Debian 相关版本的软件包 yum常见选项
name #软件包名称 state #状态 =present #安装,此为默认值 =absent #删除 =latest #最新版 list #列出指定包 enablerepo #启用哪个仓库安装 disablerepo #不使用哪些仓库的包 exclude #排除指定的包 validate #是否检验,默认为yes
(14)yum_repository 模块
功能: 此模块实现yum的仓库配置管理 常见选项
name #仓库id description #仓库描述名称,对应配置文件中的name= baseurl #仓库的地址 gpgcheck #验证开启 gpgkey #仓库公钥路径
(15)Service 模块
此模块和sytemd功能相似,选项很多相同 功能:管理服务 常见选项
name #服务名称 state #服务状态 =started #启动 =stopped #停止 =restarted #重启 =reloaded #重载 enabled #开启自启动 daemon_reload #加载新的配置文件,适用于systemd模块
(16)User 模块
功能:管理用户 常见选项
name #创建的名称 uid #指定uid group #指定基本组 shell #登录shell类型默认/bin/bash create_home #是否创建家目录 password #设定对应的密码,必须是加密后的字符串才行,否则不生效 system #yes表示系统用户 groups #附加组 append #追加附加组使用,yes表示增加新的附加组 state #absen删除 remove #yes表示删除用户时将家目录一起删除 generate_ssh_key #创建私钥 ssh_keyu_bits #私钥位数 ssh_key_file #私钥文件路径
(17)Group 模块
功能:管理组 常见选项
name #指定组名称 gid #指定gid state =present #创建,默认 =absent #删除
(18)Lineinfile 模块
ansible在使用sed进行替换时,经常会遇到需要转义的问题,而且ansible在遇到特殊符号进行替换时, 会存在问题,无法正常进行替换 。 ansible自身提供了两个模块:lineinfile模块和replace模块,可以方便的进行替换 一般在ansible当中去修改某个文件的单行进行替换的时候需要使用lineinfile模块 功能:相当于sed,主要用于修改一行的文件内容 常见选项
path #被控端文件的路径 regexp #正则匹配语法格式,表示被替换的内容 line #替换为的内容 state #absent表示删除 insertafter #插入到替换内容前面,如和regexp同时存在,只在没找到与regexp匹配时才使用 insertafter insertbefore #插入到替换内容后面,如和regexp同时存在,只在没找到与regexp匹配时才使用 insertafter backrefs #支持后面引用,yes和no backup #修改前先备份 create #如果文件不存在,则创建,默认不存在会出错 mode #指定权限 owner #指定用户 group #指定组 #注意 regexp参数 :使用正则表达式匹配对应的行,当替换文本时,如果有多行文本都能被匹配,则只有最后面被 匹配到的那行文本才会被替换,当删除文本时,如果有多行文本都能被匹配,这么这些行都会被删除。
(19)Replace 模块
该模块有点类似于sed命令,主要也是基于正则进行匹配和替换,建议使用 功能: 多行修改替换 常见选项
path #被控端文件的路径 regexp #正则匹配语法格式,表示被替换的内容 replace #替换为的内容 after #插入到替换内容前面, before #插入到替换内容后面 backup #修改前先备份 mode #指定权限 owner #指定用户 group #指定组
(20)SELinux 模块
功能: 该模块管理 SELInux 策略 常见选项
policy #指定SELINUXTYPE=targeted state #指定SELINUX=disabled
(21)reboot 模块
功能: 重启 常见选项
msg #重启提示 pre_reboot_delay #重启前延迟时间的秒数 post_reboot_delay #重启后延迟时间的秒数后,再验证系统正常启动 reboot_timeout #重启后延迟时间再执行测试成功与否的命令 test_command #执行测试成功与否的命令
(22)mount 模块
功能: 挂载和卸载文件系统 常见选项
src #源设备路径,或网络地址 path #挂载至本地哪个路径下 fstype #设备类型; nfs opts #挂载的选项 state #挂载还是卸载 =present #永久挂载,但没有立即生效 =absent #卸载临时挂载,并删除永久挂载 =mounted #临时挂载 =unmounted #临时卸载
(23)Setup 模块
功能: setup 模块来收集主机的系统信息,这些 facts 信息可以直接以变量的形式使用,但是如果主机 较多,会影响执行速度 可以使用 gather_facts: no 来禁止 Ansible 收集 facts 信息 常见选项
filter #指定过滤条件
(24)debug 模块
功能: 此模块可以用于输出信息,并且通过 msg 定制输出的信息内容,功能类似于echo命令 注意: msg后面的变量有时需要加 ” ” 引起来 常见选项
msg #指定命令输出的信息 var #指定变量名,和msg互斥 verbosity #详细度
(25)sysctl 模块
功能: 修改内核参数 常见选项
name #内核参数 value #指定值 state #是否保存在sysctl.conf文件中,默认present sysctl_set #使用sysctl -w 验证值生效
(26)pam_limits
功能: 管理资源限制 范例:
- name: Change Limit /etc/security/limit.conf pam_limits: domain: "*" limit_type: "{{ item.limit_type }}" limit_item: "{{ item.limit_item }}" value: "{{ item.value }}" loop: - { limit_type: 'soft', limit_item: 'nofile',value: '100000' } - { limit_type: 'hard', limit_item: 'nofile',value: '10000' }
(27)apt_repository 模块
功能: 此模块实现apt的仓库配置管理 常见选项
repo #仓库信息 state #添加或删除 update_cache #是否apt update,默认yes filename #仓库文件,默认放在/etc/apt/sources.list.d/file.list
(28) apt_key 模块
功能: 添加和删除apt key 常见选项
url #key路径 state #添加或删除
(29)其它模块
ansible 还提供了很多针对各种应用的模块,比如
nginx_status_info nginx_status_facts mysql_db #需要安装MySQL-python包 mysql_user #需要安装MySQL-python包 redis mongodb* postgresql* haproxy git