易陆发现互联网技术论坛

 找回密码
 开始注册
查看: 545|回复: 7
收起左侧

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

[复制链接]
发表于 2023-3-27 11:00:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?开始注册

x
一、概述$ y. i  C6 u& o0 t+ A, {/ Z; W2 Q
Ansible-cmdb 获取 Ansible 事实收集的输出并将其转换为包含系统配置信息的静态 HTML 概览页面(和其他内容)。# W. y: r2 Z8 H! ~+ ^8 Q: c- L5 p

' b4 I' ~. |7 o; c# h" Q4 T它支持多种类型的输出(html、csv、sql 等)并使用自定义数据扩展 Ansible 收集的信息。对于每个主机,它还显示组、主机变量、自定义变量和机器本地事实。+ o% ^) X9 a5 s$ u' {
: F. H7 l* L: N. b9 a! [
安装要求:
4 R, M) `0 Y" K8 p2 W7 K: {

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

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

安装

[backcolor=rgba(1, 233, 175, 0.5)]Ansible-cmdb可以使用python包管理器pip进行安装。还有适用于各种 Linux 发行版的独立软件包。或者,您可以使用brew或普通的make install.

通过点

通过 Pip 安装:

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

通过 Pip 安装 Ansible-cmdb:

sudo pip install ansible-cmdb

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


) Y. ^# n$ s. E) x4 }* O6 Z: q5 ~: Usudo pip install --upgrade ansible-cmdb! R0 h% \/ a6 ^

1、pip安装

pip install ansible-cmdb

或者

pip install --upgrade ansible-cmdb

- w; [3 H# c1 H

  Z2 z0 ^3 S4 V: l7 d6 `brew install ansible-cmdb

[backcolor=rgba(1, 233, 175, 0.5)]


; K8 C0 w8 f4 T- Q$ }

其他操作系统安装:

tar -vxzf ansible-cmdb*.tar.gz5 C8 M! I: g  a2 O2 F. x
cd ansible-cmdb*
+ \" k4 j# \5 F: b* e# E7 x! s
+ Q3 W9 ^/ V6 E* r/ @sudo make install

7 {8 ?' T  p4 J9 u! t& B

Installation from Git repository:

使用git方式安装:

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

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


: |$ O7 F% u0 K2 c" Z/ w0 S) V

4 Q# m  h% v  f) \4 w  M, h6 S

3 ~2 _. c8 t) h2 o

[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 ~]#

( H/ P4 D5 @8 Q

下载安装包:

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


8 R0 \* w( g4 ?2 L2 Z, k: c


& F% e4 q7 O" n

cd ansible-cmdb

" n/ B6 I) h) X% M2 h4 m4 a

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


5 v2 ~* t7 y" ^6 n


$ h' N1 P8 c% n2 \2 {! ~. Q. R[root@jumpserver3 ansible-cmdb]# sudo bash -c ". build.sla && install "
0 O. n: M& P5 G* z' PInstalled in /usr/local/
1 p# |* K. J/ B, B  r5 g) C! u# b" f7 W# W  p! q

5 V/ P/ f, {5 T- `
% p9 ^2 w6 K! _/ j- w! t: q# Z& [0 b0 ?0 Q" O: Q; o" V! d" G0 Z+ j
 楼主| 发表于 2023-3-27 11:00:01 | 显示全部楼层
1、pip安装
& r0 D* Y, {, Y* Z, v( v( H9 a( ipip install ansible-cmdb2 f- h- O# q% S
或者( B5 h1 g0 I/ k& C2 b
pip install --upgrade ansible-cmdb
: |$ ]) T6 X/ z" o
* C+ _* d6 i2 B' v* U2、下载安装包$ b; I# W1 x( B1 j8 g
https://github.com/fboender/ansible-cmdb/% ?9 Q5 m" N2 r. f
wget https://github.com/fboender/ansi ... le-cmdb-1.17.tar.gz5 r! q- `0 K. X' ^5 ?" d8 O
tar -vxzf ansible-cmdb*.tar.gz1 \& V( t7 E$ J* L
cd ansible-cmdb*& ]: T  `& |8 t5 |: H8 o
sudo make install5 w1 u3 u" B1 n6 l

: {8 l+ Q8 a/ T' u" ~3、git直接拉取
5 c  D( O3 y9 Ugit clone https://github.com/fboender/ansible-cmdb.git
8 m" [! W6 v& I& {& Ycd ansible-cmdb
+ U& `, O3 W) f" p) isudo bash -c ". build.sla && install", r$ `" O/ [) j9 N
 楼主| 发表于 2023-3-27 11:00:02 | 显示全部楼层
命令参数
& Q& q* q. n. H% f, H5 S. y) X' I+ @登录后复制
3 ~# `1 K1 M0 {0 R4 gUsage: ansible-cmdb [option] <dir> > output.html
0 p0 h. k2 U, Y! ~3 Y9 TOptions:
' F0 ^2 U6 p% r( n; v  --version             show program's version number and exit
7 a" \* f* \, Q' G4 A: [  -h, --help            show this help message and exit7 K1 }. x6 r$ S. q2 x
  -t TEMPLATE, --template=TEMPLATE+ @3 P4 c6 u. n& X0 B
                        Template to use. Default is 'html_fancy', e" m% d& o$ f2 }$ U- y
  -i INVENTORY, --inventory=INVENTORY8 X7 J, j8 b) |" L3 ~0 F
                        Inventory to read extra info from
