运维自动化好帮手:ansible软件入门篇

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了运维自动化好帮手:ansible软件入门篇相关的知识,希望对你有一定的参考价值。


一:关于自动化我们要知道的

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


以上是关于运维自动化好帮手:ansible软件入门篇的主要内容,如果未能解决你的问题,请参考以下文章

自动化运维之ansible-安装部署与基础命令篇

马哥金牌分享 | 十五分钟实现Ansible常用模块入门

Ansible之入门简介

基础Ansible 自动化运维工具简单入门

ansible快速入门

Ansible自动化运维之Ansible入门及简单部署