ansible自动化运维工具
简介
ansible 是一个自动化运维工具,基于Python开发,集合了许多运维工具的特点,实现了批量系统配置,批量程序部署,批量运行命令等批量管理操作。
ansible是通过模块进行批量管理的,本身没有批量部署的能力,ansible只是提供 一种架构。
ansible本身不是一个应用程序,只是一个工具,不需要启动什么服务,配置文件修改之后也不需要进行重启进程之类的操作。
ansible特性
- 模块化:调用模块完成任务
- 支持自定义模块
- 可使用任何编程语言写模块
- 基于Python语言开发
- 部署简单,基于Python和SSH(默认已安装)
- 安全,基于OpenSSH
- 支持playbook编排任务
- 幂等性:一个任务执行一遍和执行多遍的效果一样,不会因为执行多遍带来的意外情况
- YAML格式编排任务,支持丰富的数据结构
- 较强大的多层解决方案
ansible架构
- 连接插件connection plugins:负责和被监控端实现通信
- host inventory:指定操作的主机,是一个配置文件里面定义监控的主机
- 各种模块核心模块、command模块、自定义模块
- 借助于插件完成记录日志邮件等功能
- playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务
ansible工作原理
- 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脚本
- 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模块发广播
命令的执行过程
- 加载自己的配置文件/etc/ansible/ansible.cfg
- 加载自己对应的文件模块
- 通过ansible将模块或命令生成对应的临时py文件,并将该文件传输至远程服务器的对应执行用户$HOME/.ansible/tmp/ansible-tmp-数字/XXX.PY文件
- 给文件+x执行
- 执行并返回结果
- 删除临时py文件
- 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中定义变量的方式有五种
- 在/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文件中可以定义全局变量 ***普通变量的优先级高于全局变量
-
在要执行的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中的脚本中不在定义vars:
- 后面调用的变量不变
- 在命令行输入命令时定义变量
- ansible-playbook all -e ‘name1=httpd name2=vsftpd’ *.yml
- 引用变量文件
-
(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
- 系统自带的变量
-
在命令行输入:ansible all -m setup
-
其中现实的变量都可使用
常用的有: ansible_nodename:查询主机名 ansible_memtotal_mb:查询主机内存大小 ansible_distribution_major_version:查询系统版本 ansible_processor_vcpus:查询主机cpu个数