一、ansible简介
1.ansible
ansible是新出现的自动化运维工具,基于Python研发。糅合了众多老牌运维工具的优点实现了批量操作系统配置、批量程序的部署、批量运行命令等功能。仅需在管理工作站上安装ansible程序配置被管控主机的IP信息,被管控的主机无客户端。ansible应用程序存在于epel(第三方社区)源,依赖于很多python组件。主要包括:
- 连接插件connection plugins:负责和被监控端实现通信;
- host inventory:指定操作的主机,是一个配置文件里面定义监控的主机;
- 各种模块核心模块、command模块、自定义模块;
- 借助于插件完成记录日志邮件等功能;
- playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务。
2.ansible特性
- 模块化设计,调用特定的模块来完成特定任务,本身是核心组件,短小精悍;
- 基于Python语言实现,由Paramiko(python的一个可并发连接ssh主机功能库), PyYAML和Jinja2(模板化)三个关键模块实现;
- 部署简单,agentless无客户端工具;
- 主从模式工作;
- 支持自定义模块功能;
- 支持playbook剧本,连续任务按先后设置顺序完成;
- 期望每个命令具有幂等性:
3.ansible架构
- ansible core:ansible自身核心模块
- host inventory:主机库,定义可管控的主机列表
- connection plugins:连接插件,一般默认基于ssh协议连接
- modules:core modules(自带模块)、custom modules(自定义模块)
- playbooks:剧本,按照所设定编排的顺序执行完成安排任务
4.配置文件:
- ansible应用程序的主配置文件:/etc/ansible/ansible.cfg
- Host Inventory定义管控主机:/etc/ansible/hosts
二、ansible的安装部署
1、yum安装方式
1.1 查看操作系统版本
[root@localhost ~]# uname -a
Linux localhost.localdomain 3.10.0-693.el7.x86_64 #1 SMP Tue Aug 22 21:09:27 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
[root@localhost ~]# cat /etc/centos-release
CentOS Linux release 7.4.1708 (Core)
[root@localhost ~]#
1.2 安装 EPEL 源
[root@localhost ~]# yum y -y install epel-release
1.3 查看安装的 EPEL 源
[root@localhost ~]# ll /etc/yum.repos.d/epel*
-rw-r--r-- 1 root root 951 Oct 3 2017 /etc/yum.repos.d/epel.repo
-rw-r--r-- 1 root root 1050 Oct 3 2017 /etc/yum.repos.d/epel-testing.repo
[root@localhost ~]#
1.4 使用 yum 方式安装
[root@localhost ~]# yum install ansible -y
1.5 安装完毕,查看版本
[root@localhost ~]# ansible --version
ansible 2.8.0
config file = /etc/ansible/ansible.cfg
configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python2.7/site-packages/ansible
executable location = /usr/bin/ansible
python version = 2.7.5 (default, Aug 4 2017, 00:39:18) [GCC 4.8.5 20150623 (Red Hat 4.8.5-16)]
[root@localhost ~]#
2、Ansible 组成介绍
[root@localhost ~]# tree /etc/ansible/
/etc/ansible/
├── ansible.cfg # ansible 的配置文件
├── hosts # ansible 的主仓库 用来存储需要管理的远程主机的相关信息
└── roles
1 directory, 2 files
[root@localhost ~]#
-
核心
:ansible; -
核心模块(Core Modules)
:这些都是 ansible 自带的模块; -
扩展模块(Custom Modules)
:如果核心模块不是以完成某种功能,可以添加扩展功能; -
插件(Plugins)
:完成模块功能的补充; -
剧本(Playbooks)
:ansible 的任务配置文件,将多个任务定义在剧本中,由ansible 自动执行; -
连接插件(Connectior Plugins)
:ansible 基于连接插件连接到各个主机上,虽然ansible 是使用 ssh 连接到各个主机的,但是它还支持其他的连接方法,所以需要有连接插件; -
主机群(Host Inventor)
:定义 ansible 管理的主机
3、Ansible 的七个命令
安装完 ansible 后,发现 ansible 一共为我们提供了七个指令:ansible、ansible-doc、ansible-galaxy、ansible-lint、ansible-playbook、ansible-pull、ansible-vault 。这里我们只查看usage 部分,详细部分可以通过 “指令 -h” 的方式获取。
3.1 ansible
[root@localhost ~]# ansible -h
Usage: ansible <host-pattern> [options]
ansible 是指令核心部分,其主要用于执行 ad-hoc 命令,即单条命令。默认后面需要跟
主机和选项部分,默认不指定模块时,使用的是 command 模块。如:
[root@localhost ~]# ansible localhost -a 'date'
localhost | CHANGED | rc=0 >>
Fri Jun 7 11:51:33 CST 2019
You have new mail in /var/spool/mail/root
[root@localhost ~]#
** ansible 命令下的参数部分解释如下:**
-a 'Arguments', --args='Arguments' 命令行参数
-m NAME, --module-name=NAME 执行模块的名字,默认使用 command 模块,所以如果是只执行单一命令可以不用 -m 参数
-i PATH, --inventory=PATH 指定库存主机文件的路径,默认为/etc/ansible/hosts.
-u Username, --user=Username 执行用户,使用这个远程用户名而不是当前用户
-U --sud-user=SUDO_User sudo 到哪个用户,默认为 root
-k --ask-pass 登录密码,提示输入 SSH 密码而不是假设基于密钥的验证
-K --ask-sudo-pass 提示密码使用 sudo
-s --sudo sudo 运行
-S --su 用 su 命令
-s --snippet 指定模块显示剧本片段
-f --forks=NUM 并行任务数。NUM 被指定为一个整数,默认是 5。 #ansible testhosts -a "/sbin/reboot" -f 10 重启 testhosts 组的所有机器,每次重启 10 台
--private-key=PRIVATE_KEY_FILE 私钥路径,使用这个文件来验证连接
-v --verbose 详细信息
all 针对 hosts 定义的所有主机执行
-M MODULE_PATH, --module-path=MODULE_PATH 要执行的模块的路径,默认为/usr/share/ansible/
--list-hosts 只打印有哪些主机会执行这个 playbook 文件,不是实际执行该 playbook 文件
-o --one-line 压缩输出,摘要输出.尝试一切都在一行上输出。
-t Directory, --tree=Directory 将内容保存在该输出目录,结果保存在一个文件中在每台主机上。
-B 后台运行超时时间
-P 调查后台程序时间
-T Seconds, --timeout=Seconds 时间,单位秒 s
-P NUM, --poll=NUM 调查背景工作每隔数秒。需要- b
-c Connection, --connection=Connection 连接类型使用。可能的选项是 paramiko(SSH),SSH和地方。当地主要是用于 crontab 或启动。
--tags=TAGS 只执行指定标签的任务 例子:ansible-playbook test.yml --tags=copy 只执行标签为 copy 的那个任务
--list-hosts 只打印有哪些主机会执行这个 playbook 文件,不是实际执行该 playbook 文件
--list-tasks 列出所有将被执行的任务
-C, --check 只是测试一下会改变什么内容,不会真正去执行;相反,试图预测一些可能发生的变化
--syntax-check 执行语法检查的剧本,但不执行它
-l SUBSET, --limit=SUBSET 进一步限制所选主机/组模式 --limit=192.168.0.15 只对这个 ip
执行
--skip-tags=SKIP_TAGS 只运行戏剧和任务不匹配这些值的标签 --skip-tags=copy_start
-e EXTRA_VARS, --extra-vars=EXTRA_VARS 额外的变量设置为键=值或 YAML / JSON
-l,--limit 对指定的 主机/组 执行任务 --limit=192.168.0.10,192.168.0.11 或 -l 192.168.0.10 ,192.168.0.11 只对这个 2 个 ip 执行任务