4 g3 Q& `7 O9 ^  -f, --fact-cache      <dir> contains fact-cache files$ |( x& R& [4 z+ S1 l8 b
  -p PARAMS, --params=PARAMS
. k9 M: ^9 R4 {* s; T% D                        Params to send to template. ?6 g) t( w  v' S1 N! d3 P
  -d, --debug           Show debug output( w! O8 L! h) v2 Z& t3 t; U
  -q, --quiet           Don't report warnings
+ Q( ~4 m9 j* _% {/ N  -c COLUMNS, --columns=COLUMNS0 @, {  {9 d' r
                        Show only given columns
4 R. E9 }' M. s, ~& I( Q  -C CUST_COLS, --cust-cols=CUST_COLS  X" k4 k3 R" j5 u# B+ p
                        Path to a custom columns definition file- \  Z) d( {, O. I+ v
  -l LIMIT, --limit=LIMIT
$ _/ D- N4 _! b                        Limit hosts to pattern
! z! E6 l* O# U9 u  --exclude-cols=EXCLUDE_COLUMNS; P, D2 P( W. Q; ?3 P* Z
                        Exclude cols from output. _# u/ g; g2 v  u6 E0 K& `& K
) f7 c9 Y3 ^, w2 n2 U
' @$ ^3 s; Q; ?  [+ `8 g' I+ l
[root@jumpserver3 ansible-cmdb]# ansible-cmdb --help# p: R# ]4 o1 R* G. H& {9 P% O
Usage: ansible-cmdb.py [option] <dir> > output.html; f' t& W$ h/ q; T
- |0 V  b" ^9 y2 q" c* \1 k
Options:/ I# ~  q  k: g) d5 i6 u/ N3 P) I) i
  --version             show program's version number and exit# Z. r9 @9 F" n: G( h! d
  -h, --help            show this help message and exit
