简介
Ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点。实现了批量系统配置、批量程序部署、批量运行命令等功能。Ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是Ansible所运行的模块,Ansible只是提供一种框架
Ansible是基于 paramiko 开发的,并且基于模块化工作,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。ansible不需要在远程主机上安装client/agents,因为它们是基于ssh来和远程主机通讯的。ansible目前已经已经被红帽官方收购,是自动化运维工具中大家认可度最高的,并且上手容易,学习简单。是每位运维工程师必须掌握的技能之一
Ansible的优缺点
优点
1、Agentless:去中心化
2、Stupied Simple ,上手简单,学习曲线平滑
3、SSH by default ,安全,无需安装客户端
4、配置简单、功能强大、扩展性强
5、支持API及自定义模块,可通过Python轻松扩展
6、通过Playbooks来定制强大的配置、状态管理
7、提供一个功能强大、操作性强的Web管理界面和REST API接口——AWX平台
8、幂等性:一种操作重复多次结果相同
缺点
1、对windows系统的排斥(服务端无法安装在windows)
2、运行效率较低(task任务是串行运行;多台设备同时运行一个task,有并发数限制)
Ansible的架构
架构说明 | |
---|---|
Ansible | Ansible的核心程序 |
Host Lnventory | 记录了每一个由Ansible管理的主机信息,信息包括ssh端口,root帐号密码,ip地址等等。可以通过file来加载,可以通过CMDB加载 |
Playbooks | YAML格式文件,多个任务定义在一个文件中,使用时可以统一调用,“剧本”用来定义那些主机需要调用那些模块来完成的功能 |
Core Modules | Ansible执行任何管理任务都不是由Ansible自己完成,而是由核心模块完成;Ansible管理主机之前,先调用core Modules中的模块,然后指明管理Host Lnventory中的主机,就可以完成管理主机 |
Custom Modules | 自定义模块,完成Ansible核心模块无法完成的功能,此模块支持任何语言编写 |
Connection Plugins | 连接插件,Ansible和Host通信使用 |
一、Ansible的安装及使用
准备环境
系统 | IP | 主机名称 | 角色 |
---|---|---|---|
CentOS 7.4 | 192.168.2.10 | Ansible | 管理节点 |
CentOS 7.4 | 192.168.2.11 | node1 | 节点1 |
CentOS 7.4 | 192.168.2.12 | node2 | 节点2 |
1、安装Ansible
下载ansible源码包:Ansible.rar
下载完成后先在自己电脑里面解压在上传
[root@Ansible ~]# vim /etc/yum.repos.d/centOS7.repo 修改yum源
.......
...
[ansibe] #添加内容
baseurl=file:///root/ansible
enabled=1
gpgcheck=0
保存
[root@Ansible ~]# yum -y install ansible
................
.....
..
2、lnventory内置参数
ansible_ssh_host: #定义hosts ssh地址
ansible_ssh_port: #定义hosts ssh端口
ansible_ssh_user: #定义hosts ssh认证用户
ansible_ssh_pass: #定义hosts ssh认证密码
ansible_sudo: #定义hosts sudo用户
ansible_sudo_pass: #定义hosts sudo密码
ansible_sudo_exe: #定义host sudo路径;sudo 命令路径(适用于1.8及以上版本)
ansible_connection: #定义hosts连接方式
#与主机的连接类型(比如:local, ssh 或者 paramiko):
#Ansible 1.2 以前默认使用 paramiko.1.2 以后默认使用 'smart'
#'smart' 方式会根据是否支持 ControlPersist, 来判断'ssh' 方式是否可行
ansible_ssh_private_key_file: #定义hosts私钥
ansible_shell_type: #定义hosts shell类型
#目标系统的shell类型.默认情况下,
#命令的执行使用 'sh' 语法,可设置为 'csh' 或 'fish'
ansible_python_interpreter: #定义hosts 任务执行python路径
ansible_*_interpreter: #定义hosts其他语言解析路径
ansible_ssh_private_key_file: #ssh 使用的私钥文件;适用于有多个密钥,而不使用 SSH 代理的情况
ansible_python_interpreter #目标主机的 python 路径
#适用于的情况: 系统中有多个 Python, 或者命令路径不是"/usr/bin/python"
#比如 \*BSD, 或者 /usr/bin/python 不是 2.X 版本的 Python
#不使用 "/usr/bin/env" 机制,因为这要求远程用户的路径设置正确
#且要求 "python" 可执行程序名不可为 python以外的名字(实际有可能名为python26).
#与 ansible_python_interpreter 的工作方式相同,可设定如 ruby 或 perl 的路径....
3、ansible的常用参数
参数 | 说明 |
---|---|
-m | 要执行的模块,默认为command |
-a | 指定模块的参数 |
-u | ssh连接的用户名,默认用root,ansible.cfg中可以配置 |
-b | --become:变成那个用户身份,不提示密码 |
-k | 提示输入ssh登录密码,当使用密码验证的时候用 |
-s | sudo运行 |
-U | sudo到哪个用户,默认为root |
-K | 提示输入sudo密码,当不是NOPASSWD模式时使用 |
-C | 只是测试一下会改变什么内容,不会真正去执行 |
-c | 连接类型(default=smart) |
-f | fork多少进程并发处理,默认为5个 |
-i | 指定hosts文件路径,默认default=/etc/ansible/hosts |
-I | 指定pattern,对已匹配的主机中再过滤一次 |
-list-host | 只打印有哪些主机会执行这个命令,不会实际执行 |
-M | 要执行的模块路径,默认为/usr/share/ansible |
-o | 压缩输出,摘要输出 |
--private-key | 私钥路径 |
-T | ssh连接超时时间,默认是10秒 |
-t | 日志输出到该目录,日志文件名以主机命名 |
-v | 显示详细日志 |
4、lnventory文件的配置
4.1、密码连接
第一次连接需要输入yes,执行以下操作,如不操作会报错
[root@Ansible ~]# vi /etc/ansible/ansible.cfg
............
62 host_key_checking = False #让该命令生效删除#号
............
保存
方式一:
[root@Ansible ~]# vim /etc/ansible/hosts
..............
...........
[node1]
192.168.2.11 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=123.com
[node2]
192.168.2.12 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=123.com
保存
方式二:
[node]
192.168.2.11 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=123.com
192.168.2.12 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=123.com
方式三:
[node]
192.168.2.[11:12] ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=123.com
方式四: 需要配置秘钥才能实现
[node1]
192.168.2.11
[node2]
192.168.2.12
[node:children] #[名称:children(固定的)]
node1
node2
[root@Ansible ~]# ansible node1 -m ping
192.168.2.11 | SUCCESS => {
"changed": false,
"ping": "pong"
}
4.2、秘钥连接
生成秘钥并传输给node1,node2
[root@Ansible ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
/root/.ssh/id_rsa already exists.
Overwrite (y/n)? y
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:qfRxoDOzgmuHxg9WHPGAMcSCrzgJM6uQJaB5kiTlIeI root@Ansible
The key's randomart image is:
+---[RSA 2048]----+
|++*oo |
|B+oo + |
|=E. . . . |
|X +. . . o |
|o% o * S . |
|O o . B o |
|oo+.. o . |
|..=o.. |
| o.o. |
+----[SHA256]-----+
[root@Ansible ~]# ssh-copy-id -i 192.168.2.11
...........
[root@Ansible ~]# ssh-copy-id -i 192.168.2.12
...........
4.3、输出的颜色进行判断
Ansible执行的时候根据结果会显示颜色 | |
---|---|
蓝色(或绿色) | 执行成功并且不需要做改变的操作 |
黄色 | 执行成功并且对目标主机做变更 |
红色 | 执行失败 |
紫色 | 警告消息 |
颜色的显示与changed的状态相关联,并可以在ansible.cfg中进行定制颜色的设定 其他颜色可以参考官网配置文件介绍 |
ansible.cfg配置文件官方详介:Ansible Configuration Settings — Ansible Documentation
[root@Ansible ~]# vi /etc/ansible/ansible.cfg
................
........
[colors]
#highlight = white
#verbose = blue #详细消息
#warn = bright purple #警告消息
#error = red #错误消息
#debug = dark gray #调试消息
#deprecate = purple #弃用消息
#skip = cyan #已跳过任务状态
#unreachable = red #无法到达
#ok = green #正常任务状态
#changed = yellow #已更改任务状态
#diff_add = green
#diff_remove = red
#diff_lines = cyan
..............
.....
——————————————————————————————
可以自定义设置颜色 官方已经给很多的颜色可以选择 ;修改完后去掉注释
5、Ansible命令格式
命令语法:ansible < host-pattern > [-m module_name] [-a args]
说明 | |
< host-pattern> | 尖括号表示不可省 1、在资产文件中的组名 2、资产文件中的IP或主机名 3、all文件资产文件中的所有主机 |
[-m module_name] | 中括号表示此选项可省 此参数为模块名 |
[-a args] | 模块对应的参数,有些模块没有参数 |
5.1、主机与组的格式
单台主机或组
-----组
[root@Ansible ~]# ansible node1 -m ping
192.168.2.11 | SUCCESS => {
"changed": false,
"ping": "pong"
}
-------主机
[root@Ansible ~]# ansible 192.168.2.11 -m ping
192.168.2.11 | SUCCESS => {
"changed": false,
"ping": "pong"
}
多台主机或组
-----组
[root@Ansible ~]# ansible node1,node2 -m ping
192.168.2.12 | SUCCESS => {
"changed": false,
"ping": "pong"
}
192.168.2.11 | SUCCESS => {
"changed": false,
"ping": "pong"
}
-----主机
[root@Ansible ~]# ansible 192.168.2.11,192.168.2.12 -m ping
192.168.2.11 | SUCCESS => {
"changed": false,
"ping": "pong"
}
192.168.2.12 | SUCCESS => {
"changed": false,
"ping": "pong"
}
所有目标
[root@Ansible ~]# ansible all -m ping
192.168.2.11 | SUCCESS => {
"changed": false,
"ping": "pong"
}
192.168.2.12 | SUCCESS => {
"changed": false,
"ping": "pong"
}
5.2、组匹配
查看组信息
--------查询单个组的主机
[root@Ansible ~]# ansible node1 --list
hosts (1):
192.168.2.11
--------查询全部组的主机
[root@Ansible ~]# ansible all --list
hosts (2):
192.168.2.12
192.168.2.11
匹配node1组中有的,但是node2组中没有的所有主机
[root@Ansible ~]# vim /etc/ansible/hosts
.............
[node1]
192.168.2.11
[node2]
192.168.2.12
保存
[root@Ansible ~]# ansible 'node1:!node2' -m ping -o
192.168.2.11 | SUCCESS => {"changed": false, "ping": "pong"}
匹配node1组和node2组都有的主机(交集)
[root@Ansible ~]# vim /etc/ansible/hosts
...........
.....
[node1]
192.168.2.11
192.168.2.12
[node2]
192.168.2.12
保存
[root@Ansible ~]# ansible 'node1:&node2' -m ping -o
192.168.2.12 | SUCCESS => {"changed": false, "ping": "pong"}
匹配node1与node2两个组的所有主机(并集)
[root@Ansible ~]# ansible 'node1:node2' -m ping -o
192.168.2.11 | SUCCESS => {"changed": false, "ping": "pong"}
192.168.2.12 | SUCCESS => {"changed": false, "ping": "pong"}
—————————— 同
[root@Ansible ~]# ansible node1,node2 -m ping
192.168.2.12 | SUCCESS => {
"changed": false,
"ping": "pong"
}
192.168.2.11 | SUCCESS => {
"changed": false,
"ping": "pong"
}
二、Ansible 的常用模块
1、Ansible-doc命令
Ansible-doc用来查询ansible模块文档的说明,类似于man命令,针对每个模块都有详细的用法说明及应用案例介绍
格式:ansible-doc [options] [module……]
[root@Ansible ~]# ansible-doc -l #列出支持的模块
.........
....
[root@Ansible ~]# ansible-doc -l| wc -l
1852
[root@Ansible ~]# ansible-doc ping #查询ping模块的说明信息
....
.... # q 退出
2、执行命令相关模块
2.1、command模块
command模块是默认的,用于在给的的节点上运行系统命令,比如echo hello
它不会通过shell处理命令,因此不支持像$HOME这样的变量和,以及<、>、|、;、& 等都是无效的。也就是在command模块中无法使用特殊符号
参数 | 必选 | 说明 |
---|---|---|
chdir | no | 运行command命令前先cd到这个目录 |
creates | no | 如果这个参数对应的文件存在,就不运行command |
free_form | yes | 需要执行的脚本(没有真正的参数为free_form) |
executable | no | 改变用来执行命令的shell,应该是可执行文件的绝对路径 |
removes | no | 如果这个参数对应的文件不存在,就不运行command,与creates参数的作用相反 |