找回密码
 注册
查看: 549|回复: 7

ansible-cmdb 部署安装 从ansible事实收集输出生成主机概述

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2023-3-27 11:00:00 | 显示全部楼层 |阅读模式
一、概述, H* x8 C1 _  b5 O& b
Ansible-cmdb 获取 Ansible 事实收集的输出并将其转换为包含系统配置信息的静态 HTML 概览页面(和其他内容)。
- F% q! F4 h  }; z& c& R* a9 D- W3 K3 k. F
它支持多种类型的输出(html、csv、sql 等)并使用自定义数据扩展 Ansible 收集的信息。对于每个主机,它还显示组、主机变量、自定义变量和机器本地事实。: R3 ]5 p$ o2 Y8 ?. Q

4 A# z! ?# v) o  N/ i1 O1 q* Q' q安装要求:+ j1 p  j+ Q1 E4 P7 O

Ansible-cmdb 需要 Python v2.7+ / 3.0+.

理论上,它应该适用于任何可以运行Python的系统,包括BSD,Linux,Windows,Solaris和MacOS。在实践中,ansible-cmdb 是在 Ubuntu 16.04 上开发的,并在 Debian、Ubuntu 和 Centos 的最新稳定版本上进行了测试。

安装

Ansible-cmdb可以使用python包管理器pip进行安装。还有适用于各种 Linux 发行版的独立软件包。或者,您可以使用brew或普通的make install.

通过点

通过 Pip 安装:

为您的发行版安装 pip(如果您还没有)。

通过 Pip 安装 Ansible-cmdb:

sudo pip install ansible-cmdb

您也可以通过 Pip 升级 Ansible-cmdb:

+ B+ s0 z, j9 y; s
sudo pip install --upgrade ansible-cmdb: ~9 `1 T: \3 S9 O6 T- d

1、pip安装

pip install ansible-cmdb

或者

pip install --upgrade ansible-cmdb


/ ~# o  G8 q. j& W$ t' T
8 a- ]2 X! Z2 U9 g/ z" C6 O: Obrew install ansible-cmdb

  x" P+ r' P3 O4 m- y

其他操作系统安装:

tar -vxzf ansible-cmdb*.tar.gz
& U- F7 B3 z6 v+ f, Dcd ansible-cmdb*
# m, e0 A, q. c7 d3 @  M+ `, R( v9 c1 i; v6 e- U, R0 `
sudo make install

" j, v5 `( t  ~0 `2 ?

Installation from Git repository:

使用git方式安装:

git clone https://github.com/fboender/ansible-cmdb.git

https://github.com/fboender/ansible-cmdb.git  


2 S1 I6 [6 ]1 l( S/ R

) V' p& X- {; M- i( p/ D

& o% i; |6 p) m

[root@jumpserver3 ~]# git clone https://github.com/fboender/ansible-cmdb.git

Cloning into 'ansible-cmdb'...

remote: Enumerating objects: 2774, done.

remote: Counting objects: 100% (38/38), done.

remote: Compressing objects: 100% (23/23), done.

remote: Total 2774 (delta 15), reused 25 (delta 15), pack-reused 2736

Receiving objects: 100% (2774/2774), 1.47 MiB | 0 bytes/s, done.

Resolving deltas: 100% (1576/1576), done.

[root@jumpserver3 ~]# ls

ansible-cmdb  jumpserver-v3.0.3  jumpserver-v3.0.3.tar.gz  qemu-guest-agent-1.5.3-ksyun.x86_64.rpm  quick_start.sh  sudo-1.9.5-3.el7.x86_64.rpm

[root@jumpserver3 ~]#


- X8 r% L5 f; F: p0 e

下载安装包:

https://github.com/fboender/ansible-cmdb/releases/download/1.31/ansible-cmdb-1.31.tar.gz

: `3 C1 n+ U( G0 M2 @. D) O

, z& P+ ]0 H/ D# \

cd ansible-cmdb

) w) v% [+ I8 w" J, T, E+ Q3 K" |

sudo bash -c ". build.sla && install"

: m" ~2 X  _2 L8 e  N+ b8 f


9 X6 @+ J* g9 `. ^[root@jumpserver3 ansible-cmdb]# sudo bash -c ". build.sla && install "
6 y7 Q/ T0 I) n1 q) C7 i+ b6 l5 [Installed in /usr/local/
8 M6 d% n! V& K* y+ h5 d2 M- l0 Z4 k  u7 P* ]

! C, s1 J, E3 {4 R
7 @" M0 \* I7 z. P* q$ o, X, _9 k) O% A2 B! ^3 \

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2023-3-27 11:00:01 | 显示全部楼层
1、pip安装2 [! @. @6 t8 x, c9 a2 X+ S
pip install ansible-cmdb2 e4 i7 k8 ^0 }! I4 l2 F
或者' \$ y5 q4 `# M1 ~& l
pip install --upgrade ansible-cmdb
3 g6 M9 H  |7 q/ l3 ^# a! o
9 E. S0 N( o! O& M( O* I! `2、下载安装包
+ `) G0 n4 c# }* P) e( S8 ehttps://github.com/fboender/ansible-cmdb/
% M. e2 Y% X5 t8 V; ^6 r  u5 C3 Ywget https://github.com/fboender/ansi ... le-cmdb-1.17.tar.gz
& `, v: |4 M+ |. p  s# Y  m& Z) atar -vxzf ansible-cmdb*.tar.gz
+ L' t2 k# \. ^0 k; E' kcd ansible-cmdb*
; F. B5 `# f9 G( ysudo make install
4 E1 G1 A+ ]9 @$ b4 i4 R, G* V/ C5 ~- ?
3、git直接拉取
1 A3 g' h8 ]+ A- P& Jgit clone https://github.com/fboender/ansible-cmdb.git. G/ u: f0 v# E* J. J
cd ansible-cmdb
. q! k. y* }1 K% m9 R$ Jsudo bash -c ". build.sla && install"; J/ \# T) J+ F7 N* B- c$ b

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2023-3-27 11:00:02 | 显示全部楼层
命令参数- N3 W& {4 k  Y# ~
登录后复制
' M" s) ^" f& K/ OUsage: ansible-cmdb [option] <dir> > output.html. Y, ^, Z6 l/ z3 b/ Q# y1 E
Options:% Q7 p1 w5 {2 j  c* I
  --version             show program's version number and exit3 U1 A3 w' u: ?6 Q* m! q0 v
  -h, --help            show this help message and exit
4 z6 J2 G1 K& F+ ?6 V" t3 F4 Z  -t TEMPLATE, --template=TEMPLATE
: d/ H( N/ `+ l8 ]0 v4 E7 }# Y2 F' I                        Template to use. Default is 'html_fancy'
$ L7 b$ ^5 y, G3 T/ t( G! o; L  -i INVENTORY, --inventory=INVENTORY' ~, H2 T, @/ z1 [: b; S4 e4 [
                        Inventory to read extra info from
6 L3 P/ R/ E4 K/ p- A) W  -f, --fact-cache      <dir> contains fact-cache files1 l7 Q% _5 C) S) g; r
  -p PARAMS, --params=PARAMS3 Y* k3 c5 m, k+ |8 }# |2 G# V
                        Params to send to template9 K: C, ^6 N" x4 f( i4 @4 T& e
  -d, --debug           Show debug output
  }' G& v7 |4 w  -q, --quiet           Don't report warnings" N9 L& u9 O$ W; p3 A
  -c COLUMNS, --columns=COLUMNS2 Y! T/ U& a! I
                        Show only given columns
" ~& ]! {+ W* S3 w  -C CUST_COLS, --cust-cols=CUST_COLS
7 h5 H- O9 R0 }: S' a* j0 Q* K2 `0 D                        Path to a custom columns definition file( y) {3 S) e$ X/ i- T, U+ T
  -l LIMIT, --limit=LIMIT
. }6 r. ]8 N0 _) C" ~8 |6 u: }4 o                        Limit hosts to pattern
8 X% T! p, B) O* @  --exclude-cols=EXCLUDE_COLUMNS
9 q4 f. S# V( ?% e# g. T/ ~                        Exclude cols from output, n2 v* W' `$ W

- E5 J8 H0 z8 N  u  |6 P
1 N9 u' j1 i& D  Y0 k9 \! A8 y% |[root@jumpserver3 ansible-cmdb]# ansible-cmdb --help3 D4 Q( X4 Y# _0 a6 D3 H
Usage: ansible-cmdb.py [option] <dir> > output.html
. k# f  E& D0 t$ C
& ]/ M& y- F$ O9 FOptions:
. b4 a# i1 l  o" f' _. k  --version             show program's version number and exit
! F; C8 I6 c7 W6 h! T/ o  -h, --help            show this help message and exit
3 y6 q# v1 n. s1 @  -t TEMPLATE, --template=TEMPLATE
+ u: }% G8 A% A$ @2 s                        Template to use. Default is 'html_fancy'% D6 Y# u8 N. E. r' d- j
  -i INVENTORY, --inventory=INVENTORY
9 m$ }, ]: l$ ]; v: B                        Inventory to read extra info from( I; j' t& j3 ?! Q1 d; ]
  -f, --fact-cache      <dir> contains fact-cache files2 E# x9 [, l/ k( h0 V6 Y) p% M
  -p PARAMS, --params=PARAMS# W/ c' r. J/ O* O# w+ F
                        Params to send to template
+ M& M7 r$ q4 H6 t5 x  -d, --debug           Show debug output/ Z# F. \$ S4 ^8 X) w2 |0 K
  -q, --quiet           Don't report warnings
- e( D1 T& ?3 S7 e  -c COLUMNS, --columns=COLUMNS
3 @5 R1 Q' h$ X- b5 N8 _: a                        Show only given columns& Y4 ^5 e) V6 H. i& r& }
  -C CUST_COLS, --cust-cols=CUST_COLS7 X0 d6 `2 v3 O' c! L6 }7 F2 h$ M' K
                        Path to a custom columns definition file
7 @- f* \+ g# T7 j3 W' q7 G  -l LIMIT, --limit=LIMIT
" T$ d6 x/ }2 |$ j, F5 M0 w                        Limit hosts to pattern
( b! H2 w& R! s  --exclude-cols=EXCLUDE_COLUMNS
7 r# k9 Q9 h0 \$ c' K                        Exclude cols from output' Q8 h1 T9 W; ~; b
[root@jumpserver3 ~]# pip install -I "ansible<2.9"
$ W3 c% e5 }8 fWARNING: pip is being invoked by an old script wrapper. This will fail in a future version of pip.  H# s" ?0 x+ g* E  {, Q- q* Q( I( x: Q
Please see https://github.com/pypa/pip/issues/5599 for advice on fixing the underlying issue.. _2 Z: d! ]+ L! |( i- L; @3 ^2 n3 g
To avoid this problem you can invoke Python with '-m pip' instead of running pip directly.
! T# o* g# |: D& u8 FCollecting ansible<2.9% b7 _' V+ e; T8 `7 l
  Downloading ansible-2.8.20.tar.gz (12.7 MB)
! @3 v+ ^; O5 Y+ Q$ ?; \' [     |████████████████████████████████| 12.7 MB 4.5 kB/s
/ `' u' V0 z) A/ |Collecting jinja2
& G  H" y4 }" t. f& p; V  Downloading Jinja2-3.0.3-py3-none-any.whl (133 kB)
( v5 m' x& f- a3 R4 Q  w     |████████████████████████████████| 133 kB 1.8 MB/s ; C+ m; R3 e- c/ V, q+ o# B
Collecting PyYAML
6 z+ D: o/ T% l' G1 _& q) c  Using cached PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (603 kB)7 h+ f: |( }1 z
Collecting cryptography4 l+ [, y' `4 R" Y. n: W
  Downloading cryptography-40.0.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.7 MB)4 u' w" [5 L3 v7 D" z+ B
     |████████████████████████████████| 3.7 MB 54 kB/s
3 B9 F/ @2 r3 Z2 w. Z" }7 F3 ECollecting cffi>=1.124 K5 t8 S, f1 b# J3 |1 M' W3 E
  Downloading cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl (402 kB)8 ?( Q: t( [5 V7 d& j& |& s
     |████████████████████████████████| 402 kB 1.8 MB/s
0 B0 {1 S/ H/ G; u/ {: kCollecting pycparser9 I" E7 W3 Y) G$ l
  Downloading pycparser-2.21-py2.py3-none-any.whl (118 kB)( {" J2 F" U2 f5 d) j7 l
     |████████████████████████████████| 118 kB 1.9 MB/s : q, |; p7 {  I  D& n+ ?
Collecting MarkupSafe>=2.0/ p6 `0 p( E1 ~3 E4 r: _
  Downloading MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (30 kB)
/ t3 U; F4 P( F6 _. w* N$ L+ FUsing legacy 'setup.py install' for ansible, since package 'wheel' is not installed.. P+ H6 V  ^4 _
Installing collected packages: pycparser, MarkupSafe, cffi, PyYAML, jinja2, cryptography, ansible; C+ ^5 Q0 n- ?) c1 w( y1 A8 T( N" G
    Running setup.py install for ansible ... done
! B9 w& C5 B  h' W8 m3 CSuccessfully installed MarkupSafe-2.0.1 PyYAML-6.0 ansible-2.8.20 cffi-1.15.1 cryptography-40.0.0 jinja2-3.0.3 pycparser-2.21
; A: W# ]5 D3 e2 jWARNING: You are using pip version 20.3.4; however, version 21.3.1 is available.8 {" Q; ]$ F- Q2 |& T5 j& X. v
You should consider upgrading via the '/usr/bin/python3 -m pip install --upgrade pip' command.3 I! ?7 F7 n1 _8 @6 r

5 @9 Q: J8 O; l& y( z; Q
7 A2 x, Z; h: D[root@jumpserver3 ~]# pip list; w* U# h) v! Y% V; G
WARNING: pip is being invoked by an old script wrapper. This will fail in a future version of pip.
" {/ A' ~9 n4 b# FPlease see https://github.com/pypa/pip/issues/5599 for advice on fixing the underlying issue.
: S4 h9 E8 v! k) ~( q; z4 ^6 sTo avoid this problem you can invoke Python with '-m pip' instead of running pip directly.
* v* R3 \3 M% `6 SPackage            Version
7 w7 p) S4 X( t, V7 C2 S------------------ --------8 C! `# Y# r; X
ansible            2.8.20
- k8 p# D1 ]; _. M/ H7 |! `5 }  ]asgiref            3.4.1- w" N& U; V+ \+ H
async-timeout      4.0.2
6 L8 q6 i- b$ E9 F$ V5 J0 M- s# {cffi               1.15.1
; Z( w2 y0 o% m. Y  {2 n5 o) ocryptography       40.0.09 w* `6 }. O/ Q  \4 P  }  J% K9 w; c
Django             3.2.18; b5 O, y0 g# d6 u1 ~! k7 n
gmssl              3.2.2
5 d. T7 |+ A+ r5 i0 s; J8 [' Cimportlib-metadata 4.8.3
1 H6 [; ]8 A& BJinja2             3.0.3$ T4 g, k! ^; n  M: g8 w/ P
MarkupSafe         2.0.1
5 \) z6 h) v* ]packaging          21.35 z$ ^3 e5 @) |$ e. u0 j8 ~) T
pip                20.3.4
1 j9 L4 M8 P. K  `' c$ T" o* zpycparser          2.210 _% q+ `" o/ n- x
pycryptodomex      3.17% }& \) ?5 ~5 X  S! d
pyparsing          3.0.9
) j8 m+ c, V# ~/ N( ^' |pytz               2022.7.1
( |1 j! q) h4 o: {& vPyYAML             6.0- l" \6 `9 a& f" k) w9 [! A; D, ?
redis              4.3.5
4 f/ K! \+ W) s! e, @setuptools         39.2.0
, o3 a# e, a* esqlparse           0.4.3; J1 L0 W: V4 @0 x
typing-extensions  4.1.11 a8 t6 U) Y& M/ V* v
zipp               3.6.0* y1 D" _3 ]. q; `6 Q
WARNING: You are using pip version 20.3.4; however, version 21.3.1 is available.$ |4 o; ~- S. f1 |' T% Z/ O5 l
You should consider upgrading via the '/usr/bin/python3 -m pip install --upgrade pip' command., R& {4 x, u# D" |' Q7 g
[root@jumpserver3 ~]# ansible + e+ {* t! P" X- n
/usr/local/lib/python3.6/site-packages/ansible/parsing/vault/__init__.py:44: CryptographyDeprecationWarning: Python 3.6 is no longer supported by the Python core team. Therefore, support for it is deprecated in cryptography. The next release of cryptography will remove support for Python 3.6.0 |1 s5 F0 X) ]  X) d, H1 t  U
  from cryptography.exceptions import InvalidSignature" r4 N0 |- N6 z* K. v9 t% r( {% d
Usage: ansible <host-pattern> [options]
3 o- u( g/ B' S. }4 W0 ~' ?" Q( [4 u7 P; {  A2 q
Define and run a single task 'playbook' against a set of hosts. ]9 L8 h" v  g. e" q

6 U% I1 x4 l  {0 hOptions:
# L  ?5 K* G1 u  -a MODULE_ARGS, --args=MODULE_ARGS
# k" e+ g) R& |. ~                        module arguments1 l. g, O1 V3 }; }* J' X" k% V
  --ask-vault-pass      ask for vault password
8 F* L8 E. P# g$ T3 G; M& \  -B SECONDS, --background=SECONDS
, z& I: D% z6 M: e' c                        run asynchronously, failing after X seconds& o$ _( [. k; v/ N& h% K( k
                        (default=N/A)( s  H: Y) J% t
  -C, --check           don't make any changes; instead, try to predict some
; w" ^2 z0 j' c0 p' i                        of the changes that may occur
& }5 H6 m9 n# _7 A3 X* K/ s" d, i  -D, --diff            when changing (small) files and templates, show the; E$ F, T. Q. s. L" i
                        differences in those files; works great with --check
2 J3 d, a) Y0 b* I  -e EXTRA_VARS, --extra-vars=EXTRA_VARS
/ i1 ]! T3 c2 S; \0 o                        set additional variables as key=value or YAML/JSON, if
6 T7 E/ P& J2 }  j/ x* \* M                        filename prepend with @3 t  f4 F! ^% i" b" L- G" ?& V
  -f FORKS, --forks=FORKS. q0 @( i4 G. f8 ]# s. |
                        specify number of parallel processes to use' {6 |# D. g, f. j
                        (default=5)
- O9 g# H/ ?9 C% b6 h( u+ K  -h, --help            show this help message and exit
) `' y( Y( u# [) }6 v. g  -i INVENTORY, --inventory=INVENTORY, --inventory-file=INVENTORY& ^& Q' P' {3 m4 J: w( z) f! p
                        specify inventory host path or comma separated host' H' V+ F$ J% @- h$ R
                        list. --inventory-file is deprecated0 Q) i& {: u! Z6 P- H7 {! O3 {& R
  -l SUBSET, --limit=SUBSET
% p6 d$ K7 q0 p. }, a+ A                        further limit selected hosts to an additional pattern4 z3 G3 U7 x2 A
  --list-hosts          outputs a list of matching hosts; does not execute
6 U! z9 [* l9 \; J: b+ m# M                        anything else) ^. x( k5 f- L& [
  -m MODULE_NAME, --module-name=MODULE_NAME6 D. ]  v7 k: S- l
                        module name to execute (default=command)
0 N# r: `2 k4 B% ?, F) O  Q  -M MODULE_PATH, --module-path=MODULE_PATH
% r' c! o- n( g5 |$ J4 W2 T                        prepend colon-separated path(s) to module library (def" `1 g9 b1 V( U3 ?  \/ @
                        ault=~/.ansible/plugins/modules:/usr/share/ansible/plu# S. j! {8 W' E  ^3 r& a8 ]
                        gins/modules)
* ^8 x" E# X* E/ w; `0 ~: g+ g  -o, --one-line        condense output
& q# h" |4 I" R% X+ G. p. M  --playbook-dir=BASEDIR) A) Z  w: |" W# E
                        Since this tool does not use playbooks, use this as a3 f5 \! K6 q9 _
                        substitute playbook directory.This sets the relative
9 f- J+ D3 G, e/ Z7 B$ m                        path for many features including roles/ group_vars/
0 b; o# g/ g: ^6 Y' h- P& |5 y! B                        etc.) p- b( S( P& k) c) a3 n* [6 Y5 v) I
  -P POLL_INTERVAL, --poll=POLL_INTERVAL' Y# |& b, f) v  X# x, ^6 q6 _
                        set the poll interval if using -B (default=15)
& l9 P0 U3 j% k" j  --syntax-check        perform a syntax check on the playbook, but do not( Q- N) F% N* y6 Q2 }9 M
                        execute it
4 Z6 ~+ R3 h& h' }( `+ I  -t TREE, --tree=TREE  log output to this directory( G1 d) A  s4 q; p7 T0 p) a
  --vault-id=VAULT_IDS  the vault identity to use: a6 W* S4 P5 A, A0 p) f" h5 p/ w
  --vault-password-file=VAULT_PASSWORD_FILES
( f) C  p: ^0 S& y5 m8 S                        vault password file
& O0 `' `7 @) N# v) A; @% h+ [+ w  -v, --verbose         verbose mode (-vvv for more, -vvvv to enable: E# N+ \/ w9 ^- U  x# P9 M
                        connection debugging)
6 ]; ?9 `7 u. Q1 s8 U; _  --version             show program's version number, config file location,
! g9 o0 y* A; E# z; E                        configured module search path, module location,$ a9 w2 [) J) v- u
                        executable location and exit: J, q0 I9 A1 d* C: y

+ f- I" L, {; c% [. z% ]) F3 U  Privilege Escalation Options:
) A3 {( x3 o$ H4 u    control how and which user you become as on target hosts1 y' E" D3 s- l0 Y  I- `8 k9 Y
" S. l  h, l1 j" A6 G7 d5 k+ ~
    -b, --become        run operations with become (does not imply password
5 S6 h4 m( G; Q! F! T                        prompting): u( ?; ~. y, `, _- A
    --become-method=BECOME_METHOD. W: i) @4 E) J" K# q- ^
                        privilege escalation method to use (default=sudo), use) k: F* g/ `" P5 x: c# a
                        `ansible-doc -t become -l` to list valid choices.$ m3 s$ f; q) |
    --become-user=BECOME_USER! B$ M7 l5 d; P6 \- V, ]
                        run operations as this user (default=root)% ^2 R9 _; @% D6 L
    -K, --ask-become-pass
, r5 \  ^8 |) t- U7 S                        ask for privilege escalation password0 @" F, r( z" w: J/ d

. D/ S: n: [6 E6 L" B0 {! I& j  Connection Options:& _- K" y* C- x
    control as whom and how to connect to hosts
, j4 s& g. y8 O$ P1 r+ ^8 O! Q9 K  T) s! I" M) E$ O4 u7 Z
    -k, --ask-pass      ask for connection password
; o% k3 w" x4 d6 J: t9 j' S5 O& J    --private-key=PRIVATE_KEY_FILE, --key-file=PRIVATE_KEY_FILE
% l/ h5 i3 b- C5 O, M                        use this file to authenticate the connection
1 [! k! X0 o" t  d+ [& o+ @4 r5 }    -u REMOTE_USER, --user=REMOTE_USER7 Q. {$ d+ U. w
                        connect as this user (default=None)/ Q$ ~* m  b+ N& X) y
    -c CONNECTION, --connection=CONNECTION
+ f' [" {1 u0 i/ \4 p                        connection type to use (default=smart)% L5 \/ A: e2 u2 {
    -T TIMEOUT, --timeout=TIMEOUT