: w8 p/ W% y7 v# i3 E  -t TEMPLATE, --template=TEMPLATE
- |) q# D- i- p2 ]                        Template to use. Default is 'html_fancy'
- O7 r# d( N7 w8 B. c  -i INVENTORY, --inventory=INVENTORY
, ]( |+ }# ^! e' ~4 `  @5 `                        Inventory to read extra info from
/ K! G& [, Q* G& t  -f, --fact-cache      <dir> contains fact-cache files0 t! n9 b6 H5 P0 Q6 _
  -p PARAMS, --params=PARAMS
# h1 J9 J5 T" [' X- Y1 M2 {                        Params to send to template
# D; |+ s* d  N- A- g- }  -d, --debug           Show debug output
, I) {. h0 ~( |0 z$ K3 K* {  -q, --quiet           Don't report warnings
! H( _7 f$ l( `# y5 n' }5 l, s9 e  -c COLUMNS, --columns=COLUMNS
3 U5 `. H7 n6 S* T2 ^" F* p                        Show only given columns% p/ b+ H# N  j! |6 `. [# Z8 A
  -C CUST_COLS, --cust-cols=CUST_COLS9 K4 ?7 ]! @5 L* R0 V
                        Path to a custom columns definition file
# |8 @: V0 y4 P: [' b  -l LIMIT, --limit=LIMIT
8 A2 ?: u. R; T/ K" l8 F                        Limit hosts to pattern
4 w+ `: \! W, C( I& n1 a  --exclude-cols=EXCLUDE_COLUMNS
; o1 X2 R( L. Y$ n) B$ J                        Exclude cols from output
" Y8 P. ^" l0 j$ A+ {, K5 g$ H! U[root@jumpserver3 ~]# pip install -I "ansible<2.9"- l0 F" _3 G8 F- t" D6 R) r( S+ ~
WARNING: pip is being invoked by an old script wrapper. This will fail in a future version of pip.0 g1 e9 S& j* v) Z. w" Y" r
Please see https://github.com/pypa/pip/issues/5599 for advice on fixing the underlying issue.8 j0 J# S9 n$ v  N. G0 m
To avoid this problem you can invoke Python with '-m pip' instead of running pip directly./ Q/ ~' d( b' D3 {% Q' Q8 q
Collecting ansible<2.9* g8 A! \5 ~. z0 w% y1 t
  Downloading ansible-2.8.20.tar.gz (12.7 MB)8 j% N9 @7 O1 |( }
     |████████████████████████████████| 12.7 MB 4.5 kB/s
8 D7 @* F, ?3 _( [! rCollecting jinja2
; _( l! I0 h6 N: i  Downloading Jinja2-3.0.3-py3-none-any.whl (133 kB)
: v& ^$ P# ^0 g# ^1 H' ]     |████████████████████████████████| 133 kB 1.8 MB/s   G0 @9 N, I3 R5 w, S8 B
Collecting PyYAML0 O* |  u+ P% j, u6 ^7 l: ^% J
  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)  w5 S( C2 V+ r& ?
Collecting cryptography5 u$ C2 k7 C( N1 V8 |' C0 N
  Downloading cryptography-40.0.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.7 MB)
; j' h: m/ ?& V: Z5 e' h/ p& c     |████████████████████████████████| 3.7 MB 54 kB/s
( L# U# n* k  x8 J4 K' v! NCollecting cffi>=1.12* Z1 |  a2 t( ~  _- r
  Downloading cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl (402 kB)
" l, }8 @1 T/ X! f7 n) C3 w; q     |████████████████████████████████| 402 kB 1.8 MB/s ) I5 r( w1 ?5 M
Collecting pycparser8 Y6 g5 L2 K" ^  f) D
  Downloading pycparser-2.21-py2.py3-none-any.whl (118 kB)
+ W5 r8 o& g, S     |████████████████████████████████| 118 kB 1.9 MB/s
4 |* i6 G; i0 u. \3 ZCollecting MarkupSafe>=2.0. w4 ^  [6 [- A; w
  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)6 d( v4 G5 `5 x, W7 v6 @- ]
Using legacy 'setup.py install' for ansible, since package 'wheel' is not installed.- b8 ]# g: F6 _
Installing collected packages: pycparser, MarkupSafe, cffi, PyYAML, jinja2, cryptography, ansible
  v( t7 b! x( z* g: Z8 P    Running setup.py install for ansible ... done
& M/ X9 z0 `& W8 C& S0 ]Successfully 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.218 N0 Q6 C- w. ~. P( @
WARNING: You are using pip version 20.3.4; however, version 21.3.1 is available.
9 x/ p' a! k8 b( ~' IYou should consider upgrading via the '/usr/bin/python3 -m pip install --upgrade pip' command.
$ H6 [3 @+ S; }; H8 t" v$ D% F3 V! o
/ N& H% E* {- A1 |" o
! q" C+ T$ `1 ~7 c, M: @8 t[root@jumpserver3 ~]# pip list
/ i9 `1 l: b/ F3 `WARNING: pip is being invoked by an old script wrapper. This will fail in a future version of pip.9 ]3 U' t. q: l7 t8 G# Z8 D8 h
Please see https://github.com/pypa/pip/issues/5599 for advice on fixing the underlying issue.+ w) i* }) ?( g; n6 {5 C! {! i7 l
To avoid this problem you can invoke Python with '-m pip' instead of running pip directly.
7 p" b  [! L) x) M1 VPackage            Version- ?7 x* D# f8 j- G9 |
------------------ --------# c5 w& l1 X5 Z
ansible            2.8.20' L; [% Q+ j: J" Z) m
asgiref            3.4.17 f! _6 f3 X' M0 V
async-timeout      4.0.2  e" Z5 l6 h0 \/ Z  M/ e
cffi               1.15.10 G/ m+ m* M* Q0 T
cryptography       40.0.05 g& U7 f8 X" k  H! t9 ]' h
Django             3.2.18
) v! _' w, i: H; H4 Q$ r8 L0 x% Qgmssl              3.2.2. i- i! e. ?" m" J7 d
importlib-metadata 4.8.3
7 N# V' Z3 ~( t8 L  u1 `/ r' yJinja2             3.0.3
$ G+ r5 D% R3 mMarkupSafe         2.0.17 l6 T, t0 I1 ]+ Q, _9 `. ~: U
packaging          21.3
& I* R9 Y" a0 t( Spip                20.3.4
3 L$ {/ T4 g( ~1 tpycparser          2.21+ `! R% k& l  n! h, Z2 a
pycryptodomex      3.17
5 l+ S7 h/ E8 i9 c5 D- ?9 Lpyparsing          3.0.9) {1 }- K' H5 n3 a, p
pytz               2022.7.1
1 R- y1 @& e' `! NPyYAML             6.0
/ l5 s% @% Q: Q/ {redis              4.3.5/ j* ?8 w( t2 V. S0 @
setuptools         39.2.00 }2 |9 s, s2 d. ?) X8 ?
sqlparse           0.4.35 h+ T- o3 L5 ^! D+ J0 ?
typing-extensions  4.1.1& A5 j  F( @4 b" e7 d9 f
zipp               3.6.0* g) c. a# j& I( @! D
WARNING: You are using pip version 20.3.4; however, version 21.3.1 is available.6 b9 I- k6 e/ Q9 v
You should consider upgrading via the '/usr/bin/python3 -m pip install --upgrade pip' command.
' s% ~3 f" ^: Y/ D4 Y: h. Y[root@jumpserver3 ~]# ansible ! e& _$ k: D4 k, T8 l% H
/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.
9 \- H# G& K; ]+ q. n  from cryptography.exceptions import InvalidSignature
1 ^% ?5 }; f  }6 J( I" `$ q+ |Usage: ansible <host-pattern> [options]! ]( q  W$ V! F7 D# C
5 I$ R: O. u  M9 d  o) l) k
Define and run a single task 'playbook' against a set of hosts: P' b2 |$ e  r  f( f3 F

