一 安装

1.1 ansible架构

ansible是一个非常简单的自动化部署项目,由python编写并且开源。用于提供自动化云配置、配置文件管理、应用部署、服务编排和很多其他的IT自动化需求。

ansible实现的自动化部署是多层次的,通过描述系统之间的逻辑关系来构建业务所需要的基础架构模型,而不仅仅用于管理一个单独的系统;也就是说ansible不仅仅能部署一个或多个独立的服务,它还能对这些服务做关联、对部署顺序做编排等,一个完美的ansible部署项目应该是层次分明、顺序有秩的。

另外,ansible是Serverless和Agentless项目,在部署工具准备阶段基本上是零成本,而且ansible使用YAML写playbooks,这使playbook看起来通俗易懂,一目了然。

ansible这个后起之秀在开源社区上也是非常火爆的,可以说是部署工具届的网红一枚。现在很多很火的开源项目都在使用ansible作为部署工具,例如我熟悉的openstack-ansible、openshift-ansible等等

架构图:

通过架构图我们可以看到ansible主要由以下部分组成:

Core Modules

核心模块,每个模块可以看成是一个小程序,用于实现具体的部署动作,也能指定被纳管服务的期望状态。

Custom Modules

自定义模块,与核心模块相似,不同之处在于人家是官方的,自己是民间(自定义)的。

Plugins

是为了增强ansible核心功能的代码片段,可以将其看作为一个函数,作用范围小,很实用。

Inventory

一个文件(INI类型)或者目录,主要作用是配置被纳管的主机和主机组,如果是目录也可以放置组变量group_vars和主机变量host_vars

Playbooks

用于存放play,每个play可以对指定的主机或主机组进行批量的部署动作,上面说到的服务的部署、关联、编排就是在playbook内实现的。

Connection Plugins

控制节点与被纳管节点的通讯插件,linux系统默认使用SSH进行通讯。

1.2 节点安装

被管理节点安装

依赖于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

二 配置文件

2.1 配置文件位置

ansible配置文件可以存放在不同地方,按优先级由高到低排序:

  • 命令行-c 或 --config指定的配置文件路径
  • 环境变量ANSIBLE_CONFIG
  • 执行playbook所在目录下的ansible.cnf
  • 当前执行用户家目录下.ansible.cnf(即~/.ansible.cnf)
  • 默认配置文件存放路径/etc/ansible/ansible.cnf

当我们执行playbook时,ansible会按照上面列表的路径依次查找,如果高优先级的文件被找到则会被使用。

查看当前正在使用的配置文件路径:

➜  lab-ansible ansible --version
ansible 2.5.
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./libexec/lib/python2./site-packages/ansible
executable location = /usr/local/bin/ansible
python version = 2.7. (default, Apr , ::) [GCC 4.2. Compatible Apple LLVM 9.0. (clang-900.0.)]

2.2 配置文件参数

因配置文件参数太多,下面只列举一些比较常用的参数;表格中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

3.1 主机与主机组

主机和主机组

我们可以将inventory定义为一个INI文件或YAML类型的文件,文件里面可以定义主机和主机组,以INI类型文件为例:

node1
node2
[first_group]
node1
[second_group]
node2
[nodes]
node1
node2
node[:]
node[a:f]

上面的示例可以看出:

  • 节点可以单独定义,不从属于任何组
  • 连续数字或字母的主机可以使用[]扩起来表示
  • 同一个主机是可以从属不同主机组的

默认主机组

ansible默认有两个主机组:all和ungrouped,all组包含所有主机,ungrouped包含的主机只属于all组且不属于其他任何一组。自定义组、all组、ungrouped组关系如图:

主机组的继承 

主机组是可以继承的,写法如下:

[A_group]
node1
node2 [B_group:children]
A_group

上面示例中B组继承了A组,A组的变量定义在B组内同样可以使用。

关于主机组的继承要记住的知识点:

  • all组是任何主机组的父主机组
  • 主机组继承,对应的主机变量和组变量也会继承,如果变量冲突,子主机组的变量会覆盖父主机组的变量

变量

ansible能够定义变量的地方可以很多,所有的变量都可以归类为主机变量或组变量。

主机变量是针对某个主机的,例如:

[web]
web1 http_port = maxRequestsPerChild =
web2 http_port = maxRequestsPerChild =

组变量是针对某个主机组的,例如:

[db]
db1
db2 [db:vars]
db_port =
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.2 动态inventory

在3.1章节中我们介绍和使用的都是静态inventory,ansible也可以使用动态incentory,那么动态inventory是什么呢?

动态inventory是指可以从一个公共仓库pull下来,简单配置一些参数后就能直接使用的inventory。因为动态inventory是对某一项目的通用模版,所以这种类型的inventory通常在大型的开源项目比较常用。例如:AWS EC2, Cobbler,  OpenStack等等。

动态inventory pull下来后是一个python脚本,可以通过添加执行权限后./xxx.py --list查看都包含哪些主机。

关于动态inventory,这里不在扩展。如果有机会,在后续的ansible进阶章节在着重介绍。

四 Ad Hoc 命令

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= >>
node2 node1 | SUCCESS | rc= >>
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基础-变量”会详细阐述。

五 本节应该掌握的技能

  • 使用ansible前控制节点和被纳管节点环境需求,会安装部署ansible
  • 配置文件可以存在的位置和常用的配置文件参数的含义
  • 会写inventory,掌握inventory目录结构和各文件作用
  • 简单了解动态inventory的概念
  • 会使用ansible命令对目的主机批量处理
  • 会使用常用的Core Module

