Ansible_静态和动态清单文件管理
一、利用主机模式选择主机
1、应用静态清单主机
1️⃣:主机模式用于指定要作为play或临时命令的目标的主机;在最简单的形式中,清单中受管主机或主机组的名称就是指定该主机或主机组的主机模式
- 简单演示实例:
[root@localhost ~]# cat inventory
1.1.1.1
2.2.2.2 [test]
aaa.test.com
bbb.test.com [server]
www.server.com
www.mairadb.com
2、受管主机
1️⃣:在该playbook运行时,第一个Gathering Facts任务应在与主机模式匹配的所有受管主机上运行
2️⃣:如果清单中明确列出了IP地址,而不是主机名,则可以将其用作主机模式;如果IP地址未列在清单中,我们就无法用它来指定主机,即使该IP地址会在DNS中解析到这个主机名
- 简单演示实例:
[root@localhost ~]# cat playbook.yaml
---
- hosts: client.example.com
tasks:
- name:
ping: [root@localhost ~]# ansible-playbook playbook.yaml PLAY [client.example.com] ************************************************************************************************************************************************* TASK [Gathering Facts] ****************************************************************************************************************************************************
ok: [client.example.com] TASK [ping] ***************************************************************************************************************************************************************
ok: [client.example.com] PLAY RECAP ****************************************************************************************************************************************************************
client.example.com : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
3️⃣:可以通过设置ansible_host主机变量,在清单中将某一别名指向特定的IP地址
- 简单演示实例:
[root@localhost ansible]# cat inventory
host [root@localhost ansible]# cat host_vars/host
ansible_host: 192.168.121.81
ansible_ssh_user: root
ansible_ssh_pass: root [root@localhost ansible]# ansible all --list-hosts
hosts (1):
host [root@localhost ansible]# ansible all -m ping
host | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false,
"ping": "pong"
}
3、使用组指定主机
1️⃣:当组名称用作主机模式时,它指定Ansible将对属于该组的成员的主机执行操作
- 演示实例:
[root@localhost ~]# cat playbook.yaml
---
- hosts: server
tasks:
- name:
ping:
2️⃣:当有一个名为all的特别组,它匹配清单中的所有受管主机
- 演示实例:
[root@localhost ~]# cat playbook.yaml
---
- hosts: all
tasks:
- name:
ping:
3️⃣:还有一个名为ungrouped的特别组,它包括清单中不属于任何其他组的所有受管主机
- 演示实例:
[root@localhost ~]# cat playbook.yaml
---
- hosts: ungrouped
tasks:
- name:
ping:
4、使用通配符匹配多个主机
1️⃣:若要达成与all主机模式相同的目标,另一种方法是使用(*)通配符,它将匹配任意字符串。
2️⃣:如果主机模式只是带引号的星号,则清单中的所有主机都将匹配
- 演示实例:
[root@localhost ~]# cat playbook.yaml
---
- hosts: '*' //此处的引号必须加
tasks:
- name:
ping:
3️⃣:重要提示:
一些在主机模式中使用的字符对shell也有意义。通过ansible使用主机模式从命令行运行临时命令时,这可能会有问题。建议大家在命令行中使用单引号括起使用的主机模式,防止它们被shell意外扩展。
类似的,如果在Ansible Playbook中使用了任何特殊通配符或列表字符,必须将主机模式放在单引号里,确保能够正确解析主机模式。
4️⃣:其他演示实例:(用的比较少,不常用)
- 实例一:
[root@localhost ~]# cat playbook.yaml
---
- hosts: '192.168.121.*'
tasks:
- name:
ping:
- 实例二:
[root@localhost ~]# cat playbook.yaml
---
- hosts: '*.example.com'
tasks:
- name:
ping: - 实例三:
[root@localhost ~]# cat playbook.yaml
---
- hosts: 'client.example.com,www.test.com'
tasks:
- name:
ping:
- 实例四:
[root@localhost ~]# cat playbook.yaml
---
- hosts: '!client.example.com,www.test.com'
tasks:
- name:
ping:
5、列表
1️⃣:可以通过逻辑列表来引用清单中的多个条目;主机模式的逗号分隔列表匹配符合任何这些主机模式的所有主机
- 演示实例:
[root@localhost ~]# cat playbook.yaml
---
- hosts: client.example.com,www.test.com,192.168.121.81
tasks:
- name:
ping:
2️⃣:也可以混合使用受管主机、主机组和通配符
- 演示实例:
[root@localhost ~]# cat playbook.yaml
---
- hosts: '*.example.com,www.test.com,192.168.121.81'
tasks:
- name:
ping:
3️⃣:注意:也可以用冒号(:)取代逗号。不过,逗号是首选的分隔符,特别是将IPv6地址用作受管主机名称时
4️⃣:如果列表中的某一项以与符号(&)开头,则主机必须与该项匹配才能匹配主机模式
- 演示实例:
[root@localhost ~]# cat playbook.yaml
---
- hosts: host,&test
tasks:
- name:
ping:
二、管理动态清单文件
1、动态生成清单
1️⃣:Ansible支持动态清单脚本,这些脚本在每当Ansible执行时从这些类型的来源检索当前的信息,使清单能够实时得到更新
2️⃣:这些脚本是可以执行的程序,能够从一些外部来源收集信息,并以JSON格式输出清单
3️⃣:动态清单脚本的使用方式与静态清单文本文件一样。清单的位置可以直接在当前的ansible.cfg文件中指定,或者通过-i选项指定
4️⃣:如果清单文件可以执行,则它将被视为动态清单程序,Ansible会尝试运行它来生成清单。如果文件不可执行,则它将被视为静态清单
5️⃣:清单位置可以在ansible.cfg配置文件中通过inventory参数进行配置。默认情况下,它被配置为/etc/ansible/hosts
2、开源社区脚本
1️⃣:开源社区向Ansible项目贡献了大量现有的动态清单脚本。它们没有包含在ansible软件包中
2️⃣:Ansible GigHub网站:https://github.com/ansible/ansible/tree/devel/examples
3、编写动态清单文件
1️⃣:ansible-inventory命令是学习如何以JSON格式编写Ansible清单的有用工具;
2️⃣:要以JSON格式显示清单文件的内容,请运行ansible-inventory --list命令,可以使用-i选项指定要处理的清单文件的位置,或仅使用当前Ansible配置设置的默认清单
[root@localhost ~]# ansible-inventory -i inventory --list
3️⃣:如果要自己编写动态清单脚本,可以通过部署动态清单来源:https://docs.ansible.com/ansible/latest/dev_guide/developing_inventory.html 获得更详细的信息
4️⃣:脚本以适当的解释器行(例如,#!/usr/bin/python)开头并且可以执行,以便Ansible能够运行它
5️⃣:注意:
- 通过--host hostname选项调用时,该脚本必须显示指定主机的变量的JSON散列/字典。如果不提供任何变量,则可能显示空白的JSON散列或字典
- 另外,如果--list选项返回名为_meta的顶级元素,则可以在一次脚本调用中返回所有主机变量,从而提升脚本性能。此时,不会进行--host调用
- 有关详细信息,请参见部署动态清单来源:https://docs.ansible.com/ansible/latest/dev_guide/developing_inventory.html
- 脚本示例:

[root@localhost ~]# vim inventory.py
#!/usr/bin/env python '''
Example custom dynamic inventory script for Ansible, in Python.
''' import os
import sys
import argparse try:
import json
except ImportError:
import simplejson as json class ExampleInventory(object): def __init__(self):
self.inventory = {}
self.read_cli_args() # Called with `--list`.
if self.args.list:
self.inventory = self.example_inventory()
# Called with `--host [hostname]`.
elif self.args.host:
# Not implemented, since we return _meta info `--list`.
self.inventory = self.empty_inventory()
# If no groups or vars are present, return empty inventory.
else:
self.inventory = self.empty_inventory() print json.dumps(self.inventory); # Example inventory for testing.
def example_inventory(self):
return {
'group': {
'hosts': ['172.16.103.129', '172.16.103.130'],
'vars': {
'ansible_ssh_user': 'root',
'ansible_ssh_pass': '123456',
'example_variable': 'value'
}
},
'_meta': {
'hostvars': {
'172.16.103.129': {
'host_specific_var': 'foo'
},
'172.16.103.130': {
'host_specific_var': 'bar'
}
}
}
} # Empty inventory for testing.
def empty_inventory(self):
return {'_meta': {'hostvars': {}}} # Read the command line args passed to the script.
def read_cli_args(self):
parser = argparse.ArgumentParser()
parser.add_argument('--list', action = 'store_true')
parser.add_argument('--host', action = 'store')
self.args = parser.parse_args() # Get the inventory.
ExampleInventory()脚本示例
- 使用该脚本方法
chmod +x inventory.py
./inventory.py --list
./inventory.py --host 172.16.103.129 - ansible使用这个动态清单来管理主机
ansible all -i inventory.py -m ping
ansible 172.16.103.129 -i inventory.py -m ping
- 使用该脚本方法
4、管理多个清单
1️⃣:Ansible支持在同一运行中使用多个清单。如果清单的位置是一个目录(不论是由-i选项设置的、是inventory参数的值,还是以某种其他方式设置的),将组合该目录中包含的所有清单文件(不论是静态还是动态)来确定清单
- 该目录中的可执行文件将用于检索动态清单,其他文件则被用作静态清单
2️⃣:清单文件不应依赖于其他清单文件或脚本来解析
3️⃣:注意:
- 清单文件的解析顺序不是由文档指定的。如果存在多个清单文件,它们会按照字母顺序进行解析
- 如果一个清单源依赖于另一个清单源的信息,则它们的加载顺序可能会确定清单文件是按预期工作还是引发错误。因此,务必要确保所有文件都自相一致,从而避免意外的错误
4️⃣:Ansible会忽略清单目录中以特定后缀结尾的文件。这可以通过在Ansible配置文件中的inventory_ignore_extensions指令来控制
- 使用动态清单:https://docs.ansible.com/ansible/latest/user_guide/intro_dynamic_inventory.html
- 开发动态清单:https://docs.ansible.com/ansible/latest/dev_guide/developing_inventory.html
Ansible_静态和动态清单文件管理的更多相关文章
- linux静态与动态库创建及使用实例
一,gcc基础语法: 基本语法结构:(由以下四部分组成) gcc -o 可执行文件名 依赖文件集(*.c/*.o) 依赖库文件及其头文件集(由-I或-L与-l指明) gcc 依赖文件集(*.c/*.o ...
- Android中BroadcastReceiver的两种注册方式(静态和动态)详解
今天我们一起来探讨下安卓中BroadcastReceiver组件以及详细分析下它的两种注册方式. BroadcastReceiver也就是"广播接收者"的意思,顾名思义,它就是用来 ...
- 生成lua的静态库.动态库.lua.exe和luac.exe
前些日子准备学习下关于lua coroutine更为强大的功能,然而发现根据lua 5.1.4版本来运行一段代码的话也会导致 "lua: attempt to yield across me ...
- Delphi DLL的创建、静态及动态调用
转载:http://blog.csdn.net/welcome000yy/article/details/7905463 结合这篇博客:http://www.cnblogs.com/xumenger/ ...
- 3D touch 静态、动态设置及进入APP的跳转方式
申明Quick Action有两种方式:静态和动态 静态是在info.plist文件中申明,动态则是在代码中注册,系统支持两者同时存在. -系统限制每个app最多显示4个快捷图标,包括静态和动态 静态 ...
- C/C++ 跨平台交叉编译、静态库/动态库编译、MinGW、Cygwin、CodeBlocks使用原理及链接参数选项
目录 . 引言 . 交叉编译 . Cygwin简介 . 静态库编译及使用 . 动态库编译及使用 . MinGW简介 . CodeBlocks简介 0. 引言 UNIX是一个注册商标,是要满足一大堆条件 ...
- RT-Thread创建静态、动态线程
RT-Thread 实时操作系统核心是一个高效的硬实时核心,它具备非常优异的实时性.稳定性.可剪裁性,当进行最小配置时,内核体积可以到 3k ROM 占用. 1k RAM 占用. RT-Thread ...
- MYSQL学习笔记2--mysql 静态和动态plugin
mysql源码编译 .cmke 安装 yum install cmake .依赖的库下载机安装: yum -y install gcc* gcc-c++* autoconf* automake* zl ...
- Android SurfaceView实现静态于动态画图效果
本文是基于Android的SurfaceView的动态画图效果,实现静态和动态下的正弦波画图,可作为自己做图的简单参考,废话不多说,先上图, 静态效果: 动态效果: 比较简单,代码注释的也比较详细,易 ...
随机推荐
- Vue 中的 mixin,component,render,hoc
在项目中,一般我们经常会基于一套现有组件库进行快速开发,但是现实中往往需要对组件库进行定制化改造二次封装 混入(mixin) vue 官方介绍 混入 (mixin) 提供了一种非常灵活的方式,来分发 ...
- 数栈SQL优化案例:隐式转换
MySQL是当下最流行的关系型数据库之一,互联网高速发展的今天,MySQL数据库在电商.金融等诸多行业的生产系统中被广泛使用. 在实际的开发运维过程中,想必大家也常常会碰到慢SQL的困扰.一条性能不好 ...
- 【pytest官方文档】解读fixtures - 11. fixture的执行顺序,3要素详解(长文预警)
当pytest要执行一个测试函数,这个测试函数还请求了fixture函数,那么这时候pytest就要先确定fixture的执行顺序了. 影响因素有三: scope,就是fixture函数的作用范围,比 ...
- Docker笔记(一) 基础知识
官方文档地址:https://www.docker.com/get-started 中文参考手册:https://docker_practice.gitee.io/zh-cn 笔记原作者:陈艳男 B站 ...
- 为什么有时博客中的代码复制进自己的VS中报错
昨天写代码时遇到一个问题,我搜了一篇博客,然后复制到我的WPF中, 然后,全报错(当时快给我气死了,一篇有一篇的不能用,试了一次又一次,时间全浪费在这上面了,没打游戏,做的东西也没出来) 问题原因: ...
- Tomcat配置及网站创建教程(IDEA)
Tomcat在本机的配置 解压 解压Tomcat压缩包后就算安装完成,解压完成生成文件夹 配置环境变量 1.配置JAVA_HOME 控制面板--系统--查看高级系统设置--环境变量--系统环境变量 新 ...
- UVA11419 我是SAM
题意: 给你一个n*m的矩阵,上面有一些格子上有目标,我们可以在格子的外面用枪打目标,一发子弹可以消灭一行或者一列目标,问你最少多少枪能把目标打光,并且输出开枪的位置,题目没说spj(特判) ...
- Windows核心编程 第25章 未处理异常和C ++异常(下)
这一节东西比较少,本应该归并在上一节里,但是昨天太晚了.就先把那些东西分为上了.这节里面就一个问题,C++异常与结构性异常的对比(try和__try的区别): C++异常与结构性异常的对比 S E H ...
- Github搜索语法
目录 使用 Github 进行邮件配置信息收集 使用Github进行数据库信息收集
- C#-CMD
private static string InvokeCmd(string cmdArgs) { string Tstr = ""; Process p = new Proces ...