ansible自动化运维工具

ansible自动化运维工具

  • 简介
  • ansible特性
  • ansible架构
  • ansible工作原理
  • ansible安装
  • ansible配置文件
  • ansible命令
  • 命令的执行过程
  • ansible的执行状态
  • ansible常用模块功能
    • command模块
    • shell模块
    • script模块
    • copy模块
    • fetch模块
    • file模块
    • cron模块
    • service模块
    • user模块
    • group模块
    • hostname模块
    • setup模块
    • yum模块
  • playbook中的handlers与notify
  • playbook中tags的用法
  • 定义变量

简介

ansible 是一个自动化运维工具,基于Python开发,集合了许多运维工具的特点,实现了批量系统配置,批量程序部署,批量运行命令等批量管理操作。
ansible是通过模块进行批量管理的,本身没有批量部署的能力,ansible只是提供 一种架构。
ansible本身不是一个应用程序,只是一个工具,不需要启动什么服务,配置文件修改之后也不需要进行重启进程之类的操作。

ansible特性

  • 模块化:调用模块完成任务
  • 支持自定义模块
  • 可使用任何编程语言写模块
  • 基于Python语言开发
  • 部署简单,基于Python和SSH(默认已安装)
  • 安全,基于OpenSSH
  • 支持playbook编排任务
  • 幂等性:一个任务执行一遍和执行多遍的效果一样,不会因为执行多遍带来的意外情况
  • YAML格式编排任务,支持丰富的数据结构
  • 较强大的多层解决方案

ansible架构

ansible自动化运维工具_第1张图片

  • 连接插件connection plugins:负责和被监控端实现通信
  • host inventory:指定操作的主机,是一个配置文件里面定义监控的主机
  • 各种模块核心模块、command模块、自定义模块
  • 借助于插件完成记录日志邮件等功能
  • playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务

ansible工作原理

ansible自动化运维工具_第2张图片

  • ANSIBLE PLAYBOOKS:任务剧本(任务集),编排定义Ansible任务集的配置文件, 由Ansible顺序依次执行,通常是JSON格式的YML文件
  • INVENTORY:Ansible管理主机的清单 /etc/anaible/hosts
  • MODULES: Ansible执行命令的功能模块,多数为内置核心模块,也可自定义
  • PLUGINS: 模块功能的补充,如连接类型插件、循环插件、变量插件、过滤插件等,该功能不常用
  • API: 供第三方程序调用的应用程序编程接口
  • ANSIBLE: 组合INVENTORY、API、MODULES、PLUGINS的绿框,可以理解为是ansible命令工具,其为核心执行工具

ansible安装

yum安装

先安装EPEL源
yum install epel-release -y
安装成功后在安装ansible
yum install ansible -y

ansible配置文件

配置文件

  • /etc/ansible/ansible.cfg 主配置文件,配置ansible工作特性(一般无需修改)
  • /etc/ansible/hosts 主机清单(将被管理的主机放到此文件)
  • /etc/ansible/roles/ 存放角色的目录

/etc/ansible/hosts
改文件是配置主机的文件
可以配置单个主机,也可以配置主机集群

格式:

配置单个主机
192.168.136.130
配置主机集群
[webservers]			集群名
192.168.136.130			主机1
192.168.136.136			主机2

/etc/absible/ansible.cfg
ansible的主配置文件

# some basic default values...

[defaults]
#inventory      = /etc/ansible/hosts		主机列表配置文件
#library        = /usr/share/my_modules/	库文件存放目录
#remote_tmp     = ~/.ansible/tmp			临时py命令文件存放在远程主机目录
#local_tmp      = ~/.ansible/tmp			本机临时命令执行目录
#forks          = 5							默认并发数,同时可以执行五次
#sudo_user      = root						默认sudo用户
#ask_sudo_pass = True						每次执行是否询问ssh密码
#ask_pass      = True						每次执行是否询问ssh口令
#remote_port    = 22				远程主机的端口号(默认22)

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 基于Console界面与用户交互的执行工具

ansible

  • 语法:ansible servers 选项 -a ‘操作’

常用选项

选项 说明
--version 显示版本
-m 指定模块
-v 详细过程,-v、-vv、-vvv更详细
--list-hosts 显示主机列表,可简写--list
-C 检查并不执行
-T 执行命令的时间,默认10s
-u 执行远程命令的用户,该用户是远程主机上的用户
-b 代替旧版本的sudo切换,使用root权限
-K 提示输入sudo时的口令
-a 加参数、操作

ansible-doc
查看模块使用方法的命令

  • 查看可以使用的模块:ansible-doc -l
  • 查看单个模块的用法:ansible-doc -s 模块名

ansible-galaxy
下载模块的命令

  • 安装模块:ansible-galaxy install 模块名
  • 卸载模块:ansible-galaxy remove 模块名

ansible-pull

  • 推送命令至远程,效率无限提升,对运维要求较高

ansible-vault
管理加密解密yml文件的命令

  • 语法:ansible-vault 选项 yml文件

