文章目录

  • Ansible
  • 网站
  • 概念
  • 特点
  • 注意事项
  • Ansible架构
  • 主要功能
  • 相关文件
  • 安装
  • 相关文件
  • 配置文件ansible.cfg
  • 配置文件使用
  • 配置文件内容
  • 资源清单(inventory)hosts文件
  • inventory定义内容
  • 相关命令
  • ansible
  • ansible-doc
  • ansible-playbook
  • ansible-galaxy
  • ansible-config
  • ansible-inventory
  • ansible-vault


Ansible

网站

官方网站:https://docs.ansible.com/
Ansible中文权威指南:https://ansible-tran.readthedocs.io/en/latest/

概念

  • Ansible:新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。ansible是基于 paramiko 开发的,并且基于模块化工作,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。ansible不需要在远程主机上安装client/agents,因为它们是基于ssh来和远程主机通讯的。ansible目前已经已经被红帽官方收购,是自动化运维工具中大家认可度最高的,并且上手容易,学习简单。
  • SSH:SSH协议族可以用来进行远程控制, 或在计算机之间传送文件
  • paramiko:paramiko是Python的一个库,实现了SSHv2协议。有了Paramiko以后,我们就可以在Python代码中直接使用SSH协议对远程服务器执行操作,而不是通过ssh命令对远程服务器进行操作。
  • Ansible Tower (以前叫’AWX’)是能够帮助任何IT团队更容易使用Ansible的解决方案。该方案基于web。Tower允许对用户进行权限控制,即使某用户不能传送某SSH凭证,你也可以通过Tower来对该用户共享该凭证。我们可以通过图形化界面来管理Inventory,也可以对各种各样的云资源做同步。Tower可以记录所有job的日志,也可以与LDAP集成,并且拥有强大的可浏览的REST API。Tower也提供了命令行工具,可以与Jenkins轻松集成。Provisioning回调对自动伸缩拓扑图提供了强大的支持。Tower的免费版本最多支持10个节点,并且Ansible公司会提供强大的支持。
  • Ansible任务执行方式:
  • Ad-Hoc模式:临时命令模式,指的是使用 /usr/bin/ansible 运行 Ansible 直接执行一些命令,可以快速输入命令执行,同时不保存命令,相对于剧本形式,属于临时性,简短操作。
  • Playbook模式:剧本模式,是Ansible主要管理方式,也是Ansible功能强大的关键所在。playbook通过多个task集合完成一类功能,如Web服务的安装部署、数据库服务器的批量备份等。可以简单地把playbook理解为通过组合多条Ad-Hoc操作的配置文件。

特点

  • 部署简单,只需在主控端部署Ansible环境,被控端保持使用环境,无需安装额外软件
  • 默认使用SSH协议对设备进行管理
  • 有大量常规运维操作模块,可实现日常绝大部分操作
  • 配置简单、功能强大、扩展性强
  • 支持API及自定义模块,可通过Python轻松扩展
  • 通过Playbooks来定制强大的配置、状态管理
  • 轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可
  • 提供一个功能强大、操作性强的Web管理界面和REST API接口——Ansible Tower
  • YAML格式,编排任务,支持丰富的数据结构

注意事项

  • 执行ansible的主机一般称为主控端,中控,master或堡垒机
  • 主控端Python版本需要2.6或以上
  • 被控端Python版本小于2.4需要安装python-simplejson
  • 被控端如开启SELinux需要安装libselinux-python
  • windows不能做为主控端

Ansible架构

ansible查找文件并删除 ansible文档_Ansible


Ansible架构:

  • Host Inventory:记录了每一个由Ansible管理的主机信息,信息包括ssh端口,root帐号密码,ip地址等
  • Playbooks:剧本,YAML格式文件,多个任务定义在一个文件中,定义主机需要调用哪些模块来完成的功能
  • Ansible:Ansible的核心程序
  • Core Modules:核心模块,ansible通过模块功能管理远端Host
  • Custom Modules:自定义模块,完成Ansible核心模块无法完成的功能
  • Connection Plugins: 连接插件,通过定义可用的传输类型,使Ansible和Host通信
  • Plugins:通过插件来实现记录日志,发送邮件或其他功能

主要功能

ansible查找文件并删除 ansible文档_Ansible_02

  • PLAYBOOKS:任务剧本(任务集),编排定义Ansible任务集的配置文件,由Ansible顺序依次执行,通常是JSON格式的YML文件
  • ANSIBLE:组合INVENTORY、 API、 MODULES、PLUGINS的绿框,可以理解为是ansible命令工具集,其为核心执行工具
  • INVENTORY:Ansible管理主机的清单/etc/anaible/hosts
  • MODULES:Ansible执行命令的功能模块,多数为内置的核心模块,也可自定义,ansible-doc –l 可查看模块
  • PLUGINS:模块功能的补充,如连接类型插件、循环插件、变量插件、过滤插件等,该功能不常用
  • API: 供第三方程序调用的应用程序编程接口

相关文件

/usr/bin/ansible						#命令行工具
/usr/bin/ansible-doc					#帮助文档
/usr/bin/ansible-playbook				#剧本执行工具
/usr/bin/ansible-galaxy					#下载/上传优秀代码或Roles模块的官网平台
/usr/bin/ansible-pull					#远程执行命令的工具
/usr/bin/ansible-vault					#文件加密工具
/usr/bin/ansible-console				#基于Console界面与用户交互的执行工具

/etc/ansible/ansible.cfg				#主配置文件
/etc/ansible/hosts						#管理的主机清单
/etc/ansible/roles						#角色存放处

安装

1.配置一个epel源,epel中包含了ansible的安装软件,可以直接使用yum安装
2.epel阿里源:https://developer.aliyun.com/mirror/epel?spm=a2c6h.13651102.0.0.3e221b11Kh7GZj

[root@node1 yum.repos.d]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
#根据阿里云的提示,直接安装下载repo文件,导入源地址
[root@node1 yum.repos.d]# yum repolist
……
epel            epel                  13,200
……
#配置好epel源,可以查看到资源,直接安装
[root@node1 yum.repos.d]# yum install -y ansible
……
Installed:
  ansible.noarch 0:2.9.3-1.el7                                                                                                                  

Dependency Installed:
  PyYAML.x86_64 0:3.10-11.el7              libyaml.x86_64 0:0.1.4-11.el7_0                             python-babel.noarch 0:0.9.6-8.el7      
  python-backports.x86_64 0:1.0-8.el7      python-backports-ssl_match_hostname.noarch 0:3.5.0.1-1.el7  python-cffi.x86_64 0:1.6.0-5.el7       
  python-enum34.noarch 0:1.0.4-1.el7       python-httplib2.noarch 0:0.9.2-0.2.el7                      python-idna.noarch 0:2.4-1.el7         
  python-ipaddress.noarch 0:1.0.16-2.el7   python-jinja2.noarch 0:2.7.2-2.el7                          python-markupsafe.x86_64 0:0.11-10.el7 
  python-paramiko.noarch 0:2.1.1-0.10.el7  python-ply.noarch 0:3.4-11.el7                              python-pycparser.noarch 0:2.14-1.el7   
  python-setuptools.noarch 0:0.9.8-7.el7   python2-cryptography.x86_64 0:1.7.2-2.el7                   python2-jmespath.noarch 0:0.9.0-1.el7  
  python2-pyasn1.noarch 0:0.1.9-7.el7      sshpass.x86_64 0:1.06-1.el7                                

Complete!
#安装完成,自动下载安装相关依赖软件包

相关文件

配置文件ansible.cfg

配置文件使用

  1. ansible.cfg配置文件是以ini格式存储配置数据的
  2. ansible.cfg配置文件可以存放在不同的目录,但只有一个可用,在运行Ansible命令时,Ansible将会按照预先设定的顺序查找配置文件
  3. ansible配置文件查找顺序(从上至下,先找到哪个文件就用哪个文件)
  • ANSIBLE_CONFIG:首先,Ansible命令会检查环境变量,及这个环境变量将指向的配置文件
  • ./ansible.cfg:其次,将会检查当前目录下的ansible.cfg配置文件
  • ~/.ansible.cfg:然后,将会检查当前用户home目录下的.ansible.cfg配置文件
  • /etc/ansible/ansible.cfg:最后,将会检查在用软件包管理工具安装Ansible时自动产生的配置文
  1. 建议使用~/.ansible.cfg作为配置文件,这样就可以实现每个用户都有自己独自的配置文件,不污染其它用户正常使用Ansible,同时也方便进行选项配置
  2. 几乎所有的配置项都可以通过Ansible的playbook或环境变量来重新赋值

配置文件内容

[root@node1 ansible]# cat ansible.cfg | grep ^[^#]
[defaults] 				#定义常规默认的配置,如:定义文件路径、设置并发连接数、设置sudo用户、是否开启sudo功能等等
#inventory      = /etc/ansible/hosts                        #被控端的主机列表文件
#library        = /usr/share/my_modules/                    #模块文件存放路径
#remote_tmp     = ~/.ansible/tmp                            #远程主机临时文件存放目录
#local_tmp      = ~/.ansible/tmp                            #管理节点临时文件存放目录
#forks          = 5                                         #默认开启的并发数
#poll_interval  = 15                                        #默认轮询时间间隔(单位秒)
#sudo_user      = root                                      #默认sudo用户
#ask_sudo_pass = True                                       #是否提示输入sudo密码
#ask_pass      = True                                       #是否提示输入密码
#transport      = smart                                     #远程传输模式
#remote_port    = 22                                        #默认远程主机的端口号
#module_lang    = C											#模块运行默认语言环境
#gathering = implicit										#facts信息收集开关定义 smart|implicit|explicit
roles_path    = /etc/ansible/roles:/usr/share/ansible/roles	#指定role存放路径
#timeout = 10												#SSH连接超时时间
#remote_user = root											#ansible远程认证用户
#log_path = /var/log/ansible.log							#ansible日志记录文件
#module_name = command										#ansible默认执行模块command
#executable = /bin/sh										#ansible命令执行shell为/bin/sh
#hash_behaviour = replace									#ansible主机变量重复处理方式replace(默认)|merge
#private_role_vars = yes									#默认情况下,角色中的变量将在全局变量范围中可见。 为了防止这种情况,可以启用以下选项,只有tasks的任务和handlers得任务可以看到角色变量
#vault_password_file = /path/to/vault_password_file			#指定vault密码文件路径
#ansible_managed = Ansible managed							#定义的一个Jinja2变量,可以插入到Ansible配置模版系统生成的文件中
#display_skipped_hosts = True								#开启显示跳过的主机
#error_on_undefined_vars = False							#开启错误,或者没有定义的变量
# set plugin path directories here, separate with colons	#设置相关插件路径,使用‘:’分割多个路径
#action_plugins     = /usr/share/ansible/plugins/action
#cache_plugins      = /usr/share/ansible/plugins/cache
#callback_plugins   = /usr/share/ansible/plugins/callback
#connection_plugins = /usr/share/ansible/plugins/connection
#lookup_plugins     = /usr/share/ansible/plugins/lookup
#inventory_plugins  = /usr/share/ansible/plugins/inventory
#vars_plugins       = /usr/share/ansible/plugins/vars
#filter_plugins     = /usr/share/ansible/plugins/filter
#test_plugins       = /usr/share/ansible/plugins/test
#terminal_plugins   = /usr/share/ansible/plugins/terminal
#strategy_plugins   = /usr/share/ansible/plugins/strategy
#fact_caching = memory										#定义ansible facts缓存方式memory
#fact_caching_connection=/tmp								#定义ansible facts缓存路径/tmp
[inventory]				#设置插件及可忽略的文件格式
[privilege_escalation]	#用户权限类的设定,如:sudo、是否启用sudo密码
[paramiko_connection]	#不记录遇到的新主机密钥、增加新主机的性能
[ssh_connection]		#对SSH连接的一些配置,配置项比较少
[persistent_connection]	#主要就两个选项,连接超时、命令超时
[accelerate]			#连接加速的相关配置
[selinux]				#selinux相关配置,基本不会涉及
[colors]				#设置输出颜色,最好默认
[diff]					#输出打印是是否打印diff

资源清单(inventory)hosts文件

  1. inventory:资源清单,在大规模的配置管理工作中,特别是云服务提供商或者IDC厂家,需要管理不同业务的不同机器,这些机器的信息都存放在Ansible的inventory组件里面。在我们使用Ansible进行远程主机管理时,必须先将主机信息存放在inventory里面,这样才能使用Ansible对它进行操作。默认情况下,Ansible的inventory是一个静态的INI格式的文件,可以通过在配置文件中的inventory选项,进行相关设置。当然了,我们还可以通过ANSIBLE_HOSTS环境变量指定或者运行ansible和ansible-playbook的时候用-i参数临时设置。
  2. /etc/ansible/hosts默认安装软件生成的资源清单模板,可以直接使用,也可另外创建文件(设置指定路径)

inventory定义内容

  1. 定义主机、主机变量
#可以直接使用IP地址定义主机
12.12.1.1
12.12.12.1:8080				#可指定端口
#可以使用域名,但是要有解析
www.test.org
server1

#定义有规律的主机名称
server[1:100]				#指定server1~server100的主机
node[a:f]					#指定nodea|nodeb|nodec|nodee|nodef主机

#给每个主机的变量:(选择连接类型和用户)
localhost              ansible_connection=local
server1     ansible_connection=ssh        ansible_user=root
server2     ansible_connection=ssh        ansible_user=test
  1. 定义主机组、组变量
#没有分类的主机,默认组ungrouped

#通过使用【name】定义主机组,将主机分类
[httpd]
server1
1.1.1.1
[nginx]
server2
2.2.2.2

#通过使用【name:children】定义主机组的父亲组,‘children’是固定写法
[web:children]					#定义父亲组父亲组包含所有主机
httpd
nginx

#可以通过组变量方式,给所有组内主机设置统一变量
[web:vars]
ntp_server=ntp.test.example.com
proxy=proxy.test.example.com

注意:
1.作为子组成员的任何主机自动是父组的成员
2.子组的变量将具有较高的优先级(覆盖)父组的变量

  1. 目录方式定义主机及组
/etc/ansible/inventory/									#创建了inventory目录,和httpd与nginx两个文件
|---httpd
|---nginx

vim /etc/ansible/inventory/httpd
[httpd]															#分组名
1.1.1.1
server1
vim /etc/ansible/inventory/nginx
[nginx]
2.2.2.2
servers2
  1. inventory中可定义的变量参数
ansible_ssh_host				#定义主机的ssh地址
ansible_ssh_port				#定义主机的ssh端口
ansible_ssh_user				#定义主机的ssh认证用户
ansible_ssh_pass				#定义主机的ssh认证密码
ansible_sudo					#定义主机的sudo用户
ansible_sudo_pass				#定义主机的sudo密码
ansible_sudo_exe				#定义主机的sudo路径
ansible_connection				#定义主机连接方式;与主机的连接类型.比如:local,ssh或者paramiko;Ansible 1.2以前默认使用paramiko。1.2以后的版本默认使用‘smart’,‘smart’方式会根据是否支持ControlPersist,来判断ssh方式是否可行
ansible_ssh_private_key_file	#定义主机私钥文件
ansible_shell_type				#定义主机shell类型
ansible_python_interpreter		#定义主机python解释器路径
  1. 分文件定义变量
    inventory主文件中保存所有的变量并不是最佳方式,还可以保存在独立的文件中
#通过组、主机形式定义变量
/etc/ansible/group_vars/httpd		#定义指定组的变量
/etc/ansible/group_vars/web			#定义指定父亲组的变量
/etc/ansible/host_vars/server1		#定义指定主机变量

#变量太多时,分文件定义细化的变量进行管理
/etc/ansible/group_vars/httpd/db_settings			#数据库相关变量定义
/etc/ansible/group_vars/httpd/cluster_settings		#集群相关变量定义

相关命令

ansible

#ansible的主要命令
ansible <host-pattern> [options]
options:
-a									#指定模块的参数
--version             				#显示版本
-f									#fork多少进程并发处理,默认为5个
-m module               			#指定使用的模块,默认为command
-v                      			#查看执行的详细过程(-vv、-vvvv更详细)
-i									#指定hosts文件路径,默认default=/etc/ansible/hosts
-I									#指定pattern,对已匹配的主机中再过滤一次
--list-hosts            			#显示主机列表(可以简写为--list)
-k,--ask-pass           			#提示输入ssh连接密码,默认使用key验证
-K,--ask-become-pass    			#提示执行输入sudo的密码
-C,--check              			#检查,并不执行
-c									#设置连接类型(default=smart)
-T,--timeout=TIMEOUT   			 	#执行命令的超时时间,默认10s
-t									#日志输出到该目录,日志文件名以主机命名
-u,--user=REMOTE_USER  				#指定远程执行的执行用户,若不指定用户,则使用当前用户身份
-U									#sudo到哪个用户,默认为root
-b,--become             			#代替旧版本的sudo切换
-h,--help               			#显示帮助信息
-s									#sudo运行
-o									#压缩输出,摘要输出

