编辑推荐: |
本文来源51cto,本文主要介绍自动化工具Ansible,以及对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基本架构图 && 核心组件说明
1.Ansible:Ansible核心程序。
2.HostInventory:记录由Ansible管理的主机信息,包括端口、密码
、ip等。
3.Playbooks:“剧本”YAML格式文件,多个任务定义在一个文件
中,定义主机需要调用哪些模块来完成的功能。
4.CoreModules:核心模块,主要操作是通过调用核心模块来完成管
理任务。
5.CustomModules:自定义模块,完成核心模块无法完成的功能,
支持多种语言。
6.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常用命令及用法
常用命令
1./usr/bin/ansible # Ansibe AD-Hoc
临时命令执行工具,常用于临时命 令的执行
2./usr/bin/ansible-doc # Ansible
模块功能查看工具
3./usr/bin/ansible-galaxy # 下载/上传优秀代码或Roles模块
的官网平台 ,基于网络的
4./usr/bin/ansible-playbook # Ansible
定制自动化的任务集编排工具
5./usr/bin/ansible-pull # Ansible远程执行命令的工具,拉取配置而非推
送配置(使用较少,海量机时使用,对运维的架构能力要求较高)
6./usr/bin/ansible-vault # Ansible
文件加密工具
7./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 测试主机网络连通性
[root@server
~]# ansible all -m ping
172.17.214.75 | SUCCESS => {
"changed": false,
"ping": "pong"
}
172.17.214.74 | SUCCESS => {
"changed": false,
"ping": "pong"
}
|
②command执行命令
[root@server
~]# ansible webserver -m command -a 'ifconfig'
在webserver主机组上执行命令ifconfig |
注意:命令模式下,'' 的用法 :'命令名称+用空格分隔的列表参数', 给定的命令将在所有指定节点上执行,但不支持shell命令模式,如下列几种:
$arg、"<"、">"、"|"、";"、"&"等shell命令,有其特定的命令:
1. chdir=dir_name:切换目录
2.executable:切换shell来执行命令(注意:命令要使用绝对路径表示)
3. free_form:要执行的linux命令,一般用-a选项代替
4.creates=file_name:文件存在,则命令不执行,只可用来做判断
5.removes=file_name:文件存在,则命令执行,也用来做判断
使用示例如下:
①[root@server
~]# 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命令不执行
②[root@server ~]# 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命令 |
3.shell 远程主机执行shell命令(支持管道、重定向等特殊符号)
[root@server
~]# 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 |
4.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模块里的选项都可以在这里面使用。 |
5.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:删除文件、目录、链接文件 |
6.fetch 从远程某主机获取文件到本地
dest:本机用来存放拉过来的文件或目录的目录
src:远程文件。(只能为文件) |
7.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:每五分钟同步各主机时间
[root@server ~]# ansible all -m cron -a 'name="sync
date per second 5 min" minute="*/5"
job="/usr/sbin/ntpdate 172.17.0.1 &>
/dev/null"'
[root@server ~]# ansible all -m shell -a 'crontab
-l' #查看计划任务添加情况 |
8.yum 安装软件
name=
#所安装的包的名称
state= #present(安装), latest(安装最新的), absent(卸载软件)。
update_cache #强制更新yum的缓存。
conf_file #设定远程yum安装时所依赖的配置文件。如配置文件没有在默认的位置。
disable_gpg_check #是否禁止GPG checking,只用于`present‘
or `latest’。
disablerepo #临时禁止使用yum库。 只用于安装或更新时
enablerepo #临时使用的yum库。只用于安装或更新时。 |
9.service 服务管理
arguments
#命令行提供额外的参数
enabled=<true|false> #设置开机启动。
name= #服务名称
runlevel #开机启动的级别,一般不用指定。
sleep #在重启服务的过程中,是否等待。如在服务关闭以后等待2秒再启动。
state #started启动服务, stopped停止服务, restarted重启服务,
reloaded重载配置 |
10.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 # 更新用户密码 |
11.group 组管理,添加或删除组
gid
#设置组的GID号
name= #组名
state #指定组状态,默认为创建(present),设置值为absent为删除
system #设置值为yes,表示为创建系统组
|
12.script 运行服务器端脚本
ansible
all -m script -a '/root/test.sh' |
13.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目录下,每台主机的信息输入到主机名文件中,如下为命令执
行结果:
[root@server ~]# 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 |
|