常用选项:

选项 说明
encrypt 加密
decrypt 解密
view 查看加密后的文件,不能用cat查看,cat查看的为加密后的密文文件
edit 编辑加密文件,加密后的文件不能用vi编辑
rekey 修改新口令
create 创建新文件

ansible-console

  • 2.0新增功能,可交互式的执行命令,与bash类似,其中的群组相当于目录,直接输入ansible-console命令进入交互式界面,exit退出

ansible-playbook
可以执行yml脚本
ansible自动化运维工具_第3张图片

  • playbook 剧本是由一个或多个“play”组成的列表
  • play的主要功能在于将预定义的一组主机,装扮成事先通过ansible中的task定义好的角色。Task实际是调用ansible的一个module,将多个play组织在一个playbook中,即可以让它们联合起来,按事先编排的机制执行预定义的动作
  • Playbook 文件是采用YAML语言编写的

简单的yml文件:

#hello world yml file		文件介绍,这是一个yml文件
---							yml文件开头格式
- hosts: all				指定主机群组
  remote_user: root			指定远程执行用户的身份
  tasks:					执行的任务
    - name: hello world		任务名
      command: /usr/bin/wall hello world!!!	调用command模块发广播

命令的执行过程

  1. 加载自己的配置文件/etc/ansible/ansible.cfg
  2. 加载自己对应的文件模块
  3. 通过ansible将模块或命令生成对应的临时py文件,并将该文件传输至远程服务器的对应执行用户$HOME/.ansible/tmp/ansible-tmp-数字/XXX.PY文件
  4. 给文件+x执行
  5. 执行并返回结果
  6. 删除临时py文件
  7. sleep 0退出

ansible的执行状态

  • 绿色:执行成功并没发生改变
  • 黄色:执行成功发生了改变
  • 红色:执行失败

ansible常用模块功能

  • 查看可用的模块:ansible-doc -l
  • 查看模块的用法:ansible-doc -s 模块名

command模块

  • 在远程主机执行命令,结果返回至ansible主机
    不能使用shell的"|"和>

shell模块

  • 与command类似,比command功能更强大

script模块

执行远程主机上的脚本文件的模块

常见参数

参数 说明
chdir 在执行后面的命令前先切换到指定的目录底下
creates 指定一个远程主机的参数,如果存在就不执行,不存在就执行,仅仅是执行后面的操作,对远程主机和本机上的文件不进行修改
removes 指定一个远程主机的参数,如果不存在就不执行,存在就执行,仅仅是执行后面的操作,对远程主机和本机上的文件不进行修改

copy模块

将本地文件copy至远程主机的模块

常见参数

参数 说明
src 源地址,本机文件路径
dest 目标地址,远程主机的路径
content 当不使用src指定拷贝的文件时,可以使用content直接指定文件内容,src和content必须有一个
force 当远程主机的目标路径中已经存在同名文件,并且与ansible中的文件内容不同,是否强制覆盖,可选直有yes和no,默认为yes直接覆盖,no不进行操作
backup 已有同名文件判断文件内容一样不,一样就不操作,不一样就备份,然后进行copy
owner 指定文件copy到远程主机后的属主,但是远程主机上必须有相应的用户
group 指定文件copy到远程主机后的属组,但是远程主机上必须有相应的属组
mode copy后文件的权限

fetch模块

从远程主机提取文件至ansible主机,与copy相反,不支持目录
ansible all -m fetch -a ‘src=/root/test dest=/data/test’

参数:

	src:源地址
	dest:目标地址
	flat:默认值为no,如果dest以/结尾则覆盖本地同名源文件

file模块

专门用来设置文件属性

参数:

force:在两种情况下创建软连接时使用
	源文件不存在但是之后会建立
	目标软连接已存在,需要取消之前的软连接,然后再创建,两个选项yes|no
group:属组
mode:权限
owner:属主
path:必须项,定义文件目录的路径
recurse:递归设置文件属性,只对目录有效
src:要被软连接的源文件的路径,只能用于state=link
dest:被连接到的路径,只能用于state=link
state:选择属性
	directory:如果目录不存在,创建目录
	file:即使文件不存在,也不会被创建
	link:创建软连接
	hard:创建硬链接
	touch:如果文件不存在,创建新文件,存在的话修改最后访问时间
	absent:删除目录文件,或者取消链接文件

cron模块

用于添加、删除、更新计划任务的模块
使用此模块时,-a后面接""里面的用’’

参数:

name:计划任务的名称,可有可无,不指定就为None
cron_file:使用文件替换远程主机上的cron.d目录下的用户的计划任务
minute:分
hour:时
day:日
month:月
weekday:周
job:要执行的计划任务
special_time:制定什么时候执行
	参数:reboot,yearly,annually,monthly,weekly,daily,hourly
state:确认该任务计划是创建还是删除 
user:以哪个用户的身份执行

service模块

实现远程服务的生命周期

参数:

enabled:开机自启动
name:服务名,必选
runlevel:运行级别
state:
	started			启动服务
	stopped			关闭服务
	restarted		重启服务
	reloaded		重新加载配置文件,不关闭服务

user模块

管理远程主机上的用户,比如创建用户、修改用户、删除用户、为用户创建密钥对等

参数:

name:必须参数,指定要操作的用户
group:指定用户属组
groups:指定用户附加组
home:设置用户家目录
remove:删除用户,并删除用户的家目录,yes|no
shell:用户登录shell
state:
	present:默认值为present
	absent:删除
password:指定用户密码,不能为明文密码,只能是加密后的密文,与/etc/shadow中密码字段类似
uid:用户id
system:系统用户

group模块

管理远程主机上的组

参数:

name:指定要操作的组名
state:指定组的状态
	present:默认值为
	absent:删除
gid:指定组的gid

hostname模块

修改远程主机的主机名

  • name参数:修改后的主机名

setup模块

用于收集远程主机的基本信息
可以查看系统变量

参数:

filter:用于进行条件过滤
		可以用通配符
filter用法:
ansible 集群名 -m setup -a 'filter="系统变量名"'

yum模块

与bash的yum类似

参数:

enablerepo:启用某个源
name:操作的软件报名,也可以传递一个url或者一个本地的rpm包的路径
state:定义软件包的状态
	present:安装
	absent:删除
	latest:安装最新的

playbook中的handlers与notify

  • 你可以把handlers理解成另一种tasks
  • handlers是另一种’任务列表’
  • handlers中的任务会被tasks中的任务进行”调用”,但是,被”调用”并不意味着一定会执行
  • 只有当tasks中的任务”真正执行”以后(真正的进行实际操作造成了实际的改变),handlers中被调用的任务才会执行
  • 如果tasks中的任务并没有做出任何实际的操作,那么handlers中的任务即使被’调用’,也并不会执行
  • 相当于函数的调用

playbook中tags的用法

在要执行的yml文件中加入tags

---
- hosts: all
  remote_user: root
  tasks:
	- name: install httpd
	  yum: name=httpd state=present
	  tags: install
	- name: start httpd		<---><--->
	  service: name=httpd state=started
	  tags: start			<---><--->
	- name: chkconfig
	  shell: chkconfig httpd on
	  tags: chkconfig		<---><--->

<---><--->所在的行为tags
然后再命令行指定要使用的tags
ansible-playbook -t install,start,chkconfig *.yml
-t指定要调用的tags,多个用逗号隔开

定义变量

在ansible中定义变量的方式有五种

  1. 在/etc/ansible/hosts中添加变量
  •   (1)定义集群
      	[webservers]
      	192.168.136.130
      (2)定义变量
      	[webservers]
      	192.168.136.130 http_port=81
      	在集群内给单个主机定义的变量为普通变量
      	[webservers:vars]		此处的webservers可以为all,表示全部集群
      	name1=httpd
      	在hosts文件中可以定义全局变量
      	***普通变量的优先级高于全局变量
    
  1. 在要执行的yml脚本中定义变量


     - hosts: all
       remote_user: root
       vars:
     	- name1: httpd
     	- name2: vsftpd
     ***	在此处定义的变量只能在这个文件中使用,优先级仅次于命令行的-e
     	格式必须按照上面的格式
       tasks:
     	- name: install httpd
     	  yum: name={{name1}} state=present
     	- name: start httpd
     	  service: name={{name1}} state=started
     	- name: install vsftpd
     	  yum: name={{name2}} state=present
     	- name: start httpd
     	  service: name={{name2}} state=started
     	- name: chkconfig
     	  shell: chkconfig httpd on
    
  2. 通过命令行定义变量

  • 例如上面2中的脚本中不在定义vars:
  • 后面调用的变量不变
  • 在命令行输入命令时定义变量
  • ansible-playbook all -e ‘name1=httpd name2=vsftpd’ *.yml
  1. 引用变量文件
  •   (1)在单独的文件中定义变量,此文件只用来定义变量
      	文件名为vars.yml
      	文件内容为
      	-	 name1: httpd
      	- 	name2: vsftpd
      (2)在要执行的文件中引用变量文件
      ---
      - hosts: all
        remote_user: root
        vars_files:
      	- vars.yml
      *** 此处引用变量文件,格式为指定格式
        tasks:
      	- name: install httpd
      	  yum: name={{name1}} state=present
      	- name: start httpd
      	  service: name={{name1}} state=started
      	- name: install vsftpd
      	  yum: name={{name2}} state=present
      	- name: start httpd
      	  service: name={{name2}} state=started
      	- name: chkconfig
      	  shell: chkconfig httpd on	
    
  1. 系统自带的变量
  • 在命令行输入:ansible all -m setup

  • 其中现实的变量都可使用

      常用的有:
      	ansible_nodename:查询主机名
      	ansible_memtotal_mb:查询主机内存大小
      	ansible_distribution_major_version:查询系统版本
      	ansible_processor_vcpus:查询主机cpu个数	
    

你可能感兴趣的:(devops,ssh,运维)