ansible命令在主要是与模块联动使用的

ansible-doc

#ansible-doc:查看ansible模块(插件)文档说明,针对每个模块都有详细的用法说明,功能和Linux的man命令类似
ansible-doc [-l|-F|-s] [options] [-t <plugin type> ] [plugin]
options:
-a, --all                                   #显示文档所有的模块
-h, --help                                  #显示帮助信息
-j, --json                                  #将所有的模块转储为JSON格式
-l, --list                                  #查看模块列表
-F, --list_files                            #显示模块的名称和模块原路径
-M MODULE_PATH, --module-path=MODULE_PATH   #模块路径
-s, --snippet                               #简介的显示模块的帮助信息
-t TYPE, --type=TYPE                        #指定模块类型(默认为module)
-v, --verbose                               #查看执行的详细过程(-vv、-vvvv更详细)
--version                                   #查看版本

ansible-playbook

#ansible-playbook:运行Ansible剧本,在目标主机上执行定义的任务
ansible-playbook [options] playbook.yml [playbook2 ...]
options:
#大部分的参数和ansible的参数一致

ansible-galaxy

#ansible-galaxy:下载/上传优秀代码或Roles模块的官网平台(https://galaxy.ansible.com)
ansible-galaxy [delete|import|info|init|install|list|login|remove|search|setup] [--help] [options] ...
options:
-h, --help                          #查看帮助信息
-c, --ignore-certs                  #忽略SSL证书验证错误
-s API_SERVER, --server=API_SERVER  #API服务器地址         
-v, --verbose                       #查看执行的详细过程(-vv、-vvvv更详细)                  
--version                           #查看版本

ansible-config

#ansible-config:查看,编辑管理ansible的配置文件
ansible-config [view|dump|list] [--help] [options] [ansible.cfg]
list            #打印所有配置选项
dump            #备份配置信息
view            #查看配置文件
options:
-c CONFIG_FILE, --config=CONFIG_FILE    #指定配置文件所在的路径
-h, --help                              #查看帮助信息
-v, --verbose                           #查看执行的详细过程(-vv、-vvvv更详细) 
--version                               #查看版本

ansible-inventory

#ansible-inventory:查看被控制端主机清单的详细信息默认情况下它使用库存脚本,返回JSON格式
ansible-inventory [options] [host|group]
options:
--ask-vault-pass      #询问vault密码
--output OUTPUT_FILE  #将显示信息输出在指定文件中
--toml                #使用TOML格式显示
-h, --help            #显示帮助信息
-i INVENTORY  		  #指定invetniory文件
-y, --yaml            #使用yaml格式显示
-v, --verbose         #查看执行的详细过程(-vv、-vvvv更详细)
--version             #查看版本
[root@node1 ~]# ansible-inventory --list
{
    "_meta": {
        "hostvars": {}
    }, 
    "all": {
        "children": [
            "ungrouped"
        ]
    }
}

ansible-vault

#ansible-vault主要用于配置文件的加密,如编写的playbook配置文件中包含敏感的信息,不希望其他人随便的看,ansible-vault可加密/解密这个配置文件
ansible-vault [create|decrypt|edit|encrypt|encrypt_string|rekey|view] [options] [vaultfile.yml]
create			#创建
decrypt			#解密
edit			#编辑
encrypt			#加密
rekey			#修改密码
view			#查看
options:
--ask-vault-pass     								#询问vault密码
-h, --help                                          #查看帮助信息
--new-vault-id=NEW_VAULT_ID                         #设置用于rekey的新vault标识
--new-vault-password-file=NEW_VAULT_PASSWORD_FILE   #新的保险库密码文件为rekey
--vault-id=VAULT_IDS                                #要使用的保险库标识
--vault-password-file=VAULT_PASSWORD_FILES          #库密码文件
-v, --verbose                                       #查看执行的详细过程(-vv、-vvvv更详细)
--version                                           #查看版本