柴少的官方网站 技术在学习中进步,水平在分享中升华

ansible的介绍与安装(一)

一、 ansible介绍

       ansible是基于python开发的,实现了批量系统配置、批量程序部署、批量运行命令等功能。ansible是基于模块工作的,ansible本身没有批量部署的能力,ansible只提供一个框架,通过ansbile所运行的模块实现批量部署的功能。

       ansible的Ansible概念:

       这些概念对于Ansible的所有用法都是通用的。 你需要了解它们,才能将Ansible用于任何类型的自动化。

       Control node:任何安装了Ansible的计算机。 你可以通过从任何控制节点调用ansible或ansible-playbook命令来运行Ansible命令和剧本。 你可以将安装了Python的任何计算机用作控制节点-便携式计算机,共享台式机和服务器都可以运行Ansible。 但是,不能将Windows计算机用作控制节点。 你可以有多个控制节点。

       Managed nodes:你使用Ansible管理的网络设备(and/or servers)。 受管节点有时也称为“hosts”。 未在受管节点上安装Ansible。

       Inventory:受管节点的列表。 清单文件有时也称为“hostfile”。 你的清单可以为每个受管节点指定诸如IP地址之类的信息。 inventory还可以组织受管节点,创建和嵌套组以便于扩展。 

       Collections:Collections是Ansible内容的分发格式,可以包括playbooks, roles, modules, and plugins。 你可以通过Ansible Galaxy安装和使用collections 。 

       Modules:执行代码单元Ansible。 从管理特定类型的数据库上的用户到管理特定类型的网络设备上的VLAN接口,每个模块都有特定的用途。 你可以通过任务调用单个模块,也可以在剧本中调用多个不同的模块。 从Ansible 2.10开始,模块在collections中分组。

       Tasks:Ansible中的行动单位。 你可以使用临时命令一次执行一个任务。

       Playbooks:保存任务的有序列表,以便你可以按该顺序重复运行这些任务。 剧本可以包含变量以及任务。 剧本采用YAML编写,易于阅读,编写,共享和理解。 

       ansible的特点:

       (1). 不安装客户端,不需要mq,没有服务器端,不需要启动任何服务,只需要在ansible服务器上面执行命令就可以控制所有节点执行命令。

       (2). 默认是ssh形式控制所有节点,但是又是基于python开发,可以多并发。相对于chef和puppet为代表的使用agent程序的配置管理系统默认使用“拉取模式”。ansible采用的是推送模式。如果想用拉取模式,ansible官方版本也可以支持,使用名为ansible-pull的工具。

       (3). 基于模块工作,可使用任意语言开发模块。也可以使用ansible在管理的远程服务器上执行任意Shell命令。

       (4).YAML语言来实现剧本的订制。ansible的配置管理脚本叫playbook。ansible的playbook语法是基于YAML开发的。而YAML是一种易于人类读写为设计理念的数据格式语言。某种程度上说,YAML之于JSON就好像Markdown之于HTML。

       ansible的架构(引自网上截图):

blob.png

ansible core:ansible自身核心模块

host inventory:主机库,定义可管控的主机列表

connection plugins:连接插件,一般默认基于ssh协议连接

modules:core modules(自带模块)、custom modules(自定义模块 )

playbooks:剧本,按照所设定编排的顺序执行完成安排任务

      ansible的注意事项:

      (1). 主控端python版本需要2.6或以上

      (2). 被控端Python版本小于2.4需要安装python-simplejson

      (3). 被控端如开启SElinux需要安装libselinux-python

      (4).  windows不能做为主控端

1.2 Ansible的术语表-翻译官网

官网链接:https://docs.ansible.com/ansible/latest/reference_appendices/glossary.html

Action:动作是任务的一部分,该任务指定要运行的模块以及要传递给该模块的参数。 每个任务只能有一个动作,但也可以有其他参数。

Ad Hoc:指运行Ansible来使用/usr/bin/ansible而不是编排语言/usr/bin/ansible-playbook来执行一些快速命令。 一个临时命令的示例可能是重新启动基础结构中的50台计算机。 你可以通过编写剧本来完成任何临时性的工作,并且剧本还可以将许多其他操作组合在一起。

Ansible (the package):包含ansible-base和一组精选集合的软件包(Python,deb,rpm等)。 使用Ansible 2.9的剧本仍应使用Ansible 2.10软件包。 请参阅特定于发行版目录中的ansible-<version>.build文件,位于ansible-build-data中,以获取Ansible中包含的集合列表以及随附的ansible-base版本。

ansible-base:2.10的新功能。 从ansible/ansible存储库生成的可安装软件包(RPM/Python/Deb package)。 包含命令行工具和基本功能的代码,例如将模块代码复制到受管节点。 基于ansible的软件包包括一些模块和插件,并允许你通过安装集合来添加其他模块和插件。

Ansible Galaxy:用于查找和共享Ansible社区内容的在线资源。 另外,该命令行实用程序允许用户安装单个Ansible集合,例如`` ansible-galaxy install community.crypto``.。

