ansible是一个很是简单的自动化部署项目,由python编写而且开源。用于提供自动化云配置、配置文件管理、应用部署、服务编排和不少其余的IT自动化需求。html
ansible实现的自动化部署是多层次的,经过描述系统之间的逻辑关系来构建业务所须要的基础架构模型,而不只仅用于管理一个单独的系统;也就是说ansible不只仅能部署一个或多个独立的服务,它还能对这些服务作关联、对部署顺序作编排等,一个完美的ansible部署项目应该是井井有条、顺序有秩的。node
另外,ansible是Serverless和Agentless项目,在部署工具准备阶段基本上是零成本,并且ansible使用YAML写playbooks,这使playbook看起来通俗易懂,一目了然。python
ansible这个后起之秀在开源社区上也是很是火爆的,能够说是部署工具届的网红一枚。如今不少很火的开源项目都在使用ansible做为部署工具,例如我熟悉的openstack-ansible、openshift-ansible等等linux
架构图:web
经过架构图咱们能够看到ansible主要由如下部分组成:小程序
Core Moduleswindows
核心模块,每一个模块能够当作是一个小程序,用于实现具体的部署动做,也能指定被纳管服务的指望状态。centos
Custom Modules服务器
自定义模块,与核心模块类似,不一样之处在于人家是官方的,本身是民间(自定义)的。架构
Plugins
是为了加强ansible核心功能的代码片断,能够将其看做为一个函数,做用范围小,很实用。
Inventory
一个文件(INI类型)或者目录,主要做用是配置被纳管的主机和主机组,若是是目录也能够放置组变量group_vars和主机变量host_vars
Playbooks
用于存放play,每一个play能够对指定的主机或主机组进行批量的部署动做,上面说到的服务的部署、关联、编排就是在playbook内实现的。
Connection Plugins
控制节点与被纳管节点的通信插件,linux系统默认使用SSH进行通信。
被管理节点安装
依赖于python环境,python版本应该知足2.6或2.7或>=3.5与控制节点的通信服务,一般是sshd服务
控制节点安装
python环境需求同被管理节点一致,windows不能做为控制节点
支持的操做系统包括但不限于Red Hat, Debian, CentOS, OS X, BSDs
安装方式根据操做系统的不一样而定,比较简单,以centos为例,配置好yum源后能够经过命令yum install ansible -y进行安装。其余类型操做系统不一一列举了,能够参考官方文档https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html
ansible配置文件能够存放在不一样地方,按优先级由高到低排序:
当咱们执行playbook时,ansible会按照上面列表的路径依次查找,若是高优先级的文件被找到则会被使用。
查看当前正在使用的配置文件路径:
➜ lab-ansible ansible --version ansible 2.5.2 config file = /Users/weim/DevOps/lab-ansible/ansible.cfg configured module search path = [u'/Users/weim/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules'] ansible python module location = /usr/local/Cellar/ansible/2.5.2/libexec/lib/python2.7/site-packages/ansible executable location = /usr/local/bin/ansible python version = 2.7.14 (default, Apr 27 2018, 19:33:14) [GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.37)]
因配置文件参数太多,下面只列举一些比较经常使用的参数;表格中defaults/inventory表明[defaults]章节下的inventory参数,其余依此类推
参数 | 含义 |
defaults/inventory | inventory文件(夹)路径,默认值/etc/ansible/hosts |
defaults/roles_path | roles文件路径,默认值/etc/ansible/roles |
defaults/remote_user | 指定链接被管理主机的用户,默认值root |
defaults/forks | 同一时间操做目的主机的数量,默认值5 |
defaluts/remote_port | 目的主机远程链接的端口,默认值22 |
defaults/timeout | 链接目的主机的超时时间,默认值10 |
privilege_escalation/become | 是否容许当前执行用户提高权限,默认值True |
privilege_escalation/become_method | 提权使用的方法,默认值sudo |
privilege_escalation/become_user | 当defaults/remote_user不是root用户时,该用户提权后所变成的用户,默认值root |
privilege_escalation/become_ask_pass | 提权时是否要交互式输入密码,默认值False |
主机和主机组
咱们能够将inventory定义为一个INI文件或YAML类型的文件,文件里面能够定义主机和主机组,以INI类型文件为例:
node1 node2 [first_group] node1 [second_group] node2 [nodes] node1 node2 node[3:10] node[a:f]
上面的示例能够看出:
默认主机组
ansible默认有两个主机组:all和ungrouped,all组包含全部主机,ungrouped包含的主机只属于all组且不属于其余任何一组。自定义组、all组、ungrouped组关系如图:
主机组的继承
主机组是能够继承的,写法以下:
[A_group]
node1
node2
[B_group:children]
A_group
上面示例中B组继承了A组,A组的变量定义在B组内一样可使用。
关于主机组的继承要记住的知识点:
变量
ansible可以定义变量的地方能够不少,全部的变量均可以归类为主机变量或组变量。
主机变量是针对某个主机的,例如:
[web] web1 http_port = 8080 maxRequestsPerChild = 404 web2 http_port = 80 maxRequestsPerChild = 404
组变量是针对某个主机组的,例如:
[db] db1 db2 [db:vars] db_port = 3306 bind_ip = 127.0.0.1
变量的分离
生产上若是有大规模的服务器,那么将变量和主机定义写在一块儿就不太合适了,根据需求咱们能够将变量写在单独的文件中。
主机变量能够放在inventory/host_vars目录,组变量能够放在inventory/group_vars目录,ansible会经过主机名与host_vars目录下的文件名称来识别哪一个文件存放的是该主机的变量;同理,主机组也是经过组名和文件名称来对应关系。
可能有点蒙圈,看个例子就懂了:
inventory目录结构:
.
├── group_vars
│ ├── all.yml
│ ├── db.yml
│ └── web.yml
├── host_vars
│ ├── web1.yml
│ └── web2.yml
└── hosts
hosts文件内容以下:
[web]
web1
web2
[db]
db1
db2
上述示例中,咱们能够看到:
group_vars下的web.yml和db.yml分别对应hosts文件中定义的web和db组,由于all组是默认全部组的父组,因此all.yml也是web组和db组的变量定义文件,若是与db.yml和web.yml变量定义有冲突,db和web有效。
同理,host_vars下的web1.yml 和 web2.yml 分别是web1和web2主机的变量定义,若是与group_vars下的web.yml变量有冲突,host_vars目录下的变量定义有效。
变量的优先级
在inventory文件内,若是变量定义冲突,那么优先级是这样的:
在3.1章节中咱们介绍和使用的都是静态inventory,ansible也可使用动态incentory,那么动态inventory是什么呢?
动态inventory是指能够从一个公共仓库pull下来,简单配置一些参数后就能直接使用的inventory。由于动态inventory是对某一项目的通用模版,因此这种类型的inventory一般在大型的开源项目比较经常使用。例如:AWS EC2, Cobbler, OpenStack等等。
动态inventory pull下来后是一个python脚本,能够经过添加执行权限后./xxx.py --list查看都包含哪些主机。
关于动态inventory,这里不在扩展。若是有机会,在后续的ansible进阶章节在着重介绍。
在ansible基础-理解篇中,笔者已经阐述过,ansible相对于puppet有一个优点,就是CLI更加丰富,除了让ansible执行写好的playbook外,咱们也可使用ansible命令对指定的主机或主机组执行批量的动做,这里要注意一下,ansible命令可使用Core Modules,可是inventory里定义的主机变量和组变量不能生效。
命令帮助以下:
➜ inventory ansible --help Usage: ansible <host-pattern> [options]
若是不用-m指定模块,ansible命令默认使用command模块。
示例1: 查看nodes主机组的主机名
➜ lab-ansible ansible nodes -a 'hostname' node2 | SUCCESS | rc=0 >> node2 node1 | SUCCESS | rc=0 >> node1
ansible命令也能够指定不少附加参数,例如指定remote_user(- u)、forks数量(- f)、提权(-b)、提权是否要输入密码(--ask-become-pass)等等,其余参数请使用ansible --help命令查看。
示例2: 使用copy模块将本地test.txt文件拷贝到目的主机/etc/test.txt,设定使用student用户登录,而且要求提权,提权方式为sudo,要求交互式输入提权密码。
➜ lab-ansible ansible nodes -m copy -a 'src=./test.txt dest=/etc/test.txt' --user=student --become --become-user=root --become-method=sudo --ask-sudo-pass
命令行传入的参数优先级是最高的,包括链接参数和变量,关于变量优先级,在后续的“ansible基础-变量”会详细阐述。
欢迎你们关注个人公众号: