一、自动化运维应用场景

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

 

 

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。