|
首先,为主机生成 Ansible 输出: mkdir out
1 H- u: Z# @+ A% Hansible -m setup --tree out/ all/ h5 c# R! q- q" M( R; J, ?% P- k. U
5 r0 l& z8 O# Q% A9 Y
接下来,在生成的 out/ 目录上调用 ansible-cmdb 以生成 CMDB 概述页面: ansible-cmdb out/ > overview.html注意 ansible-cmdb 是一个 shell 包装器脚本,它尽最大努力找到要使用的正确 Python 二进制文件和 ansible-cmdb.py 脚本的正确位置。如果无法做到这一点,您可以手动指定正确的 python 解释器和脚本的路径。例如: /opt/python3/bin/python /opt/ansible-cmdb/src/ansible-cmdb.py. n6 B& P3 V* E. m7 J R) A# j
默认情况下,使用 html_fancy 模板,该模板生成包含所有主机概述的输出,以及每个主机的详细信息部分。 现在,您可以在浏览器中打开overview.html以查看结果。 完全使用Usage: ansible-cmdb [option] <dir> > output.htmlOptions: --version show program's version number and exit -h, --help show this help message and exit -t TEMPLATE, --template=TEMPLATE Template to use. Default is 'html_fancy' -i INVENTORY, --inventory=INVENTORY Inventory to read extra info from -f, --fact-cache <dir> contains fact-cache files -p PARAMS, --params=PARAMS Params to send to template -d, --debug Show debug output -q, --quiet Don't report warnings -c COLUMNS, --columns=COLUMNS Show only given columns -C CUST_COLS, --cust-cols=CUST_COLS Path to a custom columns definition file -l LIMIT, --limit=LIMIT Limit hosts to pattern --exclude-cols=EXCLUDE_COLUMNS Exclude cols from output库存扫描Ansible-cmdb 可以读取您的清单文件(默认情况下为hosts)、清单目录或动态清单,并从中提取有用的信息,例如: - 主机所属的所有组。
- 主机变量。这些是每个主机的可选键/值对,可在 playbook 中使用。它们由ansible-cmdb扫描,并被添加到“hostvars”部分下的主机发现的事实中。" h" @/ D5 d4 ^8 B. l& ^' f. w
读取清单是使用 -i 开关到 -i 完成的。它采用单个参数:主机文件、包含主机文件的目录或动态清单脚本的路径。您可以通过用逗号分隔来指定多个库存文件(不要包含空格! 例如: $ ansible-cmdb -i ./hosts out/ > overview.html如果该位置存在host_vars和group_vars目录,则会自动包含这些目录。 主机和组变量Ansible-cmdb 读取并包含清单中的主机和组变量。当您使用 -i 选项将 ansible-cmdb 指向主机清单(通常是hosts文件)时,-i 会自动包含来自host_vars和group_vars目录中的信息(如果在同一目录中找到)。 变量是否包含在输出中取决于所使用的模板。在html_fancy模板中,变量将在“自定义变量”标题下可用。 “html_fancy”模板支持四个特殊变量: - groups:主机所属的 Ansible 组的列表。
- dtap:主机是开发、测试、验收还是生产系统。
- comment:对主持人的评论。
- ext_id:主机的外部唯一标识符。( z& i% }9 Z& C4 m% Q0 M( ]
例如,假设我们有以下hosts文件: [cust.megacorp]db1.dev.megacorp.com dtap=dev comment="Old database server"db2.dev.megacorp.com dtap=dev comment="New database server"test.megacorp.com dtap=testacc.megacorp.com dtap=acc comment="24/7 support"megacorp.com dtap=prod comment="Hosting by Foo" ext_id="SRV_10029"[os.redhat]megacorp.comacc.megacorp.comtest.megacorp.comdb2.dev.megacorp.com[os.debian]db1.dev.megacorp.com主机 acc.megacorp.com 将有组“cust.megacorp”和“os.redhat”,将有一个评论说它有24/7支持,并将被标记为acc服务器。Megacorp.com 主机将具有“SRV_10029”的外部ID,这是与Foo公司就托管进行沟通所必需的。 这些变量包含在html_fancy模板的主机概览表中。 有关主机变量的更多信息,请参阅有关主机变量的官方 Ansible 文档。 指定模板Ansible-CMDB提供了多个模板。您可以使用 -t 或 ---template 参数选择模板: ansible-cmdb -t tpl_custom out/ > overview.html“html_fancy”模板是默认模板。 模板可以通过名称或 .tpl 文件的相对/绝对路径来引用。这使您可以实现自己的模板。例如: $ ansible-cmdb -t /home/fboender/my_template out/ > my_template.html模板参数某些模板支持影响其输出的参数。参数是使用 -p 或 --parameter 选项指定到 ansible-cmdb 的。-p --parameter可以通过用逗号分隔来指定多个参数。参数中不得有空格。 例如,要指定具有本地 Javascript 库和闭合树的html_fancy模板: ansible-cmdb -t html_fancy -p local_js=1,collapsed=1 out > overview.html可用模板Ansible-cmdb 目前提供了以下开箱即用的模板: - html_fancy:包含所有主机的动态现代 HTML 页面。
- html_fancy_split:一个动态的现代 HTML 页面,每个主机的详细信息都在一个单独的文件中。
- txt_table:可用主机的快速文本表摘要,其中包含一些最少的信息。
- json:转储所有主机,包括 JSON 格式的组、变量、自定义信息。
- csv:CSV 模板输出主机的 CSV 文件。
- 降价:降价模板以markdown格式生成主机信息。
- sql:SQL 模板生成一个可以加载到 SQLite 或 MySQL 数据库中的.sql文件。
5 ?. ~* t6 d# y
html_fancy: html_fancy当前是默认模板。 一个花哨的HTML页面,使用jQuery和数据表为您提供所有主机的可搜索,可排序的表概述,只需单击一下即可获得详细信息。 它采用可选参数: - local_js=0|1:从本地磁盘加载资源(默认=0)。如果设置,将从本地磁盘而不是通过网络加载资源。
- collapsed=0|1:控制默认情况下是否折叠主机信息。默认情况下,值 1 将折叠所有主机信息(默认值='0')。
- host_details=0|1:是否呈现主机详细信息(默认值 = 1)
- skip_empty=0|1:跳过未收集任何事实(无法访问等)的主机。(默认值 = 0).
. m2 w1 V; T, h3 |5 j
html_fancy_split: 此模板与html_fancy模板基本相同,但它生成一个 cmdb/ 目录,其中包含一个index.html文件和一个单独的 html 文件,用于每个主机的详细信息。如果有大量主机并且html_fancy模板呈现速度太慢,这将非常有用。 用法: ansible-cmdb -t html_fancy_split -i hosts out/它接受与html_fancy模板相同的参数。 .sql: sql 模板生成一个可以加载到 SQLite 或 MySQL 数据库中的.sql文件。 $ ansible-cmdb -t sql -i hosts out > cmdb.sql$ echo "CREATE DATABASE ansiblecmdb" | mysql$ mysql ansiblecmdb < cmdb.sql事实缓存Ansible 可以在运行剧本时缓存来自主机的事实。这是在 Ansible 中配置的,如下所示: [defaults]fact_caching=jsonfilefact_caching_connection = /path/to/facts/dir您可以通过指定 -f (----fact-cache) 选项将这些缓存的事实用作带有 ansible-cmdb 的事实目录: $ ansible-cmdb -f /path/to/facts/dir > overview.html请注意,---fact-cache 选项将应用于您指定的所有事实目录。这意味着您不能混合使用事实缓存事实目录和正常setup的事实目录。此外,如果您希望手动扩展事实(请参阅Extending章节),则必须省略ansible_facts键并将项目放在 JSON 的根目录中。 限制主机可以使用 -l 参数来限制输出中包含的主机。这与 Ansible 的限制基本相同。它支持“all”结构,单个主机,组和使用!的反转。它目前不支持通配符(例如 db*.example.com)或主机扩展(例如 db[0-3].example.com) 为了使主机限制起作用,您必须将 -i 参数指向您的主机清单。 一些例子: # Include only hosts in the group 'cust.acme'ansible-cmdb -i hosts -l 'cust.acme' out/ > cmdb.html# Include all hosts except those in the group 'cust.acme', but include# host 'foo.example.com'ansible-cmdb -i hosts -l 'all:!cust.acme:foo.example.com' out/ > cmdb.html列某些模板(如txt_table和html_fancy)支持列。如果模板支持列,则可以使用 ----columns / -c 命令行选项来指定要显示的列。 ---columns 采用逗号分隔的列列表(没有空格!),应该显示。列必须由其 id 字段指定。有关模板支持哪些 id 字段的信息,请查看模板。通常是列标题,但为小写,空格替换为下划线。 例如: $ ansible-cmdb -t txt_table --columns name,os,ip,mem,cpus facts/Name OS IP Mem CPUs---------------------- ------------- ------------- --- - jib.electricmonk.nl Linuxmint 17 192.168.0.3 16g 1 app.uat.local Debian 6.0.10 192.168.57.1 1g 1 eek.electricmonk.nl Ubuntu 14.04 192.168.0.10 3g 1 db01.prod.local Debian 6.0.10 192.168.58.1 0g 1 debian.dev.local Debian 6.0.10 192.168.56.2 1g 1 db02.prod.local Debian 6.0.10 192.168.58.2 0g 1 centos.dev.local CentOS 6.6 192.168.56.8 1g 1 win.dev.local Windows 2012 10.0.0.3 4g 0 host5.example.com Debian 6.0.10 192.168.57.1 1g 1 db03.prod.local Debian 6.0.10 192.168.58.3 0g 1 zoltar.electricmonk.nl Ubuntu 14.04 194.187.79.11 4g 2您可以使用 ----exclude-cols 选项来排除特定列。它的工作原理与 ---columns 相同。例如: ansible-cmdb -t html_fancy_split \ --exclude-cols mem_usage,swap_usage,disk_usage,physdisk_size \ -i hosts \ facts/如果要添加自定义列,请参阅自定义列部分。 扩展事实您可以指定需要扫描事实的多个目录。这使您可以覆盖、扩展和填写主机上缺失的信息。您还可以使用它来创建全新的主机或向主机添加自定义事实。 扩展事实与普通 Ansible 事实文件基本相同。当您指定多个事实目录时,Ansible-cmdb 会按顺序扫描所有事实目录并覆盖事实。 请注意,主机必须仍存在于主机文件中,否则它不会生成任何内容。 如果使用 ----fact-cache 选项,则必须省略 ansible_facts 键并将项放在 JSON 的根目录中。这也意味着您只能扩展本机 ansible 事实,而不能扩展 ansible-cmdb 从hosts文件中读取的信息。 覆盖并填写事实有时 Ansible 无法为主机正确收集某些事实。例如,OpenBSD 事实不包括userspace_architecture事实。您可以手动将其添加到主机。 为您的扩展事实创建一个目录: $ mkdir out_extend在其中为主机创建一个文件。该文件的名称必须与hosts文件中显示的名称相同: $ vi out_extend/openbsd.dev.local{ "ansible_facts": { "ansible_userspace_architecture": "x86_64" }}生成输出时指定两个目录: ./ansible-cmdb out/ out_extend/ > overview.html您的 OpenBSD 主机现在将包含“用户空间架构”事实。 手动主机例如,假设您有 100 台 Linux 机器,但只有一台 Windows 机器。不值得在那台Windows机器上设置ansible,但您仍然希望它出现在您的概述中...... 为您创建自定义事实目录: $ mkdir out_manual在其中为您的 Windows 主机创建一个文件: $ vi out_manual/win.dev.local{ "groups": [ ], "ansible_facts": { "ansible_all_ipv4_addresses": [ "10.10.0.2", "191.37.104.122" ], "ansible_default_ipv4": { "address": "191.37.104.122" }, "ansible_devices": { }, "ansible_distribution": "Windows", "ansible_distribution_major_version": "2008", "ansible_distribution_release": "", "ansible_distribution_version": "2008", "ansible_domain": "win.dev.local", "ansible_fips": false, "ansible_form_factor": "VPS", "ansible_fqdn": "win.dev.local", "ansible_hostname": "win", "ansible_machine": "x86_64", "ansible_nodename": "win.dev.local", "ansible_userspace_architecture": "x86_64", "ansible_userspace_bits": "64", "ansible_virtualization_role": "guest", "ansible_virtualization_type": "xen", "module_setup": true }, "changed": false}现在,您可以通过指定两个事实目录来创建包括 Windows 主机在内的概述: ./ansible-cmdb out/ out_manual/ > overview.html自定义事实您可以将自定义事实(不要与“自定义变量”混淆)添加到主机。默认情况下,这些事实将显示在html_fancy模板中的“自定义事实”标题下。 请注意,这些与托管本地事实不同。主机本地事实是指 Ansible 从主机的每个 //etc/ansible/facts.d 目录中读取的事实。这些也包含在 Ansible-cmdb 的html_fancy模板中,但在“托管本地事实”标题下。此处介绍的自定义事实是在运行 ansible-cmdb 的主机上手动定义的,与 Ansible 本身关系不大。 假设您想将有关已安装软件的信息添加到您的事实中。 为您创建自定义事实目录: $ mkdir out_custom在其中为要添加自定义事实的主机创建一个文件: $ vi custfact.test.local{ "custom_facts": { "software": { "apache": { "version": "2.4", "install_src": "backport_deb" }, "mysql-server": { "version": "5.5", "install_src": "manual_compile" }, "redis": { "version": "3.0.7", "install_src": "manual_compile" } } }}为此,必须在custom_facts键下列出事实。 生成概览: ./ansible-cmdb out/ out_custom/ > overview.html软件项目将列在“自定义事实”标题下。 自定义列您可以使用 -C (----cust-cols) 选项将自定义列添加到主机概述中。这允许您指定 jsonxs 表达式或 Mako 模板片段来提取和显示自定义主机事实。 自定义列目前仅受html_fancy和html_fancy_split模板支持。 -C 选项采用一个参数,该参数是包含自定义列定义的文件的路径。该文件的语法是Python(即使它看起来像JSON)。可以在存储库中的 examples/cust_cols.conf 文件中找到一个示例: [ # Show whether AppArmor is enabled { "title": "AppArmor", "id": "apparmor", "sType": "string", "visible": False, "jsonxs": "ansible_facts.ansible_apparmor.status" }, # Show the nameservers configured on the host { "title": "Nameservers", "id": "nameservers", "sType": "string", "visible": True, "tpl": """ <ul> <% # Get ansible_facts.ansible_dns.nameservers facts = host.get('ansible_facts', {}) dns = facts.get('ansible_dns', {}) nameservers = dns.get('nameservers', []) %> % for nameserver in nameservers: <li>${nameserver}</li> % endfor </ul> """ }, # Show the nameservers configured on the host, but use jsonxs. { "title": "Nameservers2", "id": "nameservers2", "sType": "string", "visible": True, "tpl": """ <ul> <% # Get ansible_facts.ansible_dns.nameservers using jsonxs nameservers = jsonxs(host, 'ansible_facts.ansible_dns.nameservers', default=[]) %> % for nameserver in nameservers: <li>${nameserver}</li> % endfor </ul> """ }]这定义了两个新列:“AppArmor”和“名称服务器”。每列由以下键/值组成: - 标题是显示为列用户友好title的内容。必填.
- id 键必须具有唯一值,以区分列。必填
- sType 值确定如何在主机概述中对值进行排序。可能的值包括string和 num。必填
- visible 确定默认情况下列是否处于活动状态(显示)。必填
- jsonxs 表达式(如果指定)指向每个主机的事实文件中的条目,并确定将为每个主机的列值显示的内容。找出 jsonxs 表达式的最简单方法是在 json 编辑器中打开收集的事实文件之一。有关如何编写 jsonxs 表达式的信息,请参阅 jsonxs。自选
- tpl 表达式(如果指定)是 Mako 模板片段。此模板中提供了单个变量host。访问主机信息时必须小心。如果其中一个主机缺少您尝试访问的信息,模板将不会呈现,ansible-cmdb 将崩溃(通常显示“KeyError”消息)。您应该始终使用 get() 方法并指定默认值。E.g. host.get('ansible_facts', {}).get('ansible_dns', host.get('ansible_facts', {}).get('ansible_dns', {}).get('nameservers', [])或者(并推荐)是使用 jsonxs 访问您的信息(并指定 default=...)。请参阅上面的示例。自选
) ^8 R8 b. H% [
jsonxs 或 tpl 是必需的。 列排序由 DataTables Javascript 库处理。必须注意具有 num 排序类型 (sType) 的列。如果列值中出现任何非数字字符 ([0-9]),排序将中断。 如果您希望对不同于向用户显示的值进行排序,则可以将string sType 与列值开头的隐藏字段结合使用。请注意,string排序很特殊,因为“100”被认为小于“20”,因为“1”小于“2”。您可以通过在隐藏字段中放置字符串可排序的值来更正此问题。例如,您可以将左侧的值归零: sort_uptime = "{0:012d}".format(uptime)或者,您可以将值映射到 0.0 到 1.0 之间的固定浮点数范围。隐藏排序助手的完整示例,它显示了人性化的正常运行时间,但也允许排序(谢谢 Kariton;请参阅问题 https://github.com/fboender/ansible-cmdb/issues/235): { "title": "Uptime", "id": "uptime", "sType": "string", "visible": False, "tpl": """ <% def ConvertSectoDay(n): weeks = n // (7 * 24 * 3600 ) n = n % (7 * 24 * 3600) days = n // (24 * 3600) n = n % (24 * 3600) hours = n // 3600 n %= 3600 minutes = n // 60 n %= 60 seconds = n return("%d Weeks, %d Days, %d Hours, %d Minutes, %d Seconds" % (weeks, days, hours, minutes, seconds)) num_uptime = int(jsonxs(host, 'ansible_facts.ansible_uptime_seconds', default=0)) sort_uptime = "{0:012d}".format(num_uptime) uptime = ConvertSectoDay(int(jsonxs(host, 'ansible_facts.ansible_uptime_seconds', default=0))) %> ## hidden sort helper <span style="display:none">${sort_uptime}</span> <span>${uptime}</span> """},要使用自定义列文件,请执行以下操作: ansible-cmdb -C example/cust_cols.conf -i example/hosts example/out/ > cmdb.html在浏览器中打开cmdb.html文件时,您可能需要在新列显示或出现奇怪行为之前点击右上角的“清除设置”按钮。 自定义模板可以创建自定义模板来构建完全不同的CMDB或增强现有CMDB。Ansible-cmdb 使用 Mako 模板引擎来渲染输出。 例如,如果要将自定义列添加到html_fancy模板(请注意,仅使用 ----cust-cols 选项更容易。有关更多信息,请参见上文): 在新目录中复制默认html_fancy模板。在这里,我们将使用 ansible-cmdb git 存储库中的文件。 $ mkdir ~/mytemplate$ cp ~/ansible-cmdb/src/ansiblecmdb/data/tpl/html_fancy.tpl ~/mytemplate/$ cp ~/ansible-cmdb/src/ansiblecmdb/data/tpl/html_fancy_defs.html ~/mytemplate/编辑html_fancy_defs.html文件并向 cols = 部分添加一个条目。在此示例中,我们将为“BIOS 版本”添加一列。 <% cols = [ ... {"title": "Product Serial","id": "prodserial", "func": col_prodserial, "sType": "string", "visible": False}, {"title": "BIOS version", "id": "bios_version", "func": col_bios_version, "sType": "string", "visible": True}, ]现在您需要实现col_biosversion模板函数。在同一html_fancy_defs.html文件中,搜索“## Column functions”部分。添加一个名为 col_biosversion 的列模板函数: <%def name="col_dtap(host, **kwargs)"> ${jsonxs(host, 'hostvars.dtap', default='')} </%def>+ <%def name="col_bios_version(host, **kwargs)">+ ${jsonxs(host, 'ansible_facts.ansible_bios_version', default='')}+ </%def>最后,呈现自定义模板。为此,您必须与自定义模板位于同一目录中!. $ ansible-cmdb/src/ansible-cmdb -t ./html_fancy -i ~/ansible/hosts ~/ansible/out/ > cmdb.html
6 v4 F7 ^# K0 V9 s: j
如果要修改html_fancy_split模板,则需要再复制几个文件: ansible-cmdb (master) $ mkdir ~/mytemplateansible-cmdb (master) $ cp src/ansiblecmdb/data/tpl/html_fancy_defs.html ~/mytemplate/ansible-cmdb (master) $ cp src/ansiblecmdb/data/tpl/html_fancy_split_detail.tpl ~/mytemplate/ansible-cmdb (master) $ cp src/ansiblecmdb/data/tpl/html_fancy_split_overview.tpl ~/mytemplate/ansible-cmdb (master) $ cp src/ansiblecmdb/data/tpl/html_fancy_split.py ~/mytemplate/[backcolor=rgba(1, 233, 175, 0.5)]这个模板有点特别,因为它不是.tpl,而是Python脚本。您可以通过将 -t 参数指向该脚本来使用它: $ cd ~/mytemplate $ ansible-cmdb -t ./html_fancy_split.py -i ~/ansible/hosts ~/ansible/out/; e f2 R2 L/ p2 M" |* z' P
/ t( a% b6 _' F0 w- W |