Ansible自动化运维
ansible-自动化运维工具
ansible简介
ansible是新出现的自动化运维工具,基于python开发,集合了众多运维工具(puppet、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
ansible是基于模块工作的,本身没有批量部署能力,真正具有批量部署的是ansible所运行的模块。
ansible的特性
部署简单,只需在主控端部署ansible环境,被控端无需做任何操作;
默认使用ssh协议对设备进行管理;
有大量常规运维操作模块,可实现日常绝大部分操作;
配置简单、功能强大、扩展性强;
有paramiko,pyyaml,jinja2三个关键模块;
支持api及自定义模块,可通过python轻松扩展;
通过playbooks来定制强大的配置、状态管理;
可使用任何编程语言写模块;
轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可;
提供一个功能强大、操作性强的web管理界面和rest api接口--awx平台
ansible架构图
ansible:ansible核心程序
host inventory:记录由ansible管理的主机信息,包括端口、密码、ip等
play books:“剧本”yaml格式文件,多个任务定义在一个文件中,定义主机需要调用哪些模块来完成的功能
core modules:核心模块,主要操作是通过调用核心模块来完成管理任务
custom modules:自定义模块,完成核心模块无法完成的功能,支持多种语言
plugins:插件,实现记录日志,发送邮件等功能
connection plugins:连接插件,ansible和host通信使用,默认ssh连接
ansible工作原理
ansible任务执行模式
ansible系统由控制主机对被控节点的操作可分为两类,即adhoc和playbook
ad-hoc模式(点对点模式)
使用单个模块,支持批量执行单条命令。ad-hoc命令是一种可以快速输入的命令,而且不需要保存起来的命令
playbook模式(剧本模式)
是ansible主要管理方式,也是ansible功能强大的关键所在。playbook通过多个task集合完成一类功能,如web服务的安装部署、数据库服务器的批量备份等
ansible执行流程
ansible命令执行过程
1、加载自己的配置文件,默认 /etc/ansible/ansible.cfg
2、查找对应的主机配置文件,找到要执行的主机或者组
3、加载自己对应的模块文件
4、通过ansible将模块或命令生成对应的临时python文件,并将该文件传输至远程服务器
5、对应执行用户的家目录的文件
6、给文件+x执行权限
7、执行并返回结果
8、删除临时python文件,sleep 0 退出
ansible常用命令
ansible命令集
/usr/bin/ansible 临时命令执行工具
/usr/bin/ansible-doc 模块功能查看工具
/usr/bin/ansible-galaxy 下载/上传优秀代码或roles模块的官网平台
/usr/bin/ansible-playbook 定制自动化的任务集编排工具
/usr/bin/ansible-pull 远程执行命令的工具
/usr/bin/ansible-vault 文件加密工具
/usr/bin/ansible-console 可与用户交互的命令执行工具
ansible命令使用
命令格式
# ansible <host-pattern> [-f forks] [-m module_name] [-a args]
-a 模块的参数
-k 登陆密码
-c 连接类型使用
-m 执行模块的名字
-o 压缩输出
-r 指定用户
ansible配置
准备至少两台机器,一台主控机器,其余的为被控机器
ansible安装
在主控机器上安装ansible
# yum install -y ansible
生成密钥对
# ssh-keygen
设置密钥认证
# ssh-copy-id root@ip
配置主机清单
# vi /etc/ansible/hosts
[web] ##主机组名
192.168.37.16
192.168.37.17
ansible常用模块
主机连通性测试
# ansible web -m ping
确认主机是连通状态
command模块
该模块可以直接在远程主机上执行命令,并将结果返回本主机
模块常用选项
chdir 在执行命令之前,先切换到该目录
executable 切换shell来执行命令,需要使用命令的绝对路径
free_form 要执行的linux指令
creates 一个文件名,当这个文件存在,则该命令不执行
removes 一个文件名,当这个文件不存在,则该命令不执行
copy模块
该模块用于将文件复制到远程主机,同时支持给定内容生成文件和修改权限等
常用选项
src 被复制到远程主机的本地文件
content 用于替换“src”,可以直接指定文件的值
dest 将源文件复制到的远程主机的绝对路径
backup 当文件内容发生改变后,再覆盖之前把源文件备份
directory_mode 递归设定目录的权限
file模块
该模块主要用于设置文件的属性,如创建文件、创建链接文件、删除文件等
常用选项
group 定义文件目录的属组,后面可以加上mode:定义文件目录的权限
owner 定义文件目录的属主,后面必须加上path:定义文件目录的路径
recurse 递归设置文件的属性,只对目录有效
dest 被链接到的路径
state 状态,有以下选项
directory 如果目录不存在,就创建目录
file 即使文件不存在,也不会被创建
link 创建软链接
hard 创建硬链接
touch 如果文件不存在,则创建一个新文件,如果文件存在,则更新最后修改时间
absent 删除目录、文件或者取消链接文件
fetch模块
该模块用于从远程某主机获取文件到本地
选项
dest 用来存放文件的目录
src 在远程拉取的文件
yum模块
该模块主要用于软件的安装
常用选项
name= 所安装的包的名字
update_cache 强制更新yum的缓存
conf_file 指定远程yum安装时所依赖的配置文件
state= 状态,有以下选项
present 安装
latest 安装最新的
absent 卸载软件
service模块
该模块用于服务程序的管理
常用选项
arguments 命令行提供额外的参数
enabled 设置开机启动
name= 服务名称
runlevel 开机启动的级别
sleep 在重启服务的过程中,是否等待
state 状态,有以下选项
started 启动服务
stopped 停止服务
restarted 重启服务
reloaded 重载配置
user模块
该模块主要用来管理用户账号
常用选项
comment 用户的描述信息
createhome 是否创建家目录
force 在使用state=absent时,行为与userdel-force一致
group 指定基本组
groups 指定附加组
home 指定用户家目录
name 指定用户名
non_unique 允许改变非唯一的用户id值
password 指定用户密码
state 设置账号状态
system 当创建一个用户,设置这个用户时系统用户
uid 指定用户的uid
group模块
该模块主要用于添加或删除组
常用选项
gid= 设置组的gid号
name= 指定组的名称
state= 指定组的状态
system= 设置值为yes,表示创建为系统组
ansible playbook
简介
playbook是ansible用于配置、部署和管理被控节点的剧本。通过playbook的详细描述,执行其中的一系列tasks,可以让远端主机达到预期的状态
使用场景
使用playbook可以方便的重用这些代码,可以移植到不同的机器上面,最大化的利用代码
格式
playbook由ymal语言编写
1、文件的第一行应该以“---”(三个连字符)开始,表明yaml文件的开始
2、在同一行中,#之后的内容表示注释
3、yaml中的列表元素以“-”开头然后紧跟着一个空格,后面为元素内容
4、同一个列表中的元素应该保持相同的缩进,否则会被当做错误处理
5、playbook中hosts,variables,roles,tasks等对象的表示方法都是键值中间以“:”分隔表示,“:”后面还要增加一个空格
文件名称应该以 .yml 结尾,由三个部分组成
host部分:使用hosts指示使用哪个主机或主机组来运行下面的tasks,每个playbook都必须指定hosts,hosts也可以使用通配符格式
remote_user:指定远端主机中的哪个用户来登录远端系统,在远端系统执行tasks的用户,可以任意指定,也可以使用sudo,但是用户必须要有执行相应task的权限
tasks:指定远端主机将要执行的一系列动作。tasks的核心为ansible的模块,tasks包含name和要执行的模块
核心元素
playbook的核心元素
hosts:主机组
tasks:任务列表
variables:变量,设置方法有四种
templates:包含了模板语法的文本文件
handlers:由特定条件触发的任务
playbook实战-nginx安装
先在主控机器上安装并编译好nginx
进入ansible配置文件目录
# cd /etc/ansible
创建目录
# mkdir nginx.install
# cd nginx.install
# mkdir -p roles/{common.install}/{handlers,files,meta,tasks,templates,vars}
## roles目录下由两个角色,common为一些准备操作,install为安装nginx的操作。每个角色下又有几个目录,handlers下面是当发生改变时要执行的操作,通常用在配置文件发生改变,重启服务。files为安装时用到的一些文件,meta为说明信息,说明角色依赖等信息,tasks里面是核心的配置文件,templates通常存一些配置文件,启动脚本等模板文件,vars下为定义的变量
将nginx目录打包,放到/etc/ansible/nginx_install/roles/install/files/下面并重命名
# mv /etc/local/sbin/nginx /etc/ansible/nginx_install/roles/install/files/nginx.tar.gz
启动脚本和配置文件也移动到/etc/ansible/nginx_install/roles/install/templates/下面
定义依赖包
# cd /ect/ansible/nginx.install/roles
# vi common/tasks/main.yml
- name: install initializtion require software
yum: name={{ item }} state=installed
with_items:
- zlib-devel
- pcre-devel
定义变量
# vi install/vars/main.yml
nginx_user: www
nginx_port: 80
nginx_basedir: /usr/local/nginx
拷贝文件
# vi install/tasks/copy.yml
- name: copy nginx software
copy: src=nginx dest=/tmp/nginx.tar.gz owner=root group=root
- name: uncompression nginx software
shell: tar zxf /tmp/nginx.tar.gz -c /usr/local/
- name: copy nginx start script
template: src=nginx dest=/etc/init.d/nginx owner=root group=root mode=0755
- name: copy nginx config
template: src=nginx.conf dest={{ nginx_basedir }}/conf/ owner=root group=root mode=0644
建立用户,启动服务,删除压缩包
# vi install/tasks/install.yml
- name: create nginx user
user: name={{ nginx_user }} state=present createhome=no shell=/sbin/nologin
- name: create nginx service
shell: /etc/init.d/nginx start
- name: add boot start nginx service
shell: chkconfig --level 345 nginx on
- name: delete nginx compression files
shell: rm -rf /tmp/nginx.tar.gz
调用文件
# vi install/tasks/main.yml
- include: copy.yml
- include: install.yml
定义入口文件
# vi /etc/ansible/nginx_install/install.yml
---
- hosts: testhost
remote_user: root
gather_facts: ture
roles:
- common
- install
执行
# ansible-playbook /etc/ansible/nginx_install/install.yml