六 参考链接

  • https://docs.ansible.com/ansible/2.5/dev_guide/overview_architecture.html
  • https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html
  • https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html
  • https://docs.ansible.com/ansible/latest/user_guide/intro_dynamic_inventory.html#intro-dynamic-inventory

欢迎大家关注我的公众号:

ansible基础-安装与配置的更多相关文章

  1. Ansible详解(一)基础安装和配置

    ansible 是一款轻量级自动化运维工具,由的 Python 语言开发,结合了多种自动化运维工具的特性,实现了批量系统配置,批量程序部署,批量命令执行等功能; ansible 是基于模块化实现批量操 ...

  2. ansible基础☞安装方法

    一 需要安装些什么 Ansible默认通过 SSH 协议管理机器. 安装Ansible之后,不需要启动或运行一个后台进程,或是添加一个数据库.只要在一台电脑(可以是一台笔记本)上安装好,就可以通过这台 ...

  3. Centos 7.2基础安装和配置(含分区方案建议)

    景:windows桌面运维为主的我,前几天接到一个去某客户上架安装服务器的工作任务,含糊的说要上架几台服务器顺便安装Centos系统,于是我便下载了一个Centos7.2版本的镜像,顺利的用USBwr ...

  4. Ubuntu 16.04 LTS nodejs+pm2+nginx+git 基础安装及配置环境(未完,未整理)

    -.Ubuntu 安装nodejs 以下内容均在命令行,完成,首先你要去你电脑的home目录:cd ~. [sudo] apt-get update [sudo] apt-get upgrade ap ...

  5. ansible基础-理解篇

    1. 介绍 要说现在的部署工具,ansible可以说家喻户晓了. ansible是一个开源软件,用于软件供应.配置管理.应用部署.ansible可以通过SSH.remote PowerShell.其他 ...

  6. Ansible 安装与配置(一)

    公司大概有200多云主机需要进行管理,但是如果通过手工管理费时还累最终结果也容易出错,所以考虑通过自动化的方式来管理云主机,目前开源的自动化工具,大家用的比较多的有Ansible和Saltstack这 ...

  7. SaltStack安装及配置

    1.简介SaltStack是一个服务器基础架构集中化管理平台,具备配置管理.远程执行.监控等功能,一般可以理解为简化版的puppet和加强版的func.SaltStack基于Python语言实现,结合 ...

  8. ansible基础配置

    1.基础配置 1.1.环境 主机配置 ansible版本:2.7.4 控制端:centos7.4,IP:192.168.1.213,主机名:operation 被控制端: centos6.5,IP:1 ...

  9. OpenVAS漏洞扫描基础教程之OpenVAS概述及安装及配置OpenVAS服务

    OpenVAS漏洞扫描基础教程之OpenVAS概述及安装及配置OpenVAS服务   1.  OpenVAS基础知识 OpenVAS(Open Vulnerability Assessment Sys ...

随机推荐

  1. Scrapy 1.4 文档 01 初窥 Scrapy

    初窥 Scrapy Scrapy 是用于抓取网站并提取结构化数据的应用程序框架,其应用非常广泛,如数据挖掘,信息处理或历史存档. 尽管 Scrapy 最初设计用于网络数据采集(web scraping ...

  2. Spring Boot ConfigurationProperties validate

    使用@Query可以在自定义的查询方法上使用@Query来指定该方法要执行的查询语句,比如:@Query("select o from UserModel o where o.uuid=?1 ...

  3. LoadRunner 11 中Analysis分析

    原文:http://www.cnblogs.com/Chilam007/p/6445165.html analysis简介 分析器就是对测试结果数据进行分析的组件,它是LR三大组件之一,保存着大量用来 ...

  4. FPGA学习笔记(一)——初识FPGA

    ###### [该随笔部分内容转载自小梅哥]       ######### FPGA(Field-Programmable Gate Array,现场可编程门阵列),正如其名,FPGA内部有大量的可 ...

  5. 快速EDAS字体嵌入问题

    在用edas向国际会议投稿的时候,往往要检查pdf稿件的格式,例如页边距.行距.字体等.经常碰到的一个问题就是字体未嵌入到文件中.因为大家一般用CTex里面的ps2pdf生成pdf文件,图片中的字往往 ...

  6. 安装ipset车祸现场

    基础环境centos6.8内核2.6.32. 本身服务器带的是6.11ipset版本,业务需求,需要升级到6.32 ipset-6.32 ./configure 报错 configure: error ...

  7. Python三元运算

    result = 值1 if 条件 else 值2 如果条件为真,result = 值1 如果条件为假, result = 值2.

  8. BZOJ_4530_[Bjoi2014]大融合_LCT

    BZOJ_4530_[Bjoi2014]大融合_LCT Description 小强要在N个孤立的星球上建立起一套通信系统.这套通信系统就是连接N个点的一个树. 这个树的边是一条一条添加上去的.在某个 ...

  9. 处理php出现default timezone抖动的问题

    懒癌发作1年多,再次回来写随笔.(上次是16年,再上次是13年,好像懒的没救了) 这回遇到一个系统前端展现的时间在无规律抖动的问题: 前端php环境是5.3,运行于apache上,php.ini中已经 ...

  10. java编写词法分析器

    词法分析器就是通过扫描一段程序判断是否是关键字.标识符.常数.分界符.运算符.一般分为一符一种和经典五中: 这里我用的是经典五中,此词法分析器是用java编写的: /* 保留字|关键字:1 操作符|运 ...