人生是条无名的河,是浅是深都要过; 人生是杯无色的茶,是苦是甜都要喝;
Ansible快速入门
介绍
Ansible是一款为类Unix系统开发的自由开源的配置和自动化工具。它用Python写成,类似于saltstack和Puppet,但是有一个不同和优点是我们不需要在节点中安装任何客户端。它使用SSH来和节点进行通信。Ansible基于 Python paramiko 开发,分布式,无需客户端,轻量级,配置语法使用 YMAL 及 Jinja2模板语言,更强的远程命令执行操作
Ansible是一款简单的运维自动化工具,只需要使用ssh协议连接就可以来进行系统管理,自动化执行命令,部署等任务。
Ansible的特点
1、ansible不需要单独安装客户端,也不需要启动任何服务 2、ansible是python中的一套完整的自动化执行任务模块 3、ansible playbook 采用yaml配置,对于自动化任务执行过一目了然
Ansible组成结构
o Ansible 是Ansible的命令工具,核心执行工具;一次性或临时执行的操作都是通过该命令执行。
o Ansible Playbook 任务剧本(又称任务集),编排定义Ansible任务集的配置文件,由Ansible顺序依次执行,yaml格式。
o Inventory Ansible管理主机的清单,默认是/etc/ansible/hosts文件。
o Modules Ansible执行命令的功能模块,Ansible2.3版本为止,共有1039个模块。还可以自定义模块。
o Plugins 插件,模块功能的补充,常有连接类型插件,循环插件,变量插件,过滤插件,插件功能用的较少。
o API 提供给第三方程序调用的应用程序编程接口。
ansiblle具有如下特点:
· 1、部署简单,只需在主控端部署Ansible环境,被控端无需做任何操作;
· 2、默认使用SSH协议对设备进行管理;
· 3、主从集中化管理;
· 4、配置简单、功能强大、扩展性强;
· 5、支持API及自定义模块,可通过Python轻松扩展;
· 6、通过Playbooks来定制强大的配置、状态管理
· 7、对云计算平台、大数据都有很好的支持;
环境准备
IP | 系统 | 主机名 | 描述 |
---|---|---|---|
192.168.1.100 | CentOS7 | ansible | ansible管理节点 |
192.168.1.107 | CentOS7 | linux.node01.com | 被管理节点1 |
192.168.1.108 | CentOS7 | linux.node02.com | 被管理节点2 |
Ansible安装
1)配置epel源
[root@ansible ~]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
代码语言:javascript复制[root@ansible ~]# yum clean all
代码语言:javascript复制[root@ansible ~]# yum makecache
2)安装ansible
代码语言:javascript复制[root@ansible ~]# yum -y install ansible
代码语言:javascript复制# 查看ansible版本
代码语言:javascript复制[root@ansible ~]# ansible --version
Ansible Inventory文件
Inventory中文文档
Inventory文件通常用于定义要管理的主机的认证信息,例如ssh登录用户名、密码以及key相关信息。可以同时操作一个组的多台主机,组与主机组之间的关系都是通过inventory文件配置。配置文件路径为:/etc/ansible/hosts
基于密码连接
[root@ansible ~]# vi /etc/ansible/hosts
# 方法一 主机 端口 密码
代码语言:javascript复制[webserver]
代码语言:javascript复制192.168.1.104 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass="woaini"
代码语言:javascript复制192.168.1.107 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass="woaini"
# 方法二 主机 端口 密码
代码语言:javascript复制[webserver]
代码语言:javascript复制192.168.1.104
代码语言:javascript复制192.168.1.107
代码语言:javascript复制[webserver:vars]
代码语言:javascript复制Ansible_ssh_user="root"
代码语言:javascript复制ansible_ssh_pass="woaini"
基于秘钥连接
基于秘钥连接需要先创建公钥和私钥,并发送给被管理机器
1) 生成公私钥
代码语言:javascript复制[root@ansible ~]# ssh-keygen –t rsa
代码语言:javascript复制[root@ansible ~]# for i in {104,107}; do ssh-copy-id -i 192.168.1.$i ; done
2) 配置连接
代码语言:javascript复制[root@ansible ~]# vim /etc/ansible/hosts
代码语言:javascript复制# 方法一 主机 端口 密钥
代码语言:javascript复制[webserver]
代码语言:javascript复制192.168.1.104
代码语言:javascript复制192.168.1.107
代码语言:javascript复制# 方法一 别名主机 端口 密钥
代码语言:javascript复制node1 ansible_ssh_host=192.168.1.104 ansible_ssh_port=22
代码语言:javascript复制node2 ansible_ssh_host=192.168.1.107 ansible_ssh_port=22
组机的使用
# 主机组变量名 主机 密码
[apache]
192.168.1.104
[apache:vars]
ansible_ssh_pass='123456'
# 主机组变量名 主机 密钥
[nginx]
192.168.1.107
# 定义多个组,把一个组当另外一个组的组员
[webserver:children] #webserver组包括两个子组:apache nginx
apache
nginx
临时指定inventory
1) 先编辑一个主机定义清单
代码语言:javascript复制[root@ansible ~]# vi /etc/dockers
代码语言:javascript复制[dockers]
代码语言:javascript复制192.168.1.104 ansible_ssh_pass='123456'
代码语言:javascript复制192.168.1.107
2)在执行命令是指定inventory
代码语言:javascript复制[root@ansible ~]# ansible dockers -m ping -i /etc/dockers -o
Inventory内置参数
Ansible Ad-Hoc
Ad-Hoc中文文档
ad-hoc —— 临时的,在ansible中是指需要快速执行,并且不需要保存的命令。说白了就是执行简单的命令——一条命令。对于复杂的命令则为playbook,类似于saltstack的state sls状态文件。
ansible命令格式
1)常用命令参数
Usage: ansible <host-pattern> [options]
-a MODULE_ARGS #模块参数
-C, --check #检查语法
-f FORKS #并发
--list-hosts #列出主机列表
-m MODULE_NAME #模块名字
-o 使用精简的输出
2) 示例
代码语言:javascript复制[root@ansible ~]# ansible webserver -m shell -a 'uptime' –o
3) 命令说明
host-pattern格式
目标target主机,主机组匹配方式
主机的匹配
代码语言:javascript复制# 一台目标主机
代码语言:javascript复制[root@ansible ~]# ansible 192.168.1.104 -m ping
代码语言:javascript复制# 多台目标主机
代码语言:javascript复制[root@ansible ~]# ansible 192.168.1.104,192.168.1.107 -m ping
代码语言:javascript复制# 所有目标主机
代码语言:javascript复制[root@ansible ~]# ansible all -m ping
组的匹配
代码语言:javascript复制# 组的配置信息如下:这里定义了一个nginx组和一个apache组
[root@ansible ~]# ansible nginx --list
[root@ansible ~]# ansible apache --list
# 一个组的所有主机匹配
[root@ansible ~]# ansible apache -m ping
# 匹配apache组中有,但是nginx组中没有的所有主机
[root@ansible ~]# ansible 'apache:!nginx' -m ping -o
# 匹配apache组和nginx组中都有的机器(并集)
[root@ansible ~]# ansible 'apache:&nginx' -m ping -o
# 匹配apache组nginx组两个组所有的机器(并集);等于ansible apache,nginx -m ping
[root@ansible ~]# ansible 'apache:nginx' -m ping -o
人生是条无名的河,是浅是深都要过; 人生是杯无色的茶,是苦是甜都要喝;