一:关于自动化我们要知道的
1、自动化是什么?
IT运维自动化是一组将静态的设备结构转化为根据IT服务需求动态弹性响应的策略,目的就是实现IT运维的质量,降低成本。可以说自动化运维一定是IT运维高层面的重要属性之一。
2、为什么要使用自动化技术?
当公司规模扩大,从初期的几台服务器发展到庞大的数据中心时,自然而然的单靠人工就无法满足在技术、业务、管理等方面的要求,那么标准化、自动化、架构优化、过程优化等降低IT服务成本的因素越来越被人们所重视。
3、自动化的目的是什么?
自动化作为其重要属性之一已经不仅仅只是代替人工操作,更重要的是深层探知和全局分析,关注的是在当前条件下如何实现性能与服务最优化,同时保障投资收益最大化。
二:自动化工具——Ansible软件详解
1、是什么
基于python开发的,集合了众多运维工具(puppet、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
2、Ansible软件特点
①部署简单,只需在主控端部署Ansible环境,被控端无需做任何操作;?
②默认使用SSH协议对设备进行管理;?
③有大量常规运维操作模块,可实现日常绝大部分操作。?
④配置简单、功能强大、扩展性强;?
⑤支持API及自定义模块,可通过Python轻松扩展;?
⑥通过Playbooks来定制强大的配置、状态管理;?
⑦轻量级,无需在客户端安装agent,更新时,只需在操作机上 进行一次更新即可;?
⑧提供一个功能强大、操作性强的Web管理界面和REST API接口 ——AWX平台。
3、Ansible基本架构图 && 核心组件说明
Ansible:Ansible核心程序。 HostInventory:记录由Ansible管理的主机信息,包括端口、密码?、ip等。 Playbooks:“剧本”YAML格式文件,多个任务定义在一个文件?中,定义主机需要调用哪些模块来完成的功能。 CoreModules:核心模块,主要操作是通过调用核心模块来完成管?理任务。 CustomModules:自定义模块,完成核心模块无法完成的功能,?支持多种语言。 ConnectionPlugins:连接插件,Ansible和Host通信使用
4、ansible任务执行模式:单个命令、批量命令
①ad-hoc模式:使用单个模块,支持批量执行单条命令。 ad-hoc 命令是一种可以快速输入的命令,而且不需要保存起来的命令。就相当于bash中的一句话shell。
②playbook模式:是Ansible主要管理方式,也是Ansible功能强大的关 键所在。playbook通过多个task集合完成一类功能,如Web服务的安装部署、数据库服务器的批量备份等。可以简单地把playbook理解为通过组合多条ad-hoc进行操作的配置文件。
5、ansible执行流程 && 流程描述
1、加载自己的配置文件?默认/etc/ansible/ansible.cfg? 2、查找对应的主机配置文件,找到要执行的主机或者组? 3、加载自己对应的模块文件,如command? 4、通过ansible将模块或命令生成对应的临时py文件,并将该文件传?输至远程服务器的? 5、对应执行用户的家目录的.ansible/tmp/XXX/XXX.PY文件? 6、给文件+x执行? 7、执行并返回结果? 8、删除临时py文件,sleep?0退出
三:Ansible常用命令及用法
※常用命令
/usr/bin/ansible???????????????#?Ansibe?AD-Hoc?临时命令执行工具,常用于临时命?令的执行 /usr/bin/ansible-doc???????????#?Ansible?模块功能查看工具 /usr/bin/ansible-galaxy????????#?下载/上传优秀代码或Roles模块?的官网平台?,基于网络的 /usr/bin/ansible-playbook??????#?Ansible?定制自动化的任务集编排工具 /usr/bin/ansible-pull??????????#?Ansible远程执行命令的工具,拉取配置而非推?送配置(使用较少,海量机器时使用,对运维的架构能力要求较高) /usr/bin/ansible-vault?????????#?Ansible?文件加密工具 /usr/bin/ansible-console???????#?Ansible基于Linux?Consoble界面可与用户交互的命令执行工具
※命令详解
1、ansible-doc
(1)命令格式
ansible-doc [options] [module...]
(2)options
-h:--help ?显示命令参考API文档
-l:--list? ? 列出可用模块
-M module_path:--module-path=module_path? ? 指定模块路径
-s mode_name:--snippet? ? 获取指定模块的使用帮助
--version:显示版本信息
2、ansible
(1)命令格式
①ansible?[-f?forks]?[-m?module_name]?[-a?args] ②ansible??<host-pattern>?[options]?Options
(2)options
·?-a?MODULE_ARGS,?--args=MODULE_ARGS?:模块的参数,如果执行默认COMMAND的模块,即是命令参数?,如:“date”,“pwd”等等?module?arguments?模块 参数 ·?-m?MODULE_NAME,?--module-name=MODULE_NAME:执行模块的名字,默认使用"command"?模块,所以如果是只执行单一命令可以不用 ·?-M?MODULE_PATH,?--module-path=MODULE_PATH:要执行的模块的路径(default:/usr/share/ansible) ·?-f?FORKS,?--forks=FORKS:?并行任务数(default:5) ·?-C,?--check:测试模式。测试一下会改变什么内容,不会真正去执行;相反,试图预测一些可能发生的变化 ·?-c?connection,--connection=CONNECTION:连接类型使用(default:smart) ·?-v,?--verbose(-vvv,-vvvv):显示命令执行的详细信息/超详细信息?(常和-C配合使用,用于运行前测试环节) ·?-i?INVENTORY,?--inventory-file=INVENTORY:指定主机清单存放路径,默认为/etc/ansible/hosts ·?-S,?--su?:使用?su?命令 ·?-R?SU_USER,?--su-user=SU_USER?指定SU的用户(default:root) ·?-s,?--sudo:以sudo方式运行(不需要密码) ·?-U?SUDO_USER,?--sudo-user=SUDO_USER?:sudo到哪个用户(default:root) ·?-T?TIMEOUT,?--timeout=TIMEOUT:指定SSH默认超时时间(default:10s) ·?-u?REMOTE_USER,?--user=REMOTE_USER:默认连接到远程主机哪个用户(default:root) ·?-k,?--ask-pass:登陆密码,提示输入ssh密码而不是假设基于密钥的验证 ·?-K,?--ask-sudo-pass:提示密码使用sudo,sudo表示提权操作 ·?-B?SECONDS,?--background=SECONDS:后台运行超时时间 ·?-h,--help:查看帮助? ·?-o,?--one-line:压缩输出,摘要输出,尝试将所有内容都在一行上输出。 ·?-private-key=PRIVATE_KEY_FILE:私钥路径,使用这个文件来验证连接
(3)常用模块
①ping?测试主机网络连通性?
[[email protected]?~]#?ansible?all?-m?ping 172.17.214.75?|?SUCCESS?=>?{ ????"changed":?false, ????"ping":?"pong" } 172.17.214.74?|?SUCCESS?=>?{ ????"changed":?false, ????"ping":?"pong" }
②command执行命令?
[[email protected]?~]#?ansible?webserver?-m?command?-a?‘ifconfig‘??在webserver主机组上执行命令ifconfig
注意:命令模式下,‘‘?的用法? :‘命令名称+用空格分隔的列表参数‘, 给定的命令将在所有指定节点上执行,但不支持shell命令模式,如下列几种:
$arg、"<"、">"、"|"、";"、"&"等shell命令,有其特定的命令:
? ?· chdir=dir_name:切换目录
? ?· executable:切换shell来执行命令(注意:命令要使用绝对路径表示)
? ?· free_form:要执行的linux命令,一般用-a选项代替
? ?· creates=file_name:文件存在,则命令不执行,只可用来做判断
? ?· removes=file_name:文件存在,则命令执行,也用来做判断
? ? 使用示例如下:
①[[email protected]?~]#?ansible?all?-m?command?-a?‘creates=/app/hehe.w??ls‘ 172.17.214.74?|?SUCCESS?|?rc=0?>> skipped,?since?/app/hehe.w?exists 172.17.214.75?|?SUCCESS?|?rc=0?>> skipped,?since?/app/hehe.w?exists 因为两主机都存在此文件,所以ls命令不执行 ②[[email protected]?~]#?ansible?all?-m?command?-a?‘removes=/app/hehe.w?ls‘?????? 172.17.214.74?|?SUCCESS?|?rc=0?>> 172.17.214.75?|?SUCCESS?|?rc=0?>> 两主机文件存在,则执行此ls命令
③shell?远程主机执行shell命令(支持管道、重定向等特殊符号)?
[[email protected]?~]#?ansible?all?-m?shell?-a?‘cat?/etc/passwd?|?grep?"root"‘ 172.17.214.74?|?SUCCESS?|?rc=0?>> root:x:0:0:root:/root:/bin/bash 172.17.214.75?|?SUCCESS?|?rc=0?>> root:x:0:0:root:/root:/bin/bash
④copy? ? 复制文件到远程主机?
copy模块常见用法: 1、复制文件 -a?"src=?dest=?" 2、生成指定内容的文件 -a?"content=?dest=?" copy模块常用选项: ①backup=<yes|no>?:覆盖文件之前,备份原文件 ②content:功能与重定向">"相同,文件存在则覆盖文件内容(default),不能存在则创建指定内容文件 ③dest:文件或目录,必须为绝对路径 ④src:文件或目录,相对路径|绝对路径。 ⑤directory_mode:递归设置目录权限,默认为系统默认权限 ⑥force?yes|no?:设为yes时,若目标主机包含该文件,则强制覆盖;若为no,则只有目标主机不存在该文件时才复制。(default:yes) ⑦others:所有file模块里的选项都可以在这里面使用。
⑤file? ? 设置文件属性?
常见用法: 1、创建目录 -a?‘path=?state=directory‘ 2、创建链接文件 -a?‘path=?src=?state=link‘ 3、删除文件 -a?‘path=?state=absent‘ 4、常见选项: ①force?yes|no:强制创建软链接。第一,源文件不存在,但稍后会创建;第二,目标软链接已存在,需要先取消之前的链接关系,创建新的软链接。 ②group:定义文件/目录的属组?mode:定义文件/目录权限 ③owner:定义文件/目录的属主?path:定义文件/目录路径(必选项) ④recurse:递归设置文件属性 ⑤src:被链接的源文件路径,只应用于state=link ⑥dest:被链接的文件路径,只应用于state=link ⑦state: ????directory:若目录不存在,则创建目录 ????file:文件不存在也不创建 ????link:创建软连接 ????hard:创建硬链接 ????touch:若文件不存在,则会创建一个新文件,?若存在,则更新时间戳 ????absent:删除文件、目录、链接文件
⑥fetch? ??从远程某主机获取文件到本地
dest:本机用来存放拉过来的文件或目录的目录 src:远程文件。(只能为文件)
⑦cron? ? 管理计划任务?
常见action: ????cron?backup=<yes|no>:创建一个crontab备份 ????cron_file=file_name:如果使用,使用这个cron.d,而不是单个用户 常见时间选项: ????day=?#日应该运行的工作(?1-31,?*,?*/2,?)? ????hour=?#?小时?(?0-23,?*,?*/2,?)? ????minute=?#分钟(?0-59,?*,?*/2,?)? ????month=?#?月(?1-12,?*,?/2,?)? ????weekday?#?周?(?0-6?for?Sunday-Saturday) 常用选项: ????jod=""????:指明执行的命令 ????name="":任务描述 ????reboot????任务在重启时运行。(不建议使用,建议使用special_time) ????special_time="":特殊的时间范围,参数有:reboot(重启时),annually(每年),monthly(每月),weekly?(每周),daily(每天),hourly(每小时) ????state="":指定状态,常见状态有present(添加定时任务)、absent(删除定时任务) ????user="":以哪个用户身份去运行 eg:每五分钟同步各主机时间 [[email protected]?~]#?ansible?all?-m?cron?-a?‘name="sync?date?per?second?5?min"?minute="*/5"?job="/usr/sbin/ntpdate?172.17.0.1?&>?/dev/null"‘ [[email protected]?~]#?ansible?all?-m?shell?-a?‘crontab?-l‘????#查看计划任务添加情况
⑧yum? ? 安装软件?
name=??????????????????#所安装的包的名称 state=?????????????????#present(安装),?latest(安装最新的),?absent(卸载软件)。 update_cache???????????#强制更新yum的缓存。 conf_file??????????????#设定远程yum安装时所依赖的配置文件。如配置文件没有在默认的位置。 disable_gpg_check??????#是否禁止GPG?checking,只用于`present‘?or?`latest’。 disablerepo????????????#临时禁止使用yum库。?只用于安装或更新时 enablerepo?????????????#临时使用的yum库。只用于安装或更新时。
⑨service? ? 服务管理?
arguments?????#命令行提供额外的参数? enabled=<true|false>?????#设置开机启动。? name=???????#服务名称? runlevel????#开机启动的级别,一般不用指定。? sleep???????#在重启服务的过程中,是否等待。如在服务关闭以后等待2秒再启动。? state???????#started启动服务,?stopped停止服务,?restarted重启服务,?reloaded重载配置
⑩user?? ?用户和账号管理
comment????#?用户的描述信息? createhome?#?是否创建家目录? force??????#?在使用state=absent时,?行为与userdel?–force一致.? group??????#?指定基本组?groups?#?指定附加组,如果指定为(groups=)表示删除所有组? home???????#?指定用户家目录?move_home?#?如果设置为home=时,?试图将用户主目录移动到指定的目录? name???????#?指定用户名? non_unique?#?该选项允许改变非唯一的用户ID值? password???#?指定用户密码? remove?????#?在使用state=absent时,?行为是与userdel?–remove一致? shell??????#?指定默认shell? state??????#?设置帐号状态,不指定为创建,指定值为absent表示删除? system?????#?当创建一个用户,设置这个用户是系统用户。这个设置不能更改现有用户? uid????????#?指定用户的uid update_password???#?更新用户密码
?group 组管理,添加或删除组
gid???????#设置组的GID号? name=?????#组名? state?????#指定组状态,默认为创建(present),设置值为absent为删除? system????#设置值为yes,表示为创建系统组
?script 运行服务器端脚本
ansible?all?-m?script?-a?‘/root/test.sh‘
?setup 查看机器所有facts信息
※facts是什么?
facts是一个内建变量。每个主机的各种信息,cpu颗数、内存大小等。会存在facts中的某个变量中。调用后返回很多对应主机的信息,在后面的操作中可以根据不同的信息来做不同的操作。如redhat系列用yum安装,而debian系列用apt来安装软件。
※setup模块主要功能
setup模块,主要用于获取主机信息,在playbooks里经常会用到的一个参数gather_facts就与该模块相关。 setup模块下经常使用的一个参数是filter参数,具体使用示例如下(由于输出结果较多,这里只列命令不写结果):
setup常用命令格式: #ansible?web?-m?setup?????//查看主机所有变量 #ansible?10.212.52.252?-m?setup?-a?‘filter=ansible_*_mb‘??????//查看主机内存信息? #ansible?10.212.52.252?-m?setup?-a?‘filter=ansible_eth[0-2]‘??//查看地接口为eth0-2的网卡信息 #ansible?all?-m?setup?--tree?/tmp/facts?????????//将所有主机的信息输入到/tmp/facts目录下,每台主机的信息输入到主机名文件中,如下为命令执 行结果: ????[[email protected]?~]#?ls?/tmp/facts/ ????172.17.214.74??172.17.214.75
四:Ansible playbook
1、playbook简介
(1)playbook是ansible用于配置,部署,和管理被控节点的剧本
(2)通过playbook的详细描述,执行其中一系列tasks来操控节点
(3)演员:计算机
? ? ? ? ?剧本:playbook?
2、playbook使用场景
(1)ad-doc适合执行单条命令,当命令较多时,需要playbook
(2)playbook有自己的语法格式
(3)可以将常用的命令集合编写为playbook
3、playbook编写详解
(1)语法格式
①开头:文件的第一行应该以?”—”?(三个连字符)开始,表明YMAL文件的开始。 ②注释:在同一行中,#之后的内容表示注释,类似于shell,python和ruby。 ③列表元素:YMAL中的列表元素以”-”开头然后紧跟着一个空格,后面为元素内容。 eg:-?apple?-?banana?-?orange??等价于python列表????["apple","banana","orange"] ④常用对象指定:play中hosts,variables,roles,tasks等对象的表示方法都是键值中间以":"分隔表示,":"后面还要增加一个空格。
(2)playbook组件详解
①Hosts:运行指定任务的目标主机 ????(a)主机清单默认为/etc/ansible/hosts,也可自己指定文件,通过-i?file_name指定 ????????(b)?ansible?--list-hosts?显示哪些主机参与到task的执行中 ②remote_user:远程主机上执行任务的用户 ③sudo_user:切换远程主机上执行任务的用户 ④tasks:????任务列表,配合各模块使用才有功能。 ????module_name:?modile?arguments 注意:shell和command模块后可直接跟命令,而非key=value参数列表 ⑤handlers?任务,在特定条件下被触发,接收到其他任务的通知时被触发 格式: ??????tasks: ????????-?name:?restart?httpd?service ??????????service:?name=httpd?states=stopped ??????????notify:?httpd_manager ??????????handlers: ????????-?name:?httpd_manager ??????????service:?name=httpd?states=started ⑥变量?Variables 方法1)facts:可直接调用 注意:可使用setup模块直接获取目标主机的facters; 方法2)用户自定义变量 ????(a)命令行定义:ansible-playbook???*.yml??-e??var1=value1 ????????eg:①定义变量名 ????????????????????tasks: ????????-?name:?stop?httpd?service ??????????service:?name={{?service_name?}}?states=stopped??##定义变量service_name ????????????????②命令行引用变量 ????????????????????ansible-playbook?web.yml?-e?service_name=httpd???????##关闭httpd服务 ????(b).yml文件中定义: ????????vars: ????????-?var1:?value1 ????????-?var2:?value2 注意:vars位置为hosts之下,tasks之外,与tasks等级相同 方法3)通过roles传递变量 方法4)Host?Inventory?????????主机清单文件自中定义 ????(a)?向不同主机传递不同的变量: ????????????ip/hostname?var1=value1?var2=value2 ????(b)向组中的主机传递相同变量 ????????????[group_name:vars]????//原样输入即可 ????????????var1=value1??????????//指定变量及变量值 ⑦tags:为单个执行命令打标签 1)修改yml文件 tasks: ????????-?name:?restart?httpd?service ??????????service:?name=httpd?states=stopped ??????????tags:?restart-httpd 2)命令行引用tags,运行单独task absible-playbook??web.yml??-t??restart-httpd?????”-t“?引用tag,运行指定命令
4、playbook运行方法
(1)试运行 ansible-playbook?--check/-C??????#测试运行yml文件,不执行真正操作,用来查看是否有错误 ansible-playbook?--list-hosts????#列出执行task所用主机 ansible-playbook? (2)直接运行 ansible-playbook??*.yml
5、playbook字典
语法示例: -?name:?add?some?users ???user:?name={{?item.name?}}?group={{?item.group?}}?state=present ???with_items: ???-?{?name:‘user11‘,group:‘group11‘?} ???-?{?name:‘user22‘,group:‘group22‘?}
6、playbook条件测试
(1)条件测试:when 用法:在task中使用,jinja2的语法格式 eg: ????????tasks:? ????????????-?name:?install?conf?file?to?centos7? ??????????????template:?src=files/nginx.conf.c7.j2? ??????????????when:?ansible_distribution_major_version?==?"7"? ????????????-?name:?install?conf?file?to?centos6? ???????????????template:?src=files/nginx.conf.c6.j2? ???????????????when:?ansible_distribution_major_version?==?"6" ???????????????(2)循环:迭代,需要重复执行的任务 用法:①对迭代项的引用,固定变量名为????"item" ???????????②而后,要在task中使用with_items给定要迭代的元素列表 eg: ????-?hosts:?web ????remote_user:?root ????tasks:??? ??????-?name:?uninstall?web?packages ????????yum:?name={{?item?}}?state=absent??????? ????????with_item:?????? ????????-?httpd ????????-?php ????????-?php-mysql ????????-?php-fpm
7、roles 角色定制
(1)功能 roles?用于层次性、结构化地组织playbook。roles?能够根据层次型结构自动装载变量文件、tasks以及handlers等。roles就是通过分别将变量(vars)、文 件(file)、任务(tasks)、模块?(modules)及处理器(handlers)放置于单独的目录中,并可以便捷?地include它们的一种机制。角色一般用于基于主机构建 服务的场?景中,但也可以是用于构建守护进程等场景中。要使用?roles只需要在playbook中使用include指令即可。 (2)角色集合 ①mysql/ ②httpd/ ③nginx/ ④files/:??存储由copy或script等模块调用的文件; ⑤tasks/:此目录中至少应该有一个名为main.yml的文件,用于定义各task;其它的文件需要由main.yml?进行“包含”调用; ⑥handlers/:此目录中至少应该有一个名为main.yml的文件,用于定义各handler;其它的文件需要由?main.yml进行“包含”调用; ⑦vars/:此目录中至少应该有一个名为main.yml的文件,用于定义各variable;其它的文件需要由?main.yml进行“包含”调用; ⑧templates/:存储由template模块调用的模板文本; ⑨meta/:此目录中至少应该有一个名为main.yml的文件,定义当前角色的特殊设定及其依赖关系;其它的?文件需要由main.yml进行“包含”调用; ⑩default/:此目录中至少应该有一个名为main.yml的文件,用于设定默认变量; (3)角色定制操作步骤 ①在role目录下生成对应的目录结构 mkdir?-pv?./{nginx,mysql,httpd}/{files,templates,vars,tasks,handlers,meta,default} ②定义/tasks/main.yml的配置文件? -?name:?cp? ???copy:?src=nginx-1.10.2-1.el7.ngx.x86_64.rpm?dest=/tmp/nginx-1.10.2-?1.el7.ngx.x86_64.rpm? -?name:?install? ???yum:?name=/tmp/nginx-1.10.2-1.el7.ngx.x86_64.rpm?state=latest? -?name:?conf?template:?src=nginx.conf.j2?dest=/etc/nginx/nginx.conf? ??tags:?nginxconf? ??notify:?new?conf?to?reload? ??name:?start?service? ??service:?name=nginx?state=started?enabled=true ③修改变量文件 ??vars/main.yml?????添加变量nginx_port:?“8888” ④定义handlers文件 ????handlers/main.yml? ????-?name:?new?conf?to?reload? ???????service:?name=nginx?state=restarted ⑤定义/etc/ansible/nginx.yml的playbook文件 ????-?hosts:?nginx? ??????remote_user:?root? ??????roles:? ????????-?nginx ⑥可以通过roles传递变量 -?hosts:?nginx? ??remote_user:?root? ??roles:? ????-?{?role:?nginx,?nginxport:?12345?} ⑦也可以配置多个角色 roles:? ?#?-?{?role:?nginx,?nginxport:?12345?}? ?????-?{?role:?memcached