介绍
ansible官方文档里写道
Ansible is a radically simple IT automation engine
即:Ansible是一款极其简单的IT自动化工具
它基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。主要包括:
(1)、连接插件connection plugins:负责和被监控端实现通信;
(2)、host inventory:指定操作的主机,是一个配置文件里面定义监控的主机;
(3)、各种模块核心模块、command模块、自定义模块;
(4)、借助于插件完成记录日志邮件等功能;
(5)、playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务。
基本框架图
组件介绍
Ansible:Ansible核心程序。
connection plugins :连接插件,负责和被监控端实现通信。
HostInventory:记录由Ansible管理的主机信息,包括端口、密码、ip等。
Playbooks:”剧本”YAML格式文件,多个任务定义在一个文件中,定义主机需要调用哪些模块来完成的功能。
CoreModules:核心模块,主要操作是通过调用核心模块来完成管理任务。
CustomModules:自定义模块,完成核心模块无法完成的功能,支持多种语言。
ansible特点
部署简单,只需在主控端部署Ansible环境,被控端无需做任何操作,默认使用SSH协议对设备进行管理;
有大量常规运维操作模块,可实现日常绝大部分操作。
配置简单、功能强大、扩展性强;
支持API及自定义模块,可通过Python轻松扩展;
通过Playbooks来定制强大的配置、状态管理;
轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可;
提供一个功能强大、操作性强的Web管理界面和REST API接口——AWX平台。
幂等性 幂等性不会重复执行相同的指令。例如不会重复安装软件。
工作原理图
测试环境
名称 | IP | 系统 |
ansible | 192.168.10.10 | CenOS7 |
PC1 | 192.168.10.11 | CenOS7 |
PC2 | 192.168.10.12 | CenOS7 |
安装
安装ansible非常简单,直接YUM安装就可以。
# yum install epel-release -y # yum install ansible -y # ansible --version #查看版本 ansible 2.7.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, Apr 11 2018, 07:36:10) [GCC 4.8.5 20150623 (Red Hat 4.8.5-28)]
配置
ansible.cfg为ansible的主配置文件,他主要定义了roles_path路径,主机清单路径,连接清单中的主机方式等。
hosts是我们定义主机清单的配置文件。
# cd /etc/ansible/ # ls ansible.cfg hosts roles
主配置文件的一些解释
[defaults] # some basic default values... #inventory = /etc/ansible/hosts //定义资源清单文件的位置 #library = /usr/share/my_modules/ //library指向ansible模块的目录 #module_utils = /usr/share/my_module_utils/#remote_tmp = ~/.ansible/tmp#local_tmp = ~/.ansible/tmp #plugin_filters_cfg = /etc/ansible/plugin_filters.yml #forks = 5 //多少个进程可以同时工作 #poll_interval = 15 #sudo_user = root //设置默认执行命令的用户 #ask_sudo_pass = True //执行ansible命令是否询问ssh密码,每次都询问 #ask_pass = True //和上面一起的 #transport = smart #remote_port = 22 //连接被管理的端口,默认22 #module_lang = C #module_set_locale = False //第一次使用ansible连接客户端的提示开关 # SSH timeout#timeout = 10 //SSH连接超时的间隔,单位是秒
hosts定义方式
定义一个[组名]把地址或主机名加进去
我自己定义的两台主机,我把它分为了两个组。
[web]192.168.10.11 [sql]192.168.10.12
组成员可以使用通配符来匹配,如下 192.168.10.[1:5] #表示匹配从192.168.10.1——192.168.10.5的主机。
Ansible命令集
/usr/bin/ansible # Ansibe AD-Hoc 临时命令执行工具,常用于临时命令的执行
/usr/bin/ansible-doc # Ansible 模块功能查看工具
/usr/bin/ansible-galaxy # 下载/上传优秀代码或Roles模块的官网平台,基于网络的
/usr/bin/ansible-playbook # Ansible 定制自动化的任务集编排工具
/usr/bin/ansible-pull # Ansible远程执行命令的工具(使用较少,海量机器时使用,对运维的架构能力要求较高)
/usr/bin/ansible-vault # Ansible 文件加密工具
/usr/bin/ansible-console # Ansible基于Linux Consoble界面可与用户交互的命令执行工具
SSH与公私钥
在主机执行以下命令,将公钥发送到两台被连接主机。
#ssh-keygen -t rsa #创建公钥与私钥 #ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.10.11 #将公钥传输给对端服务器
此时服务器可以免密码登录
测试
这里用一个PING模块来验证一下是否连接成功,下一篇博客我们再研究另外的常用模块。
命令格式:
ansible<host-pattern> [options]
命令参数
-a MODULE_ARGS, --args=MODULE_ARGS
module arguments # 指定Ansible调用的模块
--ask-become-pass ask forprivilege escalation password # Ansible su切换用户的时候使用该参数输入密码
-k,--ask-pass ask for SSHpassword # 以密码认证
--ask-su-pass ask for supassword (deprecated, use become) # su的时候使用该参数
-K,--ask-sudo-pass ask for sudo password(deprecated, use become) # sudo的时候
--ask-vault-pass ask forvault password # ansible-valut 加密文件
-BSECONDS, --background=SECONDS # 后台等待秒数
--become-user=BECOME_USER
run operations as thisuser (default=None) # su到哪个用户
-C,--check don't make any changes;instead, try to predict some
of the changes that mayoccur # 不执行命令只做命令执行检查
-c CONNECTION, --connection=CONNECTION
connection type to use(default=smart)
-eEXTRA_VARS, --extra-vars=EXTRA_VARS # 调用外部变量
set additionalvariables as key=value or YAML/JSON
-fFORKS, --forks=FORKS # Ansible一次命令执行并发的线程数
-h,--help show this help messageand exit
-iINVENTORY, --inventory-file=INVENTORY #Ansible调用的Hosts文件,默认/etc/ansible/hosts
specify inventory hostfile
(default=/etc/ansible/hosts)
-lSUBSET, --limit=SUBSET # 限定主机列表中的某台机器执行
further limit selectedhosts to an additional pattern
--list-hosts outputs alist of matching hosts; does not execute
anything else ## 列出主机列表中的主机
-mMODULE_NAME, --module-name=MODULE_NAME #Ansible 调用的执行模块
-M MODULE_PATH, --module-path=MODULE_PATH #调用的模块路径
-S,--su run operations with su(deprecated, use become) #使用su和become结合使用
-RSU_USER, --su-user=SU_USER # su的话切换至哪个用户
-s,--sudo run operations withsudo (nopasswd) (deprecated, use
become) # 执行sudo命令
-USUDO_USER, --sudo-user=SUDO_USER # sudo
-TTIMEOUT, --timeout=TIMEOUT # 执行命令的超时时间
--vault-password-file=VAULT_PASSWORD_FILE ## ansible-vault加密的密码文件
-v,--verbose verbose mode (-vvv formore, -vvvv to enable
connectiondebugging) # 显示详细信息 -vvvv
--version showprogram's version number and exit ## 显示版本号
ping模块测试:
# ansible all -m ping 192.168.10.11 | SUCCESS => {"changed": false, "ping": "pong"} 192.168.10.12 | SUCCESS => {"changed": false, "ping": "pong"}
看到两台主机都返回了成功ping通,至此我们就可以愉快的使用ansible对区域内的服务器开始管理工作啦!