. a% E! r! i, c( C% h4 |9 j                        override the connection timeout in seconds( N8 q9 M' G: ^# h: I$ g
                        (default=10)& F$ O# O( v2 O' i+ q; Z, S+ r1 a
    --ssh-common-args=SSH_COMMON_ARGS
' X6 G  u0 [" ]# _                        specify common arguments to pass to sftp/scp/ssh (e.g.: e0 ]% l7 T2 w! I
                        ProxyCommand)
3 @5 d; \5 S' D& O) H# p& ?* c    --sftp-extra-args=SFTP_EXTRA_ARGS. W' K5 V/ y; M2 @3 S5 D+ u
                        specify extra arguments to pass to sftp only (e.g. -f,
0 H6 r# y2 p* `4 ?                        -l)
2 J3 G: I3 |% G& F! x    --scp-extra-args=SCP_EXTRA_ARGS
; g/ p% k# {1 g$ s* \                        specify extra arguments to pass to scp only (e.g. -l)
  ^$ u2 ]1 n, b; q* u1 K    --ssh-extra-args=SSH_EXTRA_ARGS* g* u6 _/ u) l2 C: `2 O
                        specify extra arguments to pass to ssh only (e.g. -R)- p4 V- y4 l# M& j0 m
# S/ Z" @4 f2 X7 r1 D
Some modules do not make sense in Ad-Hoc (include, meta, etc)! |0 m* f5 H9 p  S& j
ERROR! Missing target hosts1 T3 L! {( I5 P$ Z3 b$ H+ h
[root@jumpserver3 ~]#
) S& m/ y# j4 S) P0 W- r% ?
2 R7 k# X  t/ r6 m- U; `
/ m6 M& V$ |. u2 [$ R, y# j  N% y9 r& c  c! x: S  y
- @) J! D: P" P/ B

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2023-3-27 11:00:03 | 显示全部楼层

首先,为主机生成 Ansible 输出:

mkdir out
8 J* s$ b+ A3 x; ]5 Hansible -m setup --tree out/ all. S: m4 ?3 k, L, E  [( a" p

& c1 R0 \4 Z$ |. C2 ~$ S2 k  m

接下来,在生成的 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

! s) R6 ~1 J6 @9 k0 Y$ w6 `

默认情况下,使用 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”部分下的主机发现的事实中。
    / C, ]3 L0 \  f: p  V$ x  Q% E# s& p: x

读取清单是使用 -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:主机的外部唯一标识符。5 A6 I' z! T1 z/ V4 S* {: C

例如,假设我们有以下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文件。$ H6 B. h2 J1 e

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).
    / j% g$ m! N4 m) v

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=...)。请参阅上面的示例。自选' w2 H7 x% p6 [( S

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.html2 J$ L5 z2 m, C9 D, d, B+ w

如果要修改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/

这个模板有点特别,因为它不是.tpl,而是Python脚本。您可以通过将 -t 参数指向该脚本来使用它:

    $ cd ~/mytemplate    $ ansible-cmdb -t ./html_fancy_split.py -i ~/ansible/hosts ~/ansible/out/
( I7 Y5 ^; l  n3 r' H2 ^5 Y$ c; w9 P* i. b5 ^6 b1 t+ F

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2023-3-27 11:00:04 | 显示全部楼层
输出的 HTML 文件在其他计算机上不起作用。
; q# ^# w4 E% T% \/ z0 _2 l当您传输 ansible-cmdb 的输出 HTML 文件并尝试在另一台计算机上的浏览器中打开它时,您会发现它无法正常工作。
# y/ ~! R- m! P3 \4 ]" u
$ Q5 \. G& F& h这是因为在本地计算机上打开的HTML文件(以 file:// url开头的文件)不允许从互联网上获取所需的Javascript文件(以 http:// 和 https:// 开头的URL)。因此,Ansible-cmdb 会在您安装 ansible-cmdb 时安装这些必需的文件。当然,另一台 PC 不会在本地提供这些文件。
# U  X/ O4 b. h. E  ?( x3 V8 b0 O; u9 y0 E2 p5 w
解决方案是使用 -p local_js=0 参数生成输出,并将生成的 HTML 文件托管在某个地方的 Web 服务器上。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

返回首页|Archiver|手机版|小黑屋|易陆发现技术论坛 ( 蜀ICP备2026014127号-1 )

GMT+8, 2026-6-12 01:43 , Processed in 0.026621 second(s), 22 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表