Async:指配置为在后台运行而不是等待完成的任务。 如果您有一个较长的过程要比SSH超时运行更长的时间,则可以以异步模式启动该任务。 异步模式可以每隔几秒钟轮询一次完成,或者可以将其配置为“fire and forget(触发并解除)”,在这种情况下,Ansible甚至不会再次检查任务。 它将开始并继续进行下一步。 异步模式适用于/usr/bin/ansible and /usr/bin/ansible-playbook.。

Callback Plugin:指的是一些用户编写的代码,可以拦截Ansible的结果并对其进行处理。 GitHub项目中提供的一些示例执行自定义日志记录,发送电子邮件,甚至play sound效果。

Check Mode:指的是使用--check选项运行Ansible,该选项不会在远程系统上进行任何更改,而仅输出如果在没有此标志的情况下运行该命令可能会发生的更改。 这类似于其他系统中的所谓“dry run”模式,但是应警告用户,这不会考虑到意外的命令失败或级联效应(其他系统中的类似模式也是如此)。 使用它来了解可能发生的情况,但不要用它替代良好的登台环境。

Collection:一种打包和分发Ansible内容的打包格式,包括plugins, roles, modules等。 集合发布独立于其他集合或基于ansible的版本,因此用户可以更快使用这些功能。 某些集合与Ansible打包在一起(版本2.10或更高版本)。 你可以使用ansible-galaxy collection install <namespace.collection>.安装或(其他版本的集合)。

Collection name:完全合格的Collection Name的第二部分。 集合名称划分了集合名称空间,通常反映了集合内容的功能。 例如,cisco名称空间可能包含cisco.ios,cisco.aci和cisco.nxos,以及用于管理Cisco维护的不同网络设备的内容。

community.general (collection):由Ansible社区团队管理的特殊集合,其中包含在Ansible 2.9中提供的所有模块和插件,它们并没有自己的专用集合。 请参阅Galaxy上的community.general <https://galaxy.ansible.com/community/general>`_。

community.network (collection):与community.general相似,侧重于网络内容。 Galaxy上的community.network <https://galaxy.ansible.com/community/network>`_ on Galaxy.

Connection Plugin:默认情况下,Ansible通过可插入库与远程计算机对话。 Ansible使用本机OpenSSH(SSH(Native))或称为paramiko的Python实现。 如果你使用的是最新版本,则首选OpenSSH,并且还可以启用Kerberos和跳转主机之类的某些功能。 这将在“入门”部分中介绍。 还有其他连接类型,例如加速模式(必须在基于SSH的连接类型之一上引导但速度非常快)和本地模式(在本地系统上起作用)。 用户还可以编写自己的连接插件。

Conditionals:条件表达式是计算结果为true或false的表达式,它决定是否在给定的计算机上执行给定的任务。 Ansible的条件语句由“when”语句提供支持,Working with playbooks中对此进行了讨论。

Declarative:一种使用最终状态的描述而不是实现该状态所必需的步骤顺序的描述来完成任务的方法。 举一个现实世界的例子,任务的声明性说明为:“带我去加利福尼亚”。 根据你当前所在的位置,到达加利福尼亚州的步骤顺序可能会有所不同,并且如果你已经在加利福尼亚州,则无需执行任何操作。 Ansible的资源是声明性的; 它指出了达到最终状态所需的步骤。 它还使你知道是否需要采取任何步骤才能达到最终状态。

Diff Mode:可以将--diff标志传递给Ansible,以显示在支持它的模块上所做的更改。 你可以将它与--check结合使用,以获得良好的“dry run”。 文件差异通常采用统一的差异格式。

Executor:Ansible的核心软件组件是/usr/bin/ansible的直接支持–对应于剧本中每个任务的调用。 Executor是Ansible开发人员可能谈论的话题,但它并不是真正的用户土地词汇。

Facts:Facts就是关于远程节点的discovered。 尽管它们可以像变量一样在剧本和模板中使用,但事实是推断出来的东西,而不是设定的东西。 Ansible在运行plays时通过在远程节点上执行内部设置模块自动发现facts。 你无需显式调用设置模块,它可以运行,但是如果不需要它可以被禁用以节省时间,或者你可以通过gather_subset: option告诉ansible仅收集全部facts的一个子集。 为了方便从其他配置管理系统切换的用户,facts模块(如果已安装)还将从ohai and facter tools中提取facter。 这些分别是来自Chef和Puppet的facter库。 (这些也可以通过gather_subset:禁用)

Filter Plugin:筛选器插件是大多数用户永远都不需要了解的东西。 这些允许创建新的Jinja2过滤器,或多或少仅对知道Jinja2过滤器是什么的人有用。 如果需要它们,可以在API文档部分中学习如何编写它们。

Forks:并行与远程节点进行Ansible对话,可以通过传递--forks或在配置文件中编辑默认值来设置并行度。 默认值是非常保守的five (5) forks,但是如果你有大量RAM,则可以轻松地将其设置为50之类的值,以提高并行度。

Fully Qualified Collection Name (FQCN):集合中托管的模块,插件或角色的完整定义,格式为<namespace.collection.content_name>。 允许Playbook以明确的方式引用来自特定来源的特定模块或插件,例如community.grafana.grafana_dashboard。 当你想指定插件的确切来源时,需要FQCN。 例如,如果多个集合包含一个名为user的模块插件,则FQCN会指定为给定任务使用哪个插件。 当你安装了多个集合时,FQCN始终是要为每个任务搜索正确的插件的集合的明确且权威的指示。

Gather Facts (Boolean):Facts如上所述。 有时,在运行多剧本剧本时,如果某些剧本不需要利用任何这些值,那么最好不要打扰Facts计算。 在剧本上设置gather_facts: False可以跳过这种隐式事实收集。

Globbing:Globbing是一种基于通配符而不是主机名或主机名来选择许多主机的方法。例如,可以选择ww *来匹配所有以www开头的主机。 这个概念直接来自Func,后者是Michael DeHaan(Ansible创始人)的早期项目之一。 除了基本的切换外,还可以进行各种设置操作,例如“此组中的主机而不是另一个组中的主机”,等等。

Group:一个组由分配给一个池的多个主机组成,这些主机可以方便地一起作为目标,以及它们共同共享的给定变量。

Group Vars:The group_vars/ files是位于清单文件旁边的目录中的文件,每个组后面都有一个可选的文件名。 这是放置提供给给定组的变量(尤其是复杂的数据结构)的方便位置,因此不必将这些变量嵌入到清单文件或剧本中。

Handlers:处理程序就像Ansible剧本中的常规任务一样(请参阅“Tasks”),但仅在Task包含notify指令并指示其已更改某些内容时才运行。 例如,如果更改了配置文件,则引用配置文件模板操作的任务可能会通知服务重新启动处理程序。 这意味着只有在需要重新启动服务时才能将其退回。 处理程序可用于服务重启以外的其他用途,但是服务重启是最常见的用法。

Host:主机只是Ansible管理的远程计算机。 它们可以分配有各自的变量,也可以分组组织。 所有主机都有一个可以访问的名称(可以是IP地址或域名),如果不可以通过默认SSH端口访问它们,则可以选择一个端口号。

Host Specifier:Ansible中的每个Play将一系列任务(定义系统的角色,目的或顺序)映射到一组系统。每次play时,这就是host:指令,通常称为主机说明符。它可以选择一个系统,多个系统,一个或多个组,甚至选择一组中的主机,而明确地不在另一组中。

Host Vars: 与Group Vars一样,清单文件旁边的目录host_vars /可以包含一个清单文件,该文件以清单文件中的每个主机名命名,格式为YAML。 这提供了一个方便的位置,可以将变量分配给主机,而不必将其嵌入清单文件中。 Host Vars文件还可以用于定义无法在清单文件中表示的复杂数据结构。

Idempotency: 如果一次执行的结果与重复执行而没有任何干预动作的结果完全相同,则该操作是幂等的。

Includes: 剧本文件(仅是剧本列表)可以包含其他剧本列表,而任务列表可以将其他文件中的任务列表外部化,这一点与处理程序类似。 includes可以被参数化,这意味着加载的文件可以传递变量。 例如,包含内容的用于建立WordPress博客的剧本可以使用一个名为user的参数,并且可以包含多个剧本,以为alice和bob创建一个博客。

Inventory: 一个描述Ansible中的主机和组的文件(默认情况下,Ansible使用简单的INI格式)。 也可以通过库存脚本(有时称为“External Inventory Script”)提供库存。

Inventory Script: 一个非常简单的程序(或复杂的程序),用于查找主机,主机的组成员身份以及来自外部资源的可变信息-不管是SQL数据库,CMDB解决方案还是LDAP之类的东西。 这个概念是从Puppet(在这里被称为“External Nodes Classifier(外部节点分类器)”)改编而来的,其工作方式或多或少完全相同。

Jinja2: Jinja2是Ansible模板模块首选的模板语言。 这是一种非常简单的Python模板语言,通常可读且易于编写。

JSON: Ansible使用JSON从远程模块返回数据。 这允许模块以任何语言编写,而不仅仅是Python。

Lazy Evaluation: 通常,Ansible会在可能的最后一秒评估剧本内容中的任何变量,这意味着,如果定义了一个数据结构,则数据结构本身可以在其中定义变量值,并且一切都会“just works(按预期运行)”。 这也意味着变量字符串可以在这些字符串内包括其他变量。

Library: 可用于/usr/bin/ansible or an Ansible playbook的模块集合。

Limit Groups: 通过将--limit somegroup传递给ansible或ansible-playbook,可以将命令限制为主机的子集。 例如,它可以用于运行通常将整套服务器定位到一个特定服务器的剧本。

Local Action:面向远程计算机的剧本中的local_action指令意味着给定的步骤实际上将在本地计算机上发生,但是可以传递变量{{ansible_hostname}}来引用该步骤中引用的远程主机名。 例如,这可用于触发rsync操作。

Local Connection:通过使用连接:剧本中的local或将-c local传递到/usr/bin/ansible,这表明我们正在管理本地主机,而不是远程计算机。

Lookup Plugin: lookup插件是一种将数据从外界获取到Ansible的方法。 查找插件是Jinja2的扩展,可以在模板中访问,例如{{ lookup('file','/path/to/file') }}。 这些是with_items之类的实现方式。 还有一些查找插件,例如file,它从文件中加载数据以及用于查询环境变量,DNS文本记录或键值存储的插件。

Loops:通常,Ansible不是编程语言。 它更倾向于声明性,尽管诸如循环之类的各种构造允许针对列表中的多个项目重复执行特定任务。 某些模块(例如yum和apt)实际上直接获取列表,并且可以在单个事务中安装这些列表中给出的所有软件包,从而大大加快了配置的总时间,因此可以无循环使用它们。

Modules:模块是Ansible交付给远程计算机的工作单元。 通过 /usr/bin/ansible or /usr/bin/ansible-playbook(其中多个任务结合使用许多不同的模块)启动模块。 可以用任何语言(包括Perl,Bash或Ruby)来实现模块,但是如果使用Python编写,则可以利用一些有用的公共库代码。 模块只需要返回JSON。 一旦模块在远程计算机上执行,它们将被删除,因此不再使用长时间运行的守护程序。 Ansible将可用模块的集合称为库。

Multi-Tier:IT系统不是一次管理一个系统,而是通过多个系统和一组系统之间按定义明确的顺序进行交互来管理的概念。 例如,在需要联系数据库服务器以及各种负载平衡器和监视服务器之后,可能需要在更新数据库服务器之前更新Web服务器,并且可能需要更新Web服务器上的组件。 Ansible为整个IT拓扑和工作流建模,而不是从“one system at a time(一次一个系统)”的角度来看配置。

Namespace:完全限定的集合名称的第一部分,名称空间通常反映功能内容类别。 示例:在cisco.ios.ios_config中,cisco是名称空间。 红帽会酌情决定保留和分发名称空间。 许多(但不是全部)名称空间将与供应商名称相对应。 有关命名空间要求,请参见Galaxy docsite上的Galaxy命名空间。

Notify:任务记录更改事件并通知处理程序任务在播放结束时需要执行另一个操作的动作。 如果一个处理程序收到多个任务的通知,它仍将只运行一次。 处理程序按照列出的顺序运行,而不是按照通知的顺序运行。

Orchestration:许多软件自动化系统使用此词来表示不同的含义。 Ansible将其用作指挥乐团的指挥。 数据中心或云体系结构充满了许多系统,扮演着许多角色– Web服务器,数据库服务器,也许是负载均衡器,监视系统,持续集成系统,等等。 在执行任何过程时,有必要按特定顺序触摸系统,通常是为了模拟滚动更新或正确部署软件。 一些系统可能会执行某些步骤,然后执行其他步骤,那么已经处理的先前系统可能需要执行更多步骤。 在此过程中,可能需要发送电子邮件或联系Web服务。 Ansible业务流程是关于对这种过程进行建模的全部内容。

paramiko:默认情况下,Ansible通过SSH管理计算机。 Ansible默认使用此库来执行此操作,这是一个由Python驱动的名为paramiko的库。 paramiko库通常快速且易于管理,尽管想要使用Kerberos或Jump Hosts的用户可能希望通过在其剧本中指定连接类型或使用-c ssh标志来切换到本机SSH二进制文件(例如OpenSSH)。

Playbooks:剧本是Ansible编排,配置,管理或部署系统的语言。 之所以将它们称为Playbook,是因为它是一种sports analogy,并且使用它们应该很有趣。 它们不是workbooks:)

Plays:playbook是plays的清单。play至少是主机指定者选择的一组主机(通常是按组选择,有时又是主机名glob)与在这些主机上运行的任务之间的映射,这些任务定义了这些系统将执行的角色。 剧本中可以有一个或多个剧本。

Pull Mode:默认情况下,Ansible在推送模式下运行,这使它可以非常精细地控制与每个系统进行对话的时间。 当你希望让节点按特定时间表每N分钟检查一次时,将提供拉模式。 它使用一个称为ansible-pull的程序,也可以使用推入式模式的操作手册进行设置(或重新配置)。 大多数Ansible用户都使用推模式,但出于多种目的和选择的目的而包括了拉模式。ansible-pull的工作原理是在crontab上从git中检查配置顺序,然后使用本地连接插件在本地管理计算机。

Push Mode:推送模式是Ansible的默认模式。 实际上,它根本不是一种模式,而是你不考虑Ansible时的工作方式。 推送模式允许Ansible细化并通过复杂的编排流程进行节点处理,而无需等待它们的报到。

Register Variable:在Ansible中运行任何任务的结果都可以存储在变量中,以便在模板或条件语句中使用。 用于定义变量的关键字称为register(寄存器),它的名称来自汇编程序中寄存器的概念(尽管Ansible永远不会像汇编程序那样)。你您可以使用无数个变量名进行注册。