# a" f1 m9 y  P7 o( X& N) XOptions:
" B! _, b; c5 B# h% |  -a MODULE_ARGS, --args=MODULE_ARGS1 {7 X% u6 X6 S6 [
                        module arguments
$ O# Y: G( }' M  --ask-vault-pass      ask for vault password
( u- ~" u+ ^* [! v$ G2 D) }  -B SECONDS, --background=SECONDS' `; `4 h4 L# ]/ L, E1 B# u
                        run asynchronously, failing after X seconds- W) z. _- T9 K6 [' n7 C
                        (default=N/A)9 ^  x0 |9 O% R0 c
  -C, --check           don't make any changes; instead, try to predict some
" D3 H1 Z+ z- h! V                        of the changes that may occur- e$ F+ n6 S6 ^' y+ ~) k
  -D, --diff            when changing (small) files and templates, show the# D( }& {7 p% d7 q
                        differences in those files; works great with --check
' J$ g+ R/ m8 i2 m! m) B' m  -e EXTRA_VARS, --extra-vars=EXTRA_VARS
6 K5 f6 Q6 D( G                        set additional variables as key=value or YAML/JSON, if
  Q& V' d* h% |- v( n! _                        filename prepend with @& x1 R% S( \  y. d! ]- l# G& |
  -f FORKS, --forks=FORKS
+ N  g# T% m: h% h$ t3 @; s                        specify number of parallel processes to use/ s% x. ]# D! R4 }5 Q  E! H
                        (default=5)) S( _( |" B$ k6 g4 I( D
  -h, --help            show this help message and exit8 Q- N; g5 Z% `+ r9 Z4 p
  -i INVENTORY, --inventory=INVENTORY, --inventory-file=INVENTORY5 b% V; _$ o' A! |& V
                        specify inventory host path or comma separated host
5 P4 o+ F0 I: {  X                        list. --inventory-file is deprecated
0 m/ w7 O0 |7 l  -l SUBSET, --limit=SUBSET
0 Z( ]" M3 Z; q. J1 P                        further limit selected hosts to an additional pattern. ^1 F9 ~4 G, H3 d
  --list-hosts          outputs a list of matching hosts; does not execute
0 c: }, {3 y  ]/ U                        anything else
. g6 q# O3 i' W( @% f  -m MODULE_NAME, --module-name=MODULE_NAME
$ q: J4 b  q3 z6 f# w; C( J( a                        module name to execute (default=command)
  ?+ \9 N7 j4 S& w% S$ }% _! @# T  -M MODULE_PATH, --module-path=MODULE_PATH
; [$ U" {3 f: e" o* l) O                        prepend colon-separated path(s) to module library (def  V- F4 l% Y# C, H! M9 m7 c* K
                        ault=~/.ansible/plugins/modules:/usr/share/ansible/plu- E' e' A3 _# S% r0 e9 `
                        gins/modules)3 L5 S, c; A0 q, o. ?
  -o, --one-line        condense output; ?' H1 E0 ?$ E( O) E0 h  _- }0 a
  --playbook-dir=BASEDIR# E6 e6 B5 |% i* P
                        Since this tool does not use playbooks, use this as a
3 I* Y7 ?1 L- w, M" a                        substitute playbook directory.This sets the relative
# E. d  g3 |( K( m. N9 o                        path for many features including roles/ group_vars/
1 n  O1 m* `! |% l5 d) }6 }+ r                        etc.5 {# @2 Z; S/ x. i) @: U
  -P POLL_INTERVAL, --poll=POLL_INTERVAL
' @$ D& ~- D8 `2 h                        set the poll interval if using -B (default=15)
& y9 S- ?4 z& ]% l  --syntax-check        perform a syntax check on the playbook, but do not! A; v, ^$ v" E% M4 ?
                        execute it
2 N9 r& k, t8 }( y/ ?* A  B1 k4 C  -t TREE, --tree=TREE  log output to this directory
0 T* ~& @5 v% G  s! G2 L# v+ [  --vault-id=VAULT_IDS  the vault identity to use8 P3 b7 v8 Z* b# X  \8 ~
  --vault-password-file=VAULT_PASSWORD_FILES
( f5 @( l% E3 @& N, K5 ~4 ?) ]                        vault password file5 }, n2 k( p0 P: h, v+ m
  -v, --verbose         verbose mode (-vvv for more, -vvvv to enable
( o" P7 p) U1 K8 S7 Z8 Z5 t                        connection debugging)
2 s) c( e6 i4 x& C  --version             show program's version number, config file location,
& A- B" J' r/ E/ H2 L1 W" d                        configured module search path, module location,
4 q) P+ e- R3 Q; _. Z                        executable location and exit
- v! b4 r6 |# b# \% }
$ n7 ]- L% o* J/ @" k& F' M# w  Privilege Escalation Options:
  p/ q" q2 D2 l  |. d6 k    control how and which user you become as on target hosts
4 i2 i1 r6 m6 `7 m
) ]) n1 i" t4 w7 F    -b, --become        run operations with become (does not imply password
1 B6 A2 X3 k2 U7 A5 g- C                        prompting)
7 R% c) d; U0 Y    --become-method=BECOME_METHOD
! z1 {/ s; i4 b# ^                        privilege escalation method to use (default=sudo), use
8 b3 e! z- H4 ^7 n! ^( U2 i                        `ansible-doc -t become -l` to list valid choices.$ A3 G% ~$ n5 O  I  l% l
    --become-user=BECOME_USER
! S0 h* R" A1 c/ `) O( v5 G( M9 r                        run operations as this user (default=root)  d6 Q. p9 C+ a5 b$ D( h
    -K, --ask-become-pass
! [& P6 e5 X+ A$ g8 f                        ask for privilege escalation password  J6 I, |2 W( I8 U0 \
  v4 A2 a7 u. p6 h
  Connection Options:
/ t. o, D. A/ ~2 S: O& o  r    control as whom and how to connect to hosts0 S6 W  M/ N. v; N' e; |! m* V, Q6 K
" g1 Q: m. x* w, o4 o7 S
    -k, --ask-pass      ask for connection password/ p6 B6 K+ f7 M  Z  e- e9 I
    --private-key=PRIVATE_KEY_FILE, --key-file=PRIVATE_KEY_FILE
; L+ \! e% y8 ~                        use this file to authenticate the connection- b$ @( T0 {1 {# {! ]' t+ e( y3 Z
    -u REMOTE_USER, --user=REMOTE_USER
  z/ v) x/ ?+ X% A3 \% x                        connect as this user (default=None)3 F# ]$ @7 k$ P
    -c CONNECTION, --connection=CONNECTION
5 k! _6 T$ a9 H. e4 t9 g                        connection type to use (default=smart)5 j6 F" T/ P7 Z
    -T TIMEOUT, --timeout=TIMEOUT/ m: c' L" _8 @
                        override the connection timeout in seconds
& ?" }* i1 }; @) ?  C% S2 k$ [' O                        (default=10)
5 B$ P4 a2 a6 O: w    --ssh-common-args=SSH_COMMON_ARGS9 c1 o9 h7 \6 U$ q0 Q
                        specify common arguments to pass to sftp/scp/ssh (e.g.; ^4 @' ~. ^- n# y1 q
                        ProxyCommand)2 V/ _) g2 @2 ?  K* V
    --sftp-extra-args=SFTP_EXTRA_ARGS  O/ _% g  A+ t8 g
                        specify extra arguments to pass to sftp only (e.g. -f,
0 M% |  }% P( ?1 {8 y+ j3 U* j                        -l)8 V5 `! ]' l/ C$ i- j- U
    --scp-extra-args=SCP_EXTRA_ARGS) j  b  M* A" \; m$ o- ~0 `
                        specify extra arguments to pass to scp only (e.g. -l)
5 C; ~2 b" v) \    --ssh-extra-args=SSH_EXTRA_ARGS
# k2 D0 q6 R( E1 ]: i4 j                        specify extra arguments to pass to ssh only (e.g. -R)4 \% j' v* _; N: c0 Q* F

. D7 n( v6 e" h5 oSome modules do not make sense in Ad-Hoc (include, meta, etc)6 z- Y/ D, [6 U* K  t1 ?. Q
ERROR! Missing target hosts
/ k+ X, w' r6 x0 t& X  `4 A[root@jumpserver3 ~]# ; |9 q% Z% O) u1 a( M

; W- ~! u' t. o7 ^: E  m% a/ q6 S: @& _  A( S1 e. f2 h. q
0 A% T% P/ b# i0 c

7 e" _$ V( w8 }$ t  \
 楼主| 发表于 2023-3-27 11:00:03 | 显示全部楼层

首先,为主机生成 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
 楼主| 发表于 2023-3-27 11:00:04 | 显示全部楼层
输出的 HTML 文件在其他计算机上不起作用。
, F# p1 u" @$ i3 ~$ e* ^' y, w当您传输 ansible-cmdb 的输出 HTML 文件并尝试在另一台计算机上的浏览器中打开它时,您会发现它无法正常工作。% ]$ D4 R0 O, j5 }- y- s# h

% Z+ J- G( Q- o) S这是因为在本地计算机上打开的HTML文件(以 file:// url开头的文件)不允许从互联网上获取所需的Javascript文件(以 http:// 和 https:// 开头的URL)。因此,Ansible-cmdb 会在您安装 ansible-cmdb 时安装这些必需的文件。当然,另一台 PC 不会在本地提供这些文件。
8 @7 s" K2 p$ {5 K" o& X! g2 G, F, [# l/ Q$ C6 a* k" f: W* R- K
解决方案是使用 -p local_js=0 参数生成输出,并将生成的 HTML 文件托管在某个地方的 Web 服务器上。
您需要登录后才可以回帖 登录 | 开始注册

本版积分规则

关闭

站长推荐上一条 /4 下一条

北京云银创陇科技有限公司以云计算运维,代码开发

QQ|返回首页|Archiver|小黑屋|易陆发现技术论坛 ( 蜀ICP备2026014127号-1 )点击这里给我发消息

GMT+8, 2026-4-8 21:37 , Processed in 0.088745 second(s), 22 queries .

Powered by Discuz! X3.4 Licensed

© 2012-2025 Discuz! Team.

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