Ansible

Ansible

Ansible 是一个极其简单的 IT 自动化平台,可让您的应用程序和系统更易于部署和维护。从代码部署到网络配置再到云管理,使用 SSH 以接近纯英语的语言实现一切自动化,无需在远程系统上安装代理。

github

安装

分组

Ansible默认预定义了两个主机组:all分组和ungrouped分组。

all分组中包含所有分组内的节点 ungrouped分组包含所有不在分组内的节点 这两个分组都不包含localhost这个特殊的节点

分组嵌套

剔除某主机

当前hosts文件配置:

案列1:将某主机组从all中剔除

YAML中的字符串是可以不用使用引号包围的,但是如果包含了特殊符号,则需要使用引号包围。

单引号包围字符串时,会将特殊符号保留。

双引号包围字符串时,反斜线需要额外进行转义。

例如,下面几对书写方式是等价的:

sed

[WARNING]: Consider using the replace, lineinfile or template module rather than running 'sed'. If you need to use command because replace, lineinfile or template is insufficient you can add 'warn: false' to this command task or set 'command_warnings=False' in ansible.cfg to get rid of this message.

throttle: 1

执行local修改文件时,加上throttle: 1,否则会发生修改丢失的情况

源码修改

自定义ansible的输出格式

修改: /usr/lib/python2.7/site-packages/ansible/plugins/callback/minimal.py

加密弃用警告 CryptographyDeprecationWarning

修改: /usr/lib64/python2.7/site-packages/cryptography/__init__.py

弃用警告: DEPRECATION WARNING

查找告警文字

修改/usr/lib/python2.7/site-packages/ansible/executor/interpreter_discovery.py

或在ansible.cfg添加参数:

ansible不支持腾讯云 hostname:

参考: https://stackoverflow.com/questions/41999534/ansible-hostname-module-adding-os-support

因为 /usr/lib/python2.7/site-packages/ansible/modules/system/hostname.py 30行 platform.system() 为 'Linux' distribution = distro.id().capitalize() 为 "Tlinux" 不被支持

修改 /usr/lib/python2.7/site-packages/ansible/modules/system/hostname.py,在:

下面添加:

ansible详细教程

更新时间:2016年02月16日 10:02:07 作者:421389904

这篇文章主要介绍了自动化运维工具ansible的使用详细教程的相关资料,需要的朋友可以参考下

一、ansible简介

1.ansible

ansible是新出现的自动化运维工具,基于Python研发。糅合了众多老牌运维工具的优点实现了批量操作系统配置、批量程序的部署、批量运行命令等功能。仅需在管理工作站上安装ansible程序配置被管控主机的IP信息,被管控的主机无客户端。ansible应用程序存在于epel(第三方社区)源,依赖于很多python组件。主要包括:

(1)、连接插件connection plugins:负责和被监控端实现通信;

(2)、host inventory:指定操作的主机,是一个配置文件里面定义监控的主机;

(3)、各种模块核心模块、command模块、自定义模块;

(4)、借助于插件完成记录日志邮件等功能;

(5)、playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务。

参考站点:http://www.ansible.com.cn

2.ansible特性

模块化设计,调用特定的模块来完成特定任务,本身是核心组件,短小精悍;

基于Python语言实现,由Paramiko(python的一个可并发连接ssh主机功能库), PyYAML和Jinja2(模板化)三个关键模块实现;

部署简单,agentless无客户端工具;

主从模式工作;

支持自定义模块功能;

支持playbook剧本,连续任务按先后设置顺序完成;

期望每个命令具有幂等性:

3.ansible架构

ansible core:ansible自身核心模块 host inventory:主机库,定义可管控的主机列表 connection plugins:连接插件,一般默认基于ssh协议连接 modules:core modules(自带模块)、custom modules(自定义模块) playbooks:剧本,按照所设定编排的顺序执行完成安排任务

img

4.配置文件:

(1)ansible应用程序的主配置文件:/etc/ansible/ansible.cfg (2) Host Inventory定义管控主机:/etc/ansible/hosts

遵循INI风格;中括号中的字符是组名;一个主机可同时属于多个组;

示例:

注意:默认是以root用户执行,但是基于ssh连接操作要多次输入密码,为方便可以使用基于ssh密钥方式进行认证

二、ansible应用程序命令

1.ansible-doc命令:获取模块列表,及模块使用格式;

2.ansible命令格式

host-pattern指明管控主机,以模式形式表示或者直接给定IP,必须事先定义在文件中;all设置所有
[-f forks]指明每批管控多少主机,默认为5个主机一批次
[-m module_name]使用何种模块管理操作,所有的操作都需要通过模块来指定
[-a args]指明模块专用参数;args一般为key=value格式注意:command模块的参数非为kv格式,而是直接给出要执行的命令即可;

注意:command模块的参数非为kv格式,而是直接给出要执行的命令即可;

注意:默认读取/etc/ansible/hosts,也可以指明自定义文件路径

-iPATH, --inventory=PATH:指明使用的host inventory文件路径;

3.常用模块(module_name):

img

三、Playbooks剧本

1.playbook组织格式:YAML语言格式

playbooks是ansible更强大的配置管理组件,实现基于文本文件编排执行的多个任务,且多次重复执行

(1)YAML简介

YAML:YAML Ain't Markup Language; Yet Another Markup Language;

类似于半结构化数据,声明式配置;可读性较高的用来表达资料序列的格式,易于与脚本语言交互 官方站点:http://www.yaml.org

(2)语法格式

1)任何书记结构都用缩进来标识,可以嵌套 2)每一行是一个键值数据key:value,冒号隔开。若想在一行标识需要用{ }和,分隔格式 3)列表用 - 标识

2.inventory参数:主机库ssh参数设置

ansible基于ssh连接inventory中指定的远程主机时,将以此处的参数指定的属性进行;

 

ansible_ssh_port指定ssh端口
ansible_ssh_user指定ssh用户
ansible_ssh_pass指定ssh用户登录是认证密码,明文密码不安全
ansible_sudo_pass指明sudo时候的密码

 

实例:

[websrvs]

192.168.0.101 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=xuding 192.168.0.102

注意:在/etc/ansible/hosts中直接定义连接时候的密码不安全,一般建议基于ssh的密钥认证方式实现

3.playbooks

(1)核心元素

Tasks任务、Variables变量、Templates模板、Handlers处理器、Roles角色

(2)playbooks中定义任务:

img

(3)ansible-playbook执行命令:

ansible-playbook <filename.yml> ... [options]

img

4.playbook--- 变量

(1)变量命名:字母、数字和下划线组成,仅能以字母开头;

(2)变量种类:

1)facts:由远程主机发回的主机特有的属性信息,这些信息被保存在ansible变量中;无须声明,可直接调用;

2)自定义变量: 通过命令行传递:ansible-playbook test.yml --extra-vars "host=www user=test" 通过roles传递

3)主机变量:定义在inventory中的主机之后的变量;直接传递给单个主机的变量

实例:

4)组变量:定义在inventory中的组上的变量(例如在默认的文件/etc/ansible/hosts上编辑)

注意:组名要事先存在,实例如下:

变量使用示例:

注释:

  1. {{ }} 调用变量
  2. #ansible-playbook /PATH/TO/SOME_YAML_FILE { -eVARS|--extra-vars=VARS} 变量的重新赋值调用方法

 

5.playbook--- tasks

(1)条件测试:

在某task后面添加when子句即可实现条件测试功能;when语句支持Jinja2语法; 实例:当时RedHat系列系统时候调用yum安装

tasks:

 

(2)迭代:item

在task中调用内置的item变量;在某task后面使用with_items语句来定义元素列表;

tasks:

注意:迭代中,列表中的每个元素可以为字典格式;

实例:

6.playbook--- handlers:处理器;触发器

只有其关注的条件满足时,才会被触发执行的任务; 实例:配置文件发生改变触发重启服务

7.playbook模板

templates: 用于生成文本文件(配置文件);模板文件中可使用jinja2表达式,表达式要定义在{{}},也可以简单地仅执行变量替换;

roles:

authorized_key模块

常用参数 (=号后面的强制要求):

指定 ssh 公钥,搭配 lookup 使用从文件中读取公钥 实例:authorized_key: key="{{ lookup('file', '~/.ssh/id_rsa.pub') }}" state=present user=root

present 表示添加指定 key 到 authorized_keys 文件中

absent 表示从 authorized_keys 文件中移除指定 key [Default: present]

将密钥分发给目标主机上的哪个用户,默认会将公钥写入目标主机的 /home/USERNAME/.ssh/authorized_keys 文件中

是否移除 authorized_keys 文件中其它非指定 key [Default: no] type: bool version_added: 1.9

附加到 key 中的字符串 [Default: (null)] version_added: 1.4

指定模块是否应该管理 authorized key 文件所在的目录 [Default: yes] type: bool version_added: 1.2

authorized_keys 文件存放的位置 [Default: ~/.ssh/authorized_keys] version_added: 1.2

实例:

最后编辑于 :2020.12.14 11:38:16

lookup插件

发布于 2020-08-28 18:07:01

Ansible playbook允许用户使用自定义的变量,不过当变量过大,或者太复杂时,无论是在playbbok中通过vars定义,还是在单独的变量文件中定义,可读性都比较差,而且不够灵活。

有了lookup就可以解决这类难题,lookup既能够读取Ansible管理节点上文件系统的文件内容到Ansible变量中,也可以读取配置的数据库中的内容。

lookup使用案例

  1. lookup读取ansible管理节点上的/root/testfile文件的内容, 并将其内容赋值给contents变量。

上面的例子contents: "{{ lookup('file','/root/testfile')}}"使用file类型的lookup,是最简单的lookup的用法。

  1. lookup 生成随机的密码

password lookup会随机生成一个密码,并将这个密码写入到参数指定的文件中。如下示例,创建一个名为bob的mysql用户,并随机生成该用户的密码,并将密码写入到主控端的bob-password.txt中:

  1. lookup读取环境变量

env类型的lookup可以读取Linux上的环境变量

  1. lookup读取Linux命令的执行结果

pipe类型的lookup可以将Linux上命令的执行结果读取到Ansible中:

5.lookup读取配置文件

lookup支持读取两种类型的配置文件:ini和Java的Properties

ini类型的lookup默认读取配置文件的类型是ini。

假设有ini类型的配置文件如下:

config.properties内容:

先看看怎么读取ini配置文件:

看看怎么读取properties配置文件:

读取properties时,需要说明type为properties。

6.lookup读取CSV文件的指定单元

csvfile可以从.csv文件中读取一个条目。假设我们有如下示例的名为users.csv的文件:

下面是一个使用csvfile lookkup提取sue的电子邮件地址的task示例:

可以看到,一共向插件传递了四个参数:sue, file=users.csv, delimiter=,以及col=1。说明如下:

参数默认值描述
fileansible.csv要加载的文件名称
col1要输出的列,索引从0开始
delimiterTAB文件的分隔符
defaultempty string如果key不在csv文件中,则为默认返回值
encodingutf-8使用的CSV文件的编码(字符集)(added in version 2.1)
  1. lookup读取DNS解析的值

dig类型的lookup可以向DNS服务器查询指定域名的DNS记录。它可以查询任何DNS记录,包括正向查询和反向查询。

今天我们先介绍到这里,未完待续!

ansible与saltstack对比

前一段时间用了saltstack,免不得要谈一下他们的优缺点。两者都是安装和使用都非常方便的批量管理软件。

1、salt要安装agent;ansible不需要,通过ssh连接,省掉装agent的事。

2、salt在server端要启进程;ansible不需要,但这都无所谓差不多。

3、salt与ansible都有模块,可使用任意语言开发模块。

4、salt与ansible都使用yaml语言格式编写剧本。

ansible由于走的是ssh,所以它有认证的过程,以及加密码的过程,这使得ansible非常慢,不适用于大规模环境(指上千台)。

为什么我放弃salt呢,首先服务器不多(百台左右),其次,salt的master端与minion端TCP连接经常断开,导致有时执行命令时会漏机器,这简直让我忍无可忍。听说最新版的salt好了很多,但由于公司系统是定制的,安装软件特别麻烦(15M的系统,解决依赖就是个大问题),我还是选择了ansible。

以上所述是小编给大家介绍的自动化运维工具ansible的使用详细教程,希望对大家有所帮助。