Resource Model: Ansible模块根据资源工作。 例如,文件模块将选择一个特定文件,并确保该资源的属性与特定模型匹配。 例如,我们可能希望将/etc/motd所有者更改为root(如果尚未将其设置为root),或者将其模式设置为0644(如果尚未将其设置为0644)。资源模型是幂等的,意味着更改命令 除非需要,否则它们不会运行,并且Ansible将使系统回到所需的状态,而不管实际的状态如何-而不是您必须告诉它如何进入状态。

Roles: Roles是Ansible中的organization。 将角色分配给一组主机(或一组组或主机模式,等等)意味着它们应该实现特定的行为。 角色可能包括应用某些变量值,某些任务和某些处理程序,或者只是其中的一项或多项。 由于与角色相关联的文件结构,角色成为可重新分发的单元,使你可以在剧本之间甚至与其他用户共享行为。

Rolling Update: 一次寻址组N中多个节点的操作,以避免一次更新所有节点并使系统脱机。 例如,在500个节点处理非常大的卷的Web拓扑中,一次更新10或20台计算机,并在完成后移至下一个10或20台计算机可能是合理的。 Ansible剧本中的serial:关键字控制滚动更新池的大小。 默认设置是一次处理全部批次大小,因此必须选择此选项。 操作系统配置(例如确保配置文件正确)通常不必使用滚动更新模型,但是可以根据需要使用。

Serial: See also Rolling Update

Sudo: Ansible不需要root登录,并且由于它是无守护程序的,因此绝对不需要root级别的守护程序(在敏感环境中可能是安全问题)。 Ansible可以登录并执行sudo命令中包装的许多操作,并且可以与无密码和基于密码的sudo一起使用。 在sudo模式下运行时,可以使用Ansible的复制,模板和获取模块来完成某些通常不适用于sudo的操作(例如scp文件传输)。

SSH (Native): 使用-c ssh(或配置文件,或剧本中的指令)将本机OpenSSH作为Ansible传输进行指定,如果要通过Kerberized SSH或使用SSH跳转主机等进行登录,则可以很有用。 在1.2.1中,如果控制计算机上的OpenSSH二进制文件足够新,则默认情况下将使用ssh。 以前,Ansible选择paramiko作为默认设置。 建议使用支持ControlMaster和ControlPersist的客户端以实现最佳性能-如果您没有该客户端并且不需要Kerberos,跳转主机或其他功能,paramiko是一个不错的选择。 如果Ansible未检测到ControlMaster/ControlPersist功能,则会警告你。

Tags: Ansible允许使用任意关键字标记剧本中的资源,然后仅运行剧本中与那些关键字相对应的部分。 例如,可以具有完整的操作系统配置,并具有标记为ntp的某些步骤,然后仅运行ntp步骤即可在远程主机上重新配置时间服务器信息。

Task: 存在用于执行任务的剧本。 任务将动作(模块及其参数)与名称和可选的其他一些关键字(如循环指令)组合在一起。 处理程序也是任务,但是它们是一种特殊的任务,除非任务报告远程系统上的基础更改时通过名称通知它们,否则它们不会运行。

Tasks: 任务列表。

Templates:Ansible可以轻松地将文件传输到远程系统,但是通常希望在其他文件中替换变量。 变量可能来自清单文件,主机变量,组变量或事实。 模板使用Jinja2模板引擎,还可以包含逻辑构造,例如循环和if语句。

Transport:Ansible使用:term:Connection Plugins来定义可用传输的类型。 这些仅仅是Ansible将如何接触托管系统的方式。 包括的传输包括paramiko,ssh(使用OpenSSH)和本地。

When:附加到任务的可选条件语句,用于确定任务是否应该运行。 如果when:关键字后面的表达式的计算结果为false,则该任务将被忽略。

Vars (Variables):与Facts,相反,变量是可以在模板和剧本中使用的值的名称(它们可以是简单的标量值-整数,布尔值,字符串)或复杂的值(字典/哈希,列表)。 它们被声明为事物,而不是从远程系统的当前状态或性质(Facts就是Facts)中推断出来的事物。

YAML:Ansible不想强迫人们编写编程语言代码来自动化基础架构,因此Ansible使用YAML来定义剧本配置语言以及变量文件。 YAML很好,因为它具有最少的语法,并且非常干净并且易于人们浏览。 对于配置文件和人员来说,这是一种很好的数据格式,但它也是机器可读的。 Ansible对YAML的使用源于Michael DeHaan在2006年左右在Cobbler中首次使用它。YAML在动态语言社区中相当流行,并且该格式具有可用于许多语言(Python,Perl,Ruby等)的序列化的库。

二、Ansible基础安装(yum安装)

QQ图片20160426231222.png

ansible编译安装前的yum准备:

[root@master ~]# yum -y install python-jinja2 PyYAML python-paramiko python-babel python-crypto python-devel

#yum的各工具介绍

Jinja2: Python的一个对设计师友好的现代模板语言,ansible使用Jinja2作为模板引擎。

PyYAML: Python的一个YAML编码/反编码函数库,ansbile使用YAML文件格式。

paramiko:  纯Python编写的SSHv2协议函数库。

httplib2:  一个功能全面的HTTP客户端函数库

ansible的编译安装:

#http://docs.ansible.com/ansible/intro_installation.html#installing-the-control-machine 官网指定下载链接: https://github.com/ansible/ansible

wget https://github.com/ansible/ansible/archive/v1.7.2.tar.gz

 tar zxf v1.7.2.tar.gz

cd  ansible-1.7.2/

python setup.py  build

python setup.py  install

 mkdir /etc/ansible

cp -r examples/* /etc/ansible/

注:如果提示# python setup.py  install安装的时候提示下面:

Ansible now needs setuptools in order to build. Install it using your package manager (usually python-setuptools) or via pip (pip install setuptools).

解决方法:

setuptools模块安装

# wget --no-check-certificate https://pypi.python.org/packages/source/s/setuptools/setuptools-19.6.tar.gz  #如果使用 wget下载https开头的网址域名 时报错,你可能需要加上--no-check-certificate 选项,参数--no-check-certificate可以不检查服务器的证书。

# tar zxf setuptools-19.6.tar.gz 

# cd setuptools-19.6

# python setup.py install

博文来自:www.51niux.com

三、ansible的编译安装方式

3.1、ansible的基础环境安装

1. python安装

# wget https://www.python.org/ftp/python/2.7.8/Python-2.7.8.tgz

# tar zxf Python-2.7.8.tgz 

# cd Python-2.7.8

# ./configure --prefix=/usr/local/python2.7.8

# make  #不加参数是单核编译,有个make -j 数字,的形式可以加快编译速度,如果我的CPU是多核的可以,如make -j 2

# make  install

# cd cd /usr/local/python2.7.8/include/python2.7

# cp -a ./* /usr/local/include/ #将python头文件拷贝到标准目录,以避免编译ansible时,找不到所需的头文件

# cd /usr/bin

# mv python python2.6

# ln -s /usr/local/python2.7.8/bin/python /usr/bin/python  

# vim /usr/bin/yum  #Centos默认自带的是python2.6的版本,yum用的也是python2.6的版本

#!/usr/bin/python  -->  #!/usr/bin/python2.6  #如果开头这句话不改的话,yum会不能使用

注:下面那些python模块的主要下载链接地址为:https://pypi.python.org/pypi

2. setuptools模块安装

# wget --no-check-certificate https://pypi.python.org/packages/source/s/setuptools/setuptools-19.6.tar.gz  #如果使用 wget下载https开头的网址域名 时报错,你可能需要加上--no-check-certificate 选项,参数--no-check-certificate可以不检查服务器的证书。

# tar zxf setuptools-19.6.tar.gz 

# cd setuptools-19.6

# python setup.py install

3.pycrypto模块安装

# wget https://pypi.python.org/packages/source/p/pycrypto/pycrypto-2.6.1.tar.gz --no-check-certificate

# tar zxf pycrypto-2.6.1.tar.gz 

# cd pycrypto-2.6.1

# python setup.py install

4.PyYAM模块安装

# wget  http://pyyaml.org/download/libyaml/yaml-0.1.5.tar.gz

# tar zxf yaml-0.1.5.tar.gz 

# cd yaml-0.1.5

# ./configure --prefix=/usr/local/yaml-0.15

# make --jobs=`grep processor /proc/cpuinfo|wc -l`

# make install

# cd ..

# wget http://pyyaml.org/download/pyyaml/PyYAML-3.11.tar.gz

# tar zxf PyYAML-3.11.tar.gz 

# cd PyYAML-3.11

# python setup.py install

5.Jinja2模块安装

 #cd /tools/ansible/

# wget https://pypi.python.org/packages/source/M/MarkupSafe/MarkupSafe-0.9.3.tar.gz --no-check-certificate

# tar zxf MarkupSafe-0.9.3.tar.gz 

# cd MarkupSafe-0.9.3

# python setup.py install

#cd /tools/ansible/

# wget https://pypi.python.org/packages/source/J/Jinja2/Jinja2-2.8.tar.gz --no-check-certificate

# tar zxf Jinja2-2.8.tar.gz 

# cd Jinja2-2.8

# python setup.py install

6.paramiko模块安装

# wget https://pypi.python.org/packages/source/e/ecdsa/ecdsa-0.13.tar.gz --no-check-certificate 

# tar zxf ecdsa-0.13.tar.gz 

# cd ecdsa-0.13

# python setup.py install

# cd  /tools/ansible/

# tar zxf paramiko-1.16.0.tar.gz 

# cd paramiko-1.16.0

# python setup.py install  

7.simplejson模块安装

# cd /tools/ansible/

# wget https://pypi.python.org/packages/source/s/simplejson/simplejson-3.8.1.tar.gz --no-check-certificate

# tar zxf simplejson-3.8.1.tar.gz 

# cd simplejson-3.8.1

# python setup.py install

# cd /tools/ansible/

# wget https://pypi.python.org/packages/e7/a8/7556133689add8d1a54c0b14aeff0acb03c64707ce100ecd53934da1aa13/pip-8.1.2.tar.gz#md5=87083c0b9867963b29f7aba3613e8f4a --no-check-certificate

# tar zxf pip-8.1.2.tar.gz 

# cd pip-8.1.2

# python setup.py install

# ln -s /usr/local/python2.7.8/bin/pip /usr/bin/pip

3.2 ansible的安装

# cd /tools/ansible/

# wget https://github.com/ansible/ansible/archive/v1.7.2.tar.gz  (ansible官网将软件包放到了git上)

#  tar zxf v1.7.2.tar.gz

# cd  ansible-1.7.2/

# python setup.py  build 

#python setup.py  install

# mkdir /etc/ansible 

# cp -rf examples/* /etc/ansible/

# pip freeze  #查看安装软件的版本

blob.png

四、Ansible配置

4.1 SSH免密钥登录设置

ssh-keygen  -t rsa -P ''  #服务端执行产生秘钥对

ssh-copy-id  -i .ssh/id_rsa.pub  root@192.168.1.109

ssh-copy-id  -i .ssh/id_rsa.pub  root@192.168.1.111

ssh-copy-id  -i .ssh/id_rsa.pub  root@192.168.1.112

ssh-copy-id  -i .ssh/id_rsa.pub  root@192.168.1.113

4.2 配置ansible的主机组文件

[root@master ~]# vi /etc/ansible/hosts #Inventory主机组的定义
[webservers]
192.168.1.112
192.168.1.113
[dbservers]
192.168.1.109
192.168.1.111

[masterhost]
192.168.1.108

4.3 、初步测试

[root@master ~]# ansible -i /etc/ansible/hosts dbservers  -m command -a 'who' -u root  #-i 是制定主机组的文件 -m 是指定使用什么模块 -a 是要执行的命令 -u 是用什么用户来执行默认是root

2.png

五、inventory使用

5.1 inventory介绍

Ansible,默认是调用“/etc/ansible/hosts”配置的主机组或者主机,同时也可以通过 -i 参数指定自定义的hosts文件。
Ansible Inventory实际上是包含静态Inventory和动态Inventory两部分。

静态Inventory指的是在文件/etc/ansible/hosts中指定的主机和组,如果机器规模比较少或者增减不太频繁的话,这种手工维护要多一点,当然也可以通过一些自己写的监控手段以及采集手段来更新静态的文件,通过-i来引用。反正就是尽量的减少手工来操作,这样不会因为忘了更新什么的导致这个文件不准确。

Dynamic Inventory指通过外部脚本获取主机列表,并按照ansible 所要求的格式返回给ansilbe命令的。这部分一般会结合CMDB资管系统、zabbix 监控系统、crobble安装系统、云计算平台等获取主机信息。由于主机资源一般会动态的进行增减,而这些系统一般会智能更新。我们可以通过这些工具提供的API 或者接入库查询等方式返回主机列表。

5.2 inventory的行为参数

ansible_ssh_host:SSH目标主机名或IP(默认值是主机的名字)
ansible_ssh_port:SSH目的端口(默认是22)
ansible_ssh_user:SSH登录使用的用户名(root)
ansible_ssh_pass:SSH认证所使用的密码(默认是none,这是不安全的,ansible极力推荐使用--ask-pass选项或使用SSH keys)
ansible_sudo_pass SSH认证的sudo用户的密码
ansible_connection:ansible支持多种transport机制,ansible使用何种连接模式连接到主机,连接类型有local,ssh,docker,paramiko(默认是smart,也就是智能选择)
ansible_ssh_private_key_file:SSH认证所使用的私钥(默认是none)
ansible_shell_type:命令所使用的shell(默认是sh)目标系统的shell类型,你不应该设置这个参数,除非你设置的ansible_shell_executable与默认的sh不兼容。默认情况下,命令是在sh shell 环境风格下运行的。此处可以设置为csh或fish shell。
ansible_python_interpreter:主机上的python解释器(默认是/usr/bin/python)
ansible_*_interpreter:如果不是用python编写的自定义模块,可以使用这个参数来指定解释器的路径(如/usr/bin/ruby),(默认是none)

如下面的例子:

# cat /etc/ansible/inventory_host  #为了测试单独写了一个文件(inventory文件是.ini格式,同类的配置值归类在一起组成区段)

[hadoop]  #属于hadoop组
slave4.hadoop ansible_ssh_host=192.168.1.109 ansible_ssh_port=22 ansible_ssh_user=test1 ansible_ssh_pass=51niux.com ansible_shell_type=sh
#第一个是主机名,第二个是主机IP,第三个是主机端口,第四个是主机用户,第五个是主机密码,第六个是主机shell类型
[web]    #再定义一个web组
192.168.1.111 ansible_ssh_user=test1 ansible_ssh_private_key_file=/root/ansible/keys/192.168.1.111.id_rsa ansible_sudo_pass=51niux
#一般直接就IP就可以了,后面跟登录的用户是test1,再后面跟登录192.168.1.111的test1的用户的方式是秘钥验证的方式已经指定了秘钥的位置,然后再制定了sudo用户的密码

  # ansible -i /etc/ansible/inventory_host all -m shell -a "whoami"#测试查看一下当前用户
图片.png

#然后我们再用这个静态的invenhory文件去执行sudo的命令,但是web组里面的主机是有sudo执行权限的(我们在sudoer里面设置的),hadoop组里的test1用户就是一个单纯的普通用户,下面是效果截图:

图片.png

#可见192.168.1.111执行成功了,但是另外一个迟迟没有反应。

#注意:这种写法尽量不要用,我这里是为了演示里面的参数才这样搞一下,这种写法会造成没有sudo权限的用户卡住了整个ansible。

#这就是inventory里面的参数举例,已经将介绍的都用上了,当然如果每个主机都搞这么麻烦,那要维护的吐血了。当然大部分主机还是我们最上面演示到的[组名]然后下面每行一个IP的形式。

#当然这种形式也是非常有用途的,比如一些特殊的主机,如很多有重要数据的主机的特权用户是不会提供给你的都掌握在核心人员或者领导手里,只会提供给你一个普通用户来做一些监控统计之类的事情,而且好多主机可能处于安全考虑作了ssh的端口改变等,像这种特殊就可以单独的放到一个文件中去。

5.3 静态inventory内指定主机范围

# vim /etc/ansible/inventory_host

[web]
192.168.1.1[0:1][1:3]  #第一个取出范围是0到1和范围是1到3,也就能指定一个范围如[a:e]就是字母a到e。
#这里就是获得192.168.1.101-103和192.168.1.111-113

下面是测试结果:

图片.png

5.4 inventory内包含组名

# cat /etc/ansible/inventory_host #如果要定义一个组包含其他的组名,这个组名就要带上:children关键字。

[nginx]
192.168.1.111
192.168.1.112

[resin]
192.168.1.114

[web:children] #这个组的组名其实是web,但是要带上:children关键字才能包含上面的两个组
nginx
resin

下面是测试结果:

# ansible -i /etc/ansible/inventory_host web -m ping  #ping测试成功返回pong。
图片.png

5.5 动态 inventory举例

# cat test.py   #简单的小例子,直接将数据输出为json格式。因为Ansible在接受脚本动态获取主机信息时支持的是json格式。

#!/usr/bin/env python
# coding=utf-8
import json
host1ip = ['192.168.1.108','192.168.1.109']
host2ip = ['192.168.1.111']
group = 'web'
group2 = 'hadoop'
hostdata = {group:{"hosts":host1ip},group2:{"hosts":host2ip}}
print json.dumps(hostdata,indent=4)

注:
1、主机部分必须是列表格式的;
2、hostdata行,其中的"hosts" 部分可以省略,但如果使用时,必须是"hosts" ,不能是其他如hostlist等字符串。

# chmod +x test.py #要授权不然的话会有下面的报错:

ERROR: The file test.py looks like it should be an executable inventory script, but is not marked executable. Perhaps you want to correct this with `chmod +x test.py`?

# python test.py  #执行以下查看输出格式,从下面的结果看就是输出一个字典

{
    "web": {
        "hosts": [
            "192.168.1.108", 
            "192.168.1.109"
        ]
    }, 
    "hadoop": {
        "hosts": [
            "192.168.1.111"
        ]
    }
}

#ansible -i test.py  web -m ping  #测试一下,从下面的结果看web的主机执行了

图片.png

#这就是动态的inventory,可以自己写的程序或者sh脚本,去数据库啊或者第三方平台啊或者其他的为你提供的api,去把主机调出来然后输出为json格式,然后交给ansible去通过-i调用你的程序或者脚本来获取主机列表,然后后面的选择模块操作或者选择组什么的就一致了。

#当然如果说我想偷点懒,我已经将要执行的主机做到一个txt文件里面了,不需要调什么api啥的,只需要ansible执行一下我整理好的这个txt里面的主机就可以了,当然编写方式跟上面差不多。

# cat list.txt   #这是测试主机列表文件

192.168.1.32
192.168.1.33
192.168.1.34
192.168.1.35
192.168.1.36

# cat  test.py  #测试py脚本文件

#!/bin/env python
# -*- coding:utf-8 -*-
import json
f = file('list.txt','r')  #大致意思跟上面差不多的,就是读取文件里面的内容然后写入到空列表中
list = []
group = 'test'
for num in f.readlines():
    v = num.strip('\n')
    list.append(v)
hostdata = {group:{"hosts":list}}
jsonlist = json.dumps(hostdata,indent=4)
print jsonlist

# python test.py   #还是跟上面说的那种Json输出格式

{
    "test": {
        "hosts": [
            "192.168.1.32", 
            "192.168.1.33", 
            "192.168.1.34", 
            "192.168.1.35", 
            "192.168.1.36"
        ]
    }
}

# chmod +x test.py

# ansible -i test.py test -m ping   #执行一下

图片.png

#执行结果是OK的,这种动态的形式就是可以很灵活的动态调整哪些主机执行ansible,很多控制管理工具就是用的这种形式。

作者:忙碌的柴少 分类:ansible系列 浏览:7999 评论:0
留言列表
发表评论
来宾的头像