1、简介
随着互联网IT运维飞速发展,目前市场上涌现了大量的自动化配置维护工具,例如 PSSH、Puppet、Chef、SaltStack、Ansible等。目前互联网企业使用最多的两款自动化配置工具是Ansible和Saltstack。
1.1 Puppet自动运维工具
Puppet是早期的Linux自动化运维工具,是一种Linux、Unix、Windows平台的集中配置管理系统,发展至今目前已经非常成熟,可以批量管理远程服务器,模块丰富,配置复杂,基于Ruby语言编写。最典型的C/S模式,需要安装服务端与客户端。
puppet采用C/S星状的结构,所有的客户端和一个或几个服务器交互,每个客户端周期的(默认半个小时)向服务器发送请求,获得其最新的配置信息,保证和该配置信息同步。
每个puppet客户端每半小时(可以设置)连接一次服务器端, 下载最新的配置文件,并且严格按照配置文件来配置客户端. 配置完成以后,puppet客户端可以反馈给服务器端一个消息,如果出错也会给服务器端反馈一个消息。
Puppet适用于服务器管理的整个过程,比如初始安装、配置、更新以及系统下线。
1.2 Saltstack自动运维工具
Saltstack与Puppet均是C/S模式,需安装服务端与客户端,基于Python编写,加入MQ消息同步,可以使执行命令和执行结果高效返回,但其执行过程需等待客户端全部返回,如果客户端未及时返回或未响应的话,可能会导致部分机器没有执行结果。
1.3 Ansible自动运维工具
Ansible与Saltstack均是基于Python语言开发,Ansible只需要在一台普通的服务器上运行即可,不需要在客户端服务器上安装客户端。因为Ansible是基于SSH远程管理,而Linux服务器大都离不开SSH,所以Ansible不需要为配置工作添加额外的支持。Ansible安装使用非常简单,而且基于上千个插件和模块实现各种软件、平台、版本的管理,支持虚拟容器多层级的部署。很多读者在使用Ansible工具时,认为Ansible比Saltstatck执行效率慢,其实不是软件本身慢,是由于SSH服务慢,可以优化SSH连接速度及使用Ansible加速模块,满足企业上万台服务器的维护和管理。
Ansible运维工具原理:
Ansible是一款极为灵活的开源工具套件,能够大大简化Unix管理员的自动化配置管理与流程控制方式。它利用推送方式对客户系统加以配置,这样所有工作都可在主服务器端完成。其命令行机制同样非常强大,允许大家利用商业许可Web UI实现授权管理与配置。可以通过命令行或者GUI来使用Ansible,运行Ansible的服务器这里俗称“管理节点”;通过Ansible进行管理的服务器俗称“受控节点”。权威媒体报道Ansible于2015年被Red Hat公司1.5亿美元收购,新版Red Hat内置Ansible软件。
Ansible自动运维管理工具优点:
轻量级,更新时,只需要在操作机上进行一次更新即可;
采用SSH协议;
不需要去客户端安装agent;
批量任务执行可以写成脚本,而且不用分发到远程就可以执行;
使用python编写的,维护更简单;
支持sudo普通用户命令;
去中心化管理。
Ansible自动运维管理工具工作原理拓扑:
2、Ansible 安装配置
Ansible 可以工作在Linux、BSD、Mac OS X 等平台,对Python环境的版本最低要求为Python2.6以上,如果操作系统Python软件版本为2.4,需要升级方可使用Ansible工具。Red Hat、CentOS操作系统可以直接基于YUM工具自动安装Ansible,CentOS6.x或者CentOS7.x安装前,需先安装epel扩展源。
[root@localhost ~]# yum install -y ansible
Ansible工具默认主目录为:/etc/ansible/,其中hosts文件为被管理机IP或者主机名列表,ansible.cfg为ansible主配置文件,roles为角色或者插件路径,默认该目录为空。
[root@localhost ~]# ll /etc/ansible/
总用量 28
-rw-r--r-- 1 root root 19985 3月 7 12:43 ansible.cfg
-rw-r--r-- 1 root root 1067 3月 30 21:33 hosts
-rw-r--r-- 1 root root 1016 3月 30 21:12 hosts.bak
drwxr-xr-x 2 root root 6 3月 7 12:43 roles
Ansible远程批量管理,其中执行命令是通过Ad-Hoc来完成,也即点对点单条执行命令,能够快速执行,而且不需要保存执行的命令。默认hosts文件配置主机列表,可以配置分组,可以定义各种ip及规则。
[root@localhost ~]# vim /etc/ansible/hosts
[nginx]
10.0.0.147
[tomcat]
10.0.0.148
10.0.0.149
Ansible基于多模块管理,常用的Ansible工具管理模块包括:command、shell、script、yum、copy、File、async、docker、cron、mysql_user、ping、sysctl、user、acl、add_host、easy_install、haproxy等。
可以使用ansible-doc -l|more查看ansible支持的模块,也可以查看每个模块的帮助文档,ansible-doc module_name。
[root@localhost ~]# ansible
usage: ansible [-h] [--version] [-v] [-b] [--become-method BECOME_METHOD]
[--become-user BECOME_USER] [-K] [-i INVENTORY] [--list-hosts]
[-l SUBSET] [-P POLL_INTERVAL] [-B SECONDS] [-o] [-t TREE] [-k]
[--private-key PRIVATE_KEY_FILE] [-u REMOTE_USER]
[-c CONNECTION] [-T TIMEOUT]
[--ssh-common-args SSH_COMMON_ARGS]
[--sftp-extra-args SFTP_EXTRA_ARGS]
[--scp-extra-args SCP_EXTRA_ARGS]
[--ssh-extra-args SSH_EXTRA_ARGS] [-C] [--syntax-check] [-D]
[-e EXTRA_VARS] [--vault-id VAULT_IDS]
[--ask-vault-pass | --vault-password-file VAULT_PASSWORD_FILES]
[-f FORKS] [-M MODULE_PATH] [--playbook-dir BASEDIR]
[-a MODULE_ARGS] [-m MODULE_NAME]
pattern
[root@localhost ~]# ansible-doc shell
> SHELL (/usr/lib/python2.7/site-packages/ansible/modules/commands/shell.py)
The `shell' module takes the command name followed by a list of space-delimited arguments. Either a
free form command or `cmd' parameter is required, see the examples. It is almost exactly like the
[command] module but runs the command through a shell (`/bin/sh') on the remote node. For Windows
targets, use the [win_shell] module instead.
* This module is maintained by The Ansible Core Team
* note: This module has a corresponding action plugin.
OPTIONS (= is mandatory):
- chdir
Change into this directory before running the command.
[Default: (null)]
type: path
version_added: 0.6
- cmd
The command to run followed by optional arguments.
[Default: (null)]
type: str
3、Ansible工具参数
基于Ansible自动运维工具管理客户端操作,由于Ansible管理远程服务器基于SSH,在登录远程服务器执行命令时需要远程服务器的用户名和密码,也可以加入-k参数手动输入密码或者基于ssh-keygen生成免秘钥。
Ansible自动化批量管理工具主要参数如下:
-v,–verbose 打印详细模式;
-i PATH,–inventory=PATH 指定host文件路径;
-f NUM,–forks=NUM 指定fork开启同步进程的个数,默认5;
-m NAME,–module-name=NAME 指定module名称,默认模块command;
-a MODULE_ARGS module模块的参数或者命令;
-k,–ask-pass 输入远程被管理端密码;
–sudo 基于sudo用户执行;
-K,–ask-sudo-pass 提示输入sudo密码与sudo一起使用;
-u USERNAME,–user=USERNAME 指定客户端的执行用户;
-C,–check 测试执行过程,不改变真实内容,相当于预演;
-T TIMEOUT, 执行命令超时时间,默认为10秒;
--version 查看Ansible软件版本信息。
ssh-keygen免秘钥:
# 生成公钥、私钥
[root@localhost ansible]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
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:YW7EunqGZA+Dz8SoxnUOAfTxNRDIsbLYh6afBbJSy4k root@localhost.localdomain
The key's randomart image is:
+---[RSA 2048]----+
|...ooooo |
| ..o+ ... |
| ..o . = |
|..oo = . |
|o.*+o . S |
| OoBB. o |
|E.=*==. |
|o+ o+o+ |
|. o .o |
+----[SHA256]-----+
#将公钥拷贝到其他机器
[root@localhost ansible]# ssh-copy-id -i /root/.ssh/id_rsa.pub 10.0.0.147
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@10.0.0.147's password: