一、ansible 简介
ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。
ansible主要由以下几个模块构成,具体如下图
其中几个关键模块的作用介绍如下:
(1)、连接插件connection plugins:负责和被监控端实现通信;
(2)、host inventory:指定操作的主机,是一个配置文件里面定义监控的主机;
(3)、各种模块核心模块、command模块、自定义模块;
(4)、借助于插件完成记录日志邮件等功能;
(5)、playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务。
(2)、ansible的架构:连接其他主机默认使用ssh协议
二、 特性
1. 模块化:调用特定的模块,完成特定任务
2. Paramiko (python对ssh的实现),PyYAML,Jinja2模板等3个模块
3. 支持自定义模块
4.基于Python语言实现
5. 部署简单,基于python和SSH,agent less
6. 安全,基于OpenSHH,可以保证安全
7.支持playbook编排任务
8.幂等性:一个任务执行一次和执行多次效果一样,不因重复执行带来意外情况
9.无需代理且不依赖PKI
10. 支持多种语言编写模块
11.通过YAML格式编排任务,支持丰富的数据结构
12.较强大的多层解决方案
三、常用相关文件介绍
1.配置文件
/etc/ansible/ansible.cfg 主配置文件,配置ansible工作特性(一般无需修改),默认使用此配置文件:
1)配置文件详解:
[defaults]
#inventory = /etc/ansible/hosts # 主机列表配置文件
#library = /usr/share/my_modules/ # 库文件存放目录
#remote_tmp = $HOME/.ansible/tmp # 临时py命令文件存放在远程主机目录
#local_tmp = $HOME/.ansible/tmp # 本机的临时命令执行目录
#forks = 5 # 默认并发数,同时可以执行5次
#sudo_user = root # 默认sudo 用户
#ask_sudo_pass = True # 每次执行ansible命令是否询问ssh密码
#ask_pass = True # 每次执行ansible命令是否询问ssh口令
#remote_port = ** # 远程主机的端口号(默认**)
建议优化项:
host_key_checking = False # 检查对应服务器的host_key,建议取消注释
log_path=/var/log/ansible.log # 日志文件,建议取消注释
module_name = command # 默认模块
/etc/ansible/hosts 主机清单(将被管理的主机放到此文件)
/etc/ansible/roles/ 存放角色的目录
2. 程序目录
/usr/bin/ansible 主程序,临时命令执行工具
/usr/bin/ansible-doc 查看配置文档,模块功能查看工具
/usr/bin/ansible-playbook 定制自动化任务,编排剧本工具
/usr/bin/ansible-pull 远程执行命令的工具
/usr/bin/ansible-vault 文件加密工具
/usr/bin/ansible-console 基于Console界面与用户交互的执行工具
3. 主机清单详细介绍
Inventory 主机清单
1). ansible的主要功用在于批量主机操作,为了便捷地使用其中的部分主机,可以在inventory file中将其分组命名
2). 默认的inventory file为/etc/ansible/hosts
3). inventory file可以有多个,且也可以通过Dynamic Inventory来动态生成
4). 可以在每个主机后面指定用户名+密码:ansible_ssh_user='xxx' ansible_ssh_pass='password'
/etc/ansible/hosts文件格式
inventory文件遵循INI文件风格,中括号中的字符为组名。
可以将同一个主机同时归并到多个不同的组中;
此外,当如若目标主机使用了非默认的SSH端口,还可以在主机名称之后使用冒号加端口号来标明
四、ansible部署Windows的步骤
1、通过ansible部署Windows的前提条件
Ansible 从1.7+版本开始支持Windows,但前提是管理机必须为Linux系统,远程主机的通信方式也由SSH变更为PowerShell,同时管理机必须预安装Python的Winrm模块,方可和远程Windows主机正常通信,但PowerShell需3.0+版本且Management Framework 3.0+版本,实测Windows 7 SP1和Windows Server 2008 R2及以上版本系统经简单配置可正常与Ansible通信。简单总结如下:
1). 管理机必须为Linux系统且需预安装Python Winrm模块
2). 底层通信基于PowerShell,版本为3.0+,Management Framework版本为3.0+
3). 远程主机开启Winrm服务
2. ansible管理机部署安装
目前,只要机器上安装了 Python 2.6 或 Python 2.7 (windows系统不可以做控制主机),都可以运行Ansible.主机的系统可以是 Red Hat, Debian, CentOS, OS X, BSD的各种版本,等等。本文使用的管理机是centos7。
安装ansible有以下几种方式:
1). 通过源码部署
从项目的checkout中可以很容易运行Ansible,Ansible的运行不要求root权限,也不依赖于其他软件,不要求运行后台进程,也不需要设置数据库。因此许多用户一直使用Ansible的开发版本,这样可以利用最新的功能特性,也方便对项目做贡献。因为不需要安装任何东西,跟进Ansible的开发版相对于其他开源项目要容易很多.
从源码安装的步骤如下:
- clone源码
git clone git://github.com/ansible/ansible.git --recursive$ cd ./ansible
2. 安装pip
yum install pip3
3. 安装python依赖包
使用pip命令安装python依赖包
4. 配置hosts文件
vim /etc/ansible/hosts
[windows]
***.***.****.***
ansible_ssh_user="*****"
ansible_ssh_pass="****"
ansible_ssh_port=5985
ansible_connection="winrm"
ansible_winrm_server_cert_validation=ignore
5.运行env-setup脚本
一旦运行env-setup脚本,就意味着Ansible从源码中运行起来了.默认的inventory文件是 /etc/ansible/host,因此在运行env-setup脚本前必须配置host。
source ./ansible/env-setup
至此,部署机配置完毕。
3. Windows系统配置
和Linux发版版稍有区别,远程主机系统如为Windows需预先如下配置:
-
安装Framework 3.0+
-
更改powershell策略为remotesigned
-
升级PowerShell至3.0+
-
设置Windows远端管理,英文全称WS-Management(WinRM)
1). 安装Framework 3.0+
由于本次演示的Windows系统Framework已升级到4.5,所以只提供Framework的下载链接。去官网下载至本地后双击左键安装即可,期间可能会多次重启,电脑需正常连接Internet。
2). 更改powershell策略为remotesigned
在管理员权限下打开PowerShell,执行:set-executionpolicy remotesigned,如下图:
3). 升级PowerShell至3.0+
Window 7和Windows Server 2008 R2默认安装的有PowerShell,但版本号一般为2.0版本,所以我们需升级至3.0+,如下图中数字1部分表示PowerShell版本过低需3.0+版本,数字2部分表示当前PowerShell版本为2.0。
下脚本保存至本地后,右键选择“使用PowerShell运行”,执行完毕重启系统后,在PowerShell执行Get-Host命令结果如下图所示PowerShell版本为3.0为正常。 具体过程如下图:
4). 设置Windows远端管理(WS-Management,WinRM)
winrm service 默认都是未启用的状态,先查看状态;如无返回信息,则是没有启动;
winrm enumerate winrm/config/listener
针对winrm service 进行基础配置:
winrm quickconfig
查看winrm service listener:
winrm e winrm/config/listener
为winrm service 配置auth:
winrm set winrm/config/service/auth @{Basic="true"}
为winrm service 配置加密方式为允许非加密:
winrm set winrm/config/service @{AllowUnencrypted="true"}
好了,ansible部署Windows的配置到此结束,接下来我们来测试配置是否成功。
4. 验证ansible管理机是否可以访问Windows
1) win_ping 是Windows系统下的ping模块,经常被用来测试主机是否存活
执行以下命令:
ansible windows -m win_ping
执行结果如下图:
2) win_copy 用来拷贝文件到远程Windows主机
执行以下命令:
ansible windows -m win_copy -a 'src=/etc/passwd dest=F:\file\passwd'
执行结果如下:
***.***.*.**** | success >> {
"changed": true,
"checksum": "****",
"operation": "file_copy",
"original_basename": "passwd",
"size": 2563
}
如果要将以上命令放到ansible常用的Playbook中,写法如下:
---
- name: windows module example
hosts: windows
tasks:
- name: Move file on remote Windows Server from one location to another
win_file: src=/etc/passwd dest=F:\file\test
3) win_file —创建,删除文件或目录
如果想删除 F:\file\test
执行以下命令:
ansible windows -m win_file -a "path=F:\file\test state=absent"
执行结果如下:
***.***.*.*** | success >> {
"changed": true
}
好了,以上就是通过ansible部署Windows的全部介绍及演示,如果要完成复杂的部署功能,可以使用Playbook模块来执行定义的yaml文件,这样可以用简单明了的方式完成复杂的部署任务。