ansible / ansible-navigator Goto Github PK
View Code? Open in Web Editor NEWA text-based user interface (TUI) for Ansible.
Home Page: https://ansible.readthedocs.io/projects/navigator/
License: Apache License 2.0
A text-based user interface (TUI) for Ansible.
Home Page: https://ansible.readthedocs.io/projects/navigator/
License: Apache License 2.0
Use zuul job to run integration test with execution environment instead of current tools/test-setup.sh
as per the comment #125 (review)
steps to reproduce:
result:
Traceback (most recent call last):
File "/home/gmuniz/Documents/ansible_navigator/ansible-navigator/bin/ansible-launcher", line 33, in <module>
sys.exit(load_entry_point('ansible-launcher==0.6.0', 'console_scripts', 'ansible-launcher')())
File "/home/gmuniz/Documents/ansible_navigator/ansible-navigator/lib64/python3.9/site-packages/ansible_launcher/cli.py", line 294, in main
run(args)
File "/home/gmuniz/Documents/ansible_navigator/ansible-navigator/lib64/python3.9/site-packages/ansible_launcher/cli.py", line 260, in run
wrapper(ActionRunner(args=args).run)
File "/usr/lib64/python3.9/curses/__init__.py", line 94, in wrapper
return func(stdscr, *args, **kwds)
File "/home/gmuniz/Documents/ansible_navigator/ansible-navigator/lib64/python3.9/site-packages/ansible_launcher/action_runner.py", line 51, in run
self._run_app(interaction)
File "/home/gmuniz/Documents/ansible_navigator/ansible-navigator/lib64/python3.9/site-packages/ansible_launcher/action_runner.py", line 60, in _run_app
interaction = run_action(
File "/home/gmuniz/Documents/ansible_navigator/ansible-navigator/lib64/python3.9/site-packages/ansible_launcher/actions/_actions.py", line 68, in call
return action_cls(app.args).run(app=app, interaction=interaction)
File "/home/gmuniz/Documents/ansible_navigator/ansible-navigator/lib64/python3.9/site-packages/ansible_launcher/actions/explore.py", line 309, in run
self._take_step()
File "/home/gmuniz/Documents/ansible_navigator/ansible-navigator/lib64/python3.9/site-packages/ansible_launcher/actions/explore.py", line 504, in _take_step
result = run_action(
File "/home/gmuniz/Documents/ansible_navigator/ansible-navigator/lib64/python3.9/site-packages/ansible_launcher/actions/_actions.py", line 68, in call
return action_cls(app.args).run(app=app, interaction=interaction)
File "/home/gmuniz/Documents/ansible_navigator/ansible-navigator/lib64/python3.9/site-packages/ansible_launcher/actions/open_file.py", line 122, in run
filename, line_number, obj = self._content(
File "/home/gmuniz/Documents/ansible_navigator/ansible-navigator/lib64/python3.9/site-packages/ansible_launcher/actions/open_file.py", line 87, in _content
self._logger("something just a plain string")
TypeError: 'Logger' object is not callable
Rather than returning a string describing where a request config entry was found, return an enum/const of something not a string.
When the log entry is generated, use string that cooresponds to the enum/const that it returned.
This will clean up the tests as we can assert on a well known value and not the string
In the interactive mode for config
, doc
subcommand if <esc>
is entered at the first UI screen it exis the app. However, in inventory
mode the user has to enter :quit
to exit the app.
ProductName: macOS
ProductVersion: 11.2.1
BuildVersion: 20D74
Python 3.9.2
ansible-navigator 0.6.0
same when running :config within the TUI
Based on the current architecture the following do not work with navigator:
.cfg---------
ANSIBLE_ASK_VAULT_PASS
plugins-----
vars_prompt
pause (with prompt)
Please add to this list as other are found
Integration test running in stdout mode with EE is slow (eg: )
Adding --tty
option to container execution command https://github.com/ansible/ansible-runner/blob/devel/ansible_runner/config/_base.py#L384 results in subprocess execution to wait till default timeout (300 sec) is triggered.
Note the --tty
option is added in stdout mode so that the user password prompt is not echoed in the ansible-navigator
terminal
ansible-launcher collections
is not functioning, it just blips then returns to previous command prompt (for both cli and within ansible-launcher shell)
I installed a couple really quickly to try it out->
(venv) [student1@ansible-1 ~]$ ls ~/.ansible/collections/ansible_collections/
ansible cisco
no dice :(
I did start when there was 0...
When launching a playbook with ansible-launcher, the interface hangs indefinitely with no logging. Strace shows child process is stuck in "read"
ANSIBLE_ASK_VAULT_PASS=True ansible-launcher playbook ping.yml --limit localhost -ll debug
Job runs
Hangs indefinitely
python --version
Python 3.6.8
cat /etc/os-release
NAME="Red Hat Enterprise Linux"
VERSION="8.3 (Ootpa)"
ID="rhel"
ID_LIKE="fedora"
VERSION_ID="8.3"
PLATFORM_ID="platform:el8"
PRETTY_NAME="Red Hat Enterprise Linux 8.3 (Ootpa)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:redhat:enterprise_linux:8.3:GA"
HOME_URL="https://www.redhat.com/"
BUG_REPORT_URL="https://bugzilla.redhat.com/"
REDHAT_BUGZILLA_PRODUCT="Red Hat Enterprise Linux 8"
REDHAT_BUGZILLA_PRODUCT_VERSION=8.3
REDHAT_SUPPORT_PRODUCT="Red Hat Enterprise Linux"
REDHAT_SUPPORT_PRODUCT_VERSION="8.3"
Some exact behavior also replicated in Fedora 32 with python 3.8.
strace
strace -p 10575
strace: Process 10575 attached
read(3,
lsof
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
ansible-p 10575 jamarsha cwd DIR 253,1 34 92274824 /tmp/tmpcb8bnno0
ansible-p 10575 jamarsha rtd DIR 253,1 280 128 /
ansible-p 10575 jamarsha txt REG 253,1 11744 5162649 /usr/libexec/platform-python3.6
ansible-p 10575 jamarsha mem REG 253,1 65848 201839 /usr/lib64/python3.6/lib-dynload/array.cpython-36m-x86_64-linux-gnu.so
ansible-p 10575 jamarsha mem REG 253,1 11560 201855 /usr/lib64/python3.6/lib-dynload/syslog.cpython-36m-x86_64-linux-gnu.so
ansible-p 10575 jamarsha mem REG 253,2 7594752 149292490 /home/jamarsha/Projects/winston/lib/python3.6/site-packages/cryptography/hazmat/bindings/_openssl.abi3.so
ansible-p 10575 jamarsha mem REG 253,1 88680 421380 /usr/lib64/python3.6/lib-dynload/_socket.cpython-36m-x86_64-linux-gnu.so
ansible-p 10575 jamarsha mem REG 253,1 17064 873407 /usr/lib64/python3.6/lib-dynload/_hmacopenssl.cpython-36m-x86_64-linux-gnu.so
ansible-p 10575 jamarsha mem REG 253,2 46632 138166488 /home/jamarsha/Projects/winston/lib/python3.6/site-packages/cffi.libs/libffi-806b1a9d.so.6.0.4
ansible-p 10575 jamarsha mem REG 253,2 856392 28050734 /home/jamarsha/Projects/winston/lib/python3.6/site-packages/_cffi_backend.cpython-36m-x86_64-linux-gnu.so
ansible-p 10575 jamarsha mem REG 253,1 7264 201829 /usr/lib64/python3.6/lib-dynload/_opcode.cpython-36m-x86_64-linux-gnu.so
ansible-p 10575 jamarsha mem REG 253,1 33232 4202896 /usr/lib64/libuuid.so.1.3.0
ansible-p 10575 jamarsha mem REG 253,1 37024 4203562 /usr/lib64/libffi.so.6.0.2
ansible-p 10575 jamarsha mem REG 253,1 129136 201813 /usr/lib64/python3.6/lib-dynload/_ctypes.cpython-36m-x86_64-linux-gnu.so
ansible-p 10575 jamarsha mem REG 253,1 208616 4202826 /usr/lib64/libtinfo.so.6.1
ansible-p 10575 jamarsha mem REG 253,1 300104 4202818 /usr/lib64/libncursesw.so.6.1
ansible-p 10575 jamarsha mem REG 253,1 96560 873400 /usr/lib64/python3.6/lib-dynload/_curses.cpython-36m-x86_64-linux-gnu.so
ansible-p 10575 jamarsha mem REG 253,1 29040 201853 /usr/lib64/python3.6/lib-dynload/select.cpython-36m-x86_64-linux-gnu.so
ansible-p 10575 jamarsha mem REG 253,1 16368 421377 /usr/lib64/python3.6/lib-dynload/_posixsubprocess.cpython-36m-x86_64-linux-gnu.so
ansible-p 10575 jamarsha mem REG 253,1 25672 421392 /usr/lib64/python3.6/lib-dynload/termios.cpython-36m-x86_64-linux-gnu.so
ansible-p 10575 jamarsha mem REG 253,1 19232 201843 /usr/lib64/python3.6/lib-dynload/fcntl.cpython-36m-x86_64-linux-gnu.so
ansible-p 10575 jamarsha mem REG 253,2 1822446 85723957 /home/jamarsha/Projects/winston/lib/python3.6/site-packages/yaml/_yaml.cpython-36m-x86_64-linux-gnu.so
ansible-p 10575 jamarsha mem REG 253,1 30632 201841 /usr/lib64/python3.6/lib-dynload/binascii.cpython-36m-x86_64-linux-gnu.so
ansible-p 10575 jamarsha mem REG 253,1 115008 201816 /usr/lib64/python3.6/lib-dynload/_datetime.cpython-36m-x86_64-linux-gnu.so
ansible-p 10575 jamarsha mem REG 253,1 899352 421393 /usr/lib64/python3.6/lib-dynload/unicodedata.cpython-36m-x86_64-linux-gnu.so
ansible-p 10575 jamarsha mem REG 253,1 311032 201818 /usr/lib64/python3.6/lib-dynload/_decimal.cpython-36m-x86_64-linux-gnu.so
ansible-p 10575 jamarsha mem REG 253,1 79896 873408 /usr/lib64/python3.6/lib-dynload/_json.cpython-36m-x86_64-linux-gnu.so
ansible-p 10575 jamarsha mem REG 253,1 131360 421376 /usr/lib64/python3.6/lib-dynload/_pickle.cpython-36m-x86_64-linux-gnu.so
ansible-p 10575 jamarsha mem REG 253,1 20304 421378 /usr/lib64/python3.6/lib-dynload/_random.cpython-36m-x86_64-linux-gnu.so
ansible-p 10575 jamarsha mem REG 253,1 13464 201802 /usr/lib64/python3.6/lib-dynload/_bisect.cpython-36m-x86_64-linux-gnu.so
ansible-p 10575 jamarsha mem REG 253,1 110408 421379 /usr/lib64/python3.6/lib-dynload/_sha3.cpython-36m-x86_64-linux-gnu.so
ansible-p 10575 jamarsha mem REG 253,1 129304 873397 /usr/lib64/python3.6/lib-dynload/_blake2.cpython-36m-x86_64-linux-gnu.so
ansible-p 10575 jamarsha mem REG 253,1 615560 5421808 /usr/lib64/libssl.so.1.1.1g
ansible-p 10575 jamarsha mem REG 253,1 47704 201821 /usr/lib64/python3.6/lib-dynload/_hashlib.cpython-36m-x86_64-linux-gnu.so
ansible-p 10575 jamarsha mem REG 253,1 59144 421388 /usr/lib64/python3.6/lib-dynload/math.cpython-36m-x86_64-linux-gnu.so
ansible-p 10575 jamarsha mem REG 253,2 46832 137763740 /home/jamarsha/Projects/winston/lib/python3.6/site-packages/markupsafe/_speedups.cpython-36m-x86_64-linux-gnu.so
ansible-p 10575 jamarsha mem REG 253,1 52480 421383 /usr/lib64/python3.6/lib-dynload/_struct.cpython-36m-x86_64-linux-gnu.so
ansible-p 10575 jamarsha mem REG 253,1 12976 421387 /usr/lib64/python3.6/lib-dynload/grp.cpython-36m-x86_64-linux-gnu.so
ansible-p 10575 jamarsha mem REG 253,1 192016 4203342 /usr/lib64/liblzma.so.5.2.4
ansible-p 10575 jamarsha mem REG 253,1 42624 201826 /usr/lib64/python3.6/lib-dynload/_lzma.cpython-36m-x86_64-linux-gnu.so
ansible-p 10575 jamarsha mem REG 253,1 74744 4203415 /usr/lib64/libbz2.so.1.0.6
ansible-p 10575 jamarsha mem REG 253,1 22824 873398 /usr/lib64/python3.6/lib-dynload/_bz2.cpython-36m-x86_64-linux-gnu.so
ansible-p 10575 jamarsha mem REG 253,1 34168 201923 /usr/lib64/python3.6/lib-dynload/zlib.cpython-36m-x86_64-linux-gnu.so
ansible-p 10575 jamarsha mem REG 253,1 22808 873406 /usr/lib64/python3.6/lib-dynload/_heapq.cpython-36m-x86_64-linux-gnu.so
ansible-p 10575 jamarsha mem REG 253,1 217796128 4202871 /usr/lib/locale/locale-archive
ansible-p 10575 jamarsha mem REG 253,1 95400 4202879 /usr/lib64/libz.so.1.2.11
ansible-p 10575 jamarsha mem REG 253,1 3154704 4202845 /usr/lib64/libc-2.28.so
ansible-p 10575 jamarsha mem REG 253,1 2191808 5754900 /usr/lib64/libm-2.28.so
ansible-p 10575 jamarsha mem REG 253,1 23392 4202867 /usr/lib64/libutil-2.28.so
ansible-p 10575 jamarsha mem REG 253,1 28968 5754898 /usr/lib64/libdl-2.28.so
ansible-p 10575 jamarsha mem REG 253,1 320504 5754906 /usr/lib64/libpthread-2.28.so
ansible-p 10575 jamarsha mem REG 253,1 3285544 5563349 /usr/lib64/libpython3.6m.so.1.0
ansible-p 10575 jamarsha mem REG 253,1 3071448 5162641 /usr/lib64/libcrypto.so.1.1.1g
ansible-p 10575 jamarsha mem REG 253,1 252280 4773589 /usr/lib64/ld-2.28.so
ansible-p 10575 jamarsha mem REG 253,2 39888 149292488 /home/jamarsha/Projects/winston/lib/python3.6/site-packages/cryptography/hazmat/bindings/_padding.abi3.so
ansible-p 10575 jamarsha mem REG 253,1 26998 8863610 /usr/lib64/gconv/gconv-modules.cache
ansible-p 10575 jamarsha 0u CHR 136,1 0t0 4 /dev/pts/1
ansible-p 10575 jamarsha 1u CHR 136,1 0t0 4 /dev/pts/1
ansible-p 10575 jamarsha 2u CHR 136,1 0t0 4 /dev/pts/1
ansible-p 10575 jamarsha 3u CHR 5,0 0t0 1041 /dev/tty
ansible_launcher.log
210318002319.271 DEBUG 'ansible_launcher.main' No config file file found
210318002319.271 DEBUG 'ansible_launcher.main' Collection doc cache: path=/home/jamarsha/.cache/ansible_launcher/collection_doc_cache.db
210318002319.271 DEBUG 'ansible_launcher.main' Collection doc cache: current version=0.6.0
210318002319.273 DEBUG 'ansible_launcher.main' ansible-playbook found at /home/jamarsha/Projects/winston/bin/ansible-playbook
210318002319.273 DEBUG 'ansible_launcher.main' Running with container_engine=podman <class 'str'>
210318002319.273 DEBUG 'ansible_launcher.main' Running with execution_environment=False <class 'bool'>
210318002319.273 DEBUG 'ansible_launcher.main' Running with ee_image=quay.io/ansible/ansible-runner:devel <class 'str'>
210318002319.273 DEBUG 'ansible_launcher.main' Running with inventory_columns= <class 'str'>
210318002319.273 DEBUG 'ansible_launcher.main' Running with ide=vim <class 'str'>
210318002319.273 DEBUG 'ansible_launcher.main' Running with logfile=/home/jamarsha/Projects/test/ansible_launcher.log <class 'str'>
210318002319.273 DEBUG 'ansible_launcher.main' Running with loglevel=debug <class 'str'>
210318002319.273 DEBUG 'ansible_launcher.main' Running with no_osc4=False <class 'bool'>
210318002319.273 DEBUG 'ansible_launcher.main' Running with web=False <class 'bool'>
210318002319.273 DEBUG 'ansible_launcher.main' Running with app=playbook <class 'str'>
210318002319.273 DEBUG 'ansible_launcher.main' Running with playbook=/home/jamarsha/Projects/test/ping.yml <class 'str'>
210318002319.273 DEBUG 'ansible_launcher.main' Running with artifact=/home/jamarsha/Projects/test/ping_artifact.json <class 'str'>
210318002319.273 DEBUG 'ansible_launcher.main' Running with inventory=[] <class 'list'>
210318002319.273 DEBUG 'ansible_launcher.main' Running with requires_ansible=True <class 'bool'>
210318002319.273 DEBUG 'ansible_launcher.main' Running with cmdline=['--limit', 'localhost'] <class 'list'>
210318002319.273 DEBUG 'ansible_launcher.main' Running with editor=vi +{line_number} {filename} <class 'str'>
210318002319.273 DEBUG 'ansible_launcher.main' Running with editor_is_console=True <class 'bool'>
210318002319.273 DEBUG 'ansible_launcher.main' Running with share_dir=/home/jamarsha/Projects/winston/share/ansible_launcher <class 'str'>
210318002319.273 DEBUG 'ansible_launcher.main' Running with cache_dir=/home/jamarsha/.cache/ansible_launcher <class 'str'>
210318002319.273 DEBUG 'ansible_launcher.main' Running with collection_doc_cache={} <class 'kvs.KeyValueStore'>
210318002319.273 DEBUG 'ansible_launcher.main' Running with original_command=['--ide', 'vscode', 'playbook', 'ping.yml', '--limit', 'localhost', '-ll', 'debug'] <class 'list'>
210318002319.274 DEBUG 'ansible_launcher.main' Running with parse_and_update=<function parse_and_update at 0x7fcda913a730> <class 'function'>
210318002319.274 DEBUG 'ansible_launcher.actions.explore.16e8.playbook' subaction type is playbook
210318002319.274 DEBUG 'ansible_launcher.actions._runner.run' Runner arg: json_mode:True
210318002319.274 DEBUG 'ansible_launcher.actions._runner.run' Runner arg: quiet:True
210318002319.274 DEBUG 'ansible_launcher.actions._runner.run' Runner arg: event_handler:<bound method PlaybookRunner._event_handler of <ansible_launcher.actions._runner.PlaybookRunner object at 0x7fcda914c320>>
210318002319.274 DEBUG 'ansible_launcher.actions._runner.run' Runner arg: envvars:{'ANSIBLE_CONFIG': '/home/jamarsha/.config/ansible/ansible.cfg'}
210318002319.274 DEBUG 'ansible_launcher.actions._runner.run' Runner arg: cancel_callback:<bound method PlaybookRunner.runner_cancelled_callback of <ansible_launcher.actions._runner.PlaybookRunner object at 0x7fcda914c320>>
210318002319.274 DEBUG 'ansible_launcher.actions._runner.run' Runner arg: finished_callback:<bound method PlaybookRunner.runner_finished_callback of <ansible_launcher.actions._runner.PlaybookRunner object at 0x7fcda914c320>>
210318002319.274 DEBUG 'ansible_launcher.actions._runner.run' Runner arg: cmdline:--limit localhost
210318002319.274 DEBUG 'ansible_launcher.actions._runner.run' Runner arg: inventory:[]
210318002319.274 DEBUG 'ansible_launcher.actions._runner.run' Runner arg: playbook:/home/jamarsha/Projects/test/ping.yml
210318002319.276 DEBUG 'ansible_launcher.actions.explore.16e8._run_runner' runner requested to start
210318002348.272 WARNING 'ansible_launcher.run' Dirty exit, killing the pid
pip freeze for venv
pip freeze | grep -i ansible
ansible==2.9.18
ansible-launcher==0.6.0
ansible-runner @ git+https://github.com/ansible/ansible-runner.git@3925b6b426dca1c30e7fb410b270cd97068458aa
ansible-doc -F --json should help
_obj_match_filter
:filter column==regex
:filter column!=regex
look for == or != and if present split and filter the columns case-insensitive
return self._menu(dicts, cols, indicies)
File "/home/ansible-navigator/ansible_navigator/ui_framework/menu_builder.py", line 52, in _menu
convert_percentage(dicts[idx], cols, self._pbar_width)
File "/home/ansible-navigator/ansible_navigator/ui_framework/utils.py", line 23, in convert_percentage
value = dyct[key]
KeyError: 'ansible_network_cli_ssh_type'
Config
---
ansible-navigator:
inventory-columns:
- ansible_network_os
- ansible_network_cli_ssh_type
- ansible_connection
log:
level: debug
no-osc4: True
It would help to visualize what this does
Add argument subparser for config action to parse ansible-config
command-line option to accept path of the configuration file as input in Text user interface (TUI) mode.
Currently, the default config is set to
"ansible-navigator": {
"container-engine": "podman",
"execution-environment": True,
"execution-environment-image": "quay.io/ansible/ansible-runner:devel",
Refer https://github.com/ansible/ansible-navigator/blob/main/ansible_navigator/config.py#L32
When running ansible-navigator with no params and mode set to stdout, the welcome screen is presented.
Typing :config results in the config output on the screen instead of the TUI config mode.
Should we force interactive mode on if no params followed ansible-navigator at the command line?
210406134434.904 DEBUG 'ansible_navigator.main' ini entry: container_engine matched to arg: container_engine
210406134434.904 DEBUG 'ansible_navigator.main' container_engine was not provided, using 'docker'
210406134434.904 DEBUG 'ansible_navigator.main' ini entry: ee_image matched to arg: ee_image
210406134434.904 DEBUG 'ansible_navigator.main' ee_image was not provided, using 'quay.io/ansible/network-ee'
210406134434.904 DEBUG 'ansible_navigator.main' ini entry: execution_environment matched to arg: execution_environment
210406134434.904 DEBUG 'ansible_navigator.main' execution_environment was default, using entry 'False'
210406134434.904 DEBUG 'ansible_navigator.main' ini entry: ide matched to arg: ide
210406134434.904 DEBUG 'ansible_navigator.main' ide was not provided, using 'vscode'
210406134434.904 DEBUG 'ansible_navigator.main' ini entry: inventory_columns matched to arg: inventory_columns
210406134434.904 DEBUG 'ansible_navigator.main' inventory_columns was not provided, using 'ansible_network_os,ansible_network_cli_ssh_type,ansible_connection'
210406134434.904 DEBUG 'ansible_navigator.main' ini entry: loglevel matched to arg: loglevel
210406134434.904 DEBUG 'ansible_navigator.main' loglevel was not provided, using 'debug'
210406134434.904 DEBUG 'ansible_navigator.main' ini entry: no_osc4 matched to arg: no_osc4
210406134434.904 DEBUG 'ansible_navigator.main' no_osc4 was default, using entry 'True'
210406134434.904 DEBUG 'ansible_navigator.main' ini entry: mode matched to arg: navigator_mode
210406134434.904 DEBUG 'ansible_navigator.main' navigator_mode was not provided, using 'stdout'
210406134434.904 DEBUG 'ansible_navigator.main' Collection doc cache: path=/Users/bthornto/.cache/ansible_navigator/collection_doc_cache.db
210406134434.904 DEBUG 'ansible_navigator.main' Collection doc cache: current version=0.6.0
210406134434.911 DEBUG 'ansible_navigator.main' ansible-playbook found at /Users/bthornto/github/ansible-navigator/venv/bin/ansible-playbook
210406134434.912 DEBUG 'ansible_navigator.main' Running with container_engine=docker <class 'str'>
210406134434.912 DEBUG 'ansible_navigator.main' Running with execution_environment=False <class 'bool'>
210406134434.912 DEBUG 'ansible_navigator.main' Running with ee_image=quay.io/ansible/network-ee <class 'str'>
210406134434.912 DEBUG 'ansible_navigator.main' Running with inventory_columns=ansible_network_os,ansible_network_cli_ssh_type,ansible_connection <class 'str'>
210406134434.912 DEBUG 'ansible_navigator.main' Running with ide=vscode <class 'str'>
210406134434.912 DEBUG 'ansible_navigator.main' Running with logfile=/Users/bthornto/github/ansible-navigator/ansible_navigator.log <class 'str'>
210406134434.912 DEBUG 'ansible_navigator.main' Running with loglevel=debug <class 'str'>
210406134434.912 DEBUG 'ansible_navigator.main' Running with no_osc4=True <class 'bool'>
210406134434.912 DEBUG 'ansible_navigator.main' Running with navigator_mode=stdout <class 'str'>
210406134434.912 DEBUG 'ansible_navigator.main' Running with app=config <class 'str'>
210406134434.912 DEBUG 'ansible_navigator.main' Running with cmdline=['list'] <class 'list'>
210406134434.912 DEBUG 'ansible_navigator.main' Running with editor=code -g {filename}:{line_number} <class 'str'>
210406134434.912 DEBUG 'ansible_navigator.main' Running with editor_is_console=False <class 'bool'>
210406134434.912 DEBUG 'ansible_navigator.main' Running with share_dir=/Users/bthornto/github/ansible-navigator/ansible_navigator/../share/ansible_navigator <class 'str'>
210406134434.912 DEBUG 'ansible_navigator.main' Running with cache_dir=/Users/bthornto/.cache/ansible_navigator <class 'str'>
210406134434.912 DEBUG 'ansible_navigator.main' Running with collection_doc_cache={} <class 'kvs.KeyValueStore'>
210406134434.912 DEBUG 'ansible_navigator.main' Running with original_command=['config', 'list'] <class 'list'>
210406134434.912 DEBUG 'ansible_navigator.main' Running with parse_and_update=<function parse_and_update at 0x1083b8040> <class 'function'>
210406134435.025 DEBUG 'ansible_navigator.actions.config.run_stdout' config requested in stdout mode
210406134435.025 DEBUG 'ansible_navigator.runner.api.generate_run_command_args' Runner arg: json_mode:True
210406134435.026 DEBUG 'ansible_navigator.runner.api.generate_run_command_args' Runner arg: quiet:True
210406134435.026 DEBUG 'ansible_navigator.runner.api.generate_run_command_args' Runner arg: envvars:{}
210406134435.026 DEBUG 'ansible_navigator.runner.api.generate_run_command_args' Runner arg: cancel_callback:<bound method BaseRunner.runner_cancelled_callback of <ansible_navigator.runner.api.CommandRunner object at 0x10a15bdc0>>
210406134435.026 DEBUG 'ansible_navigator.runner.api.generate_run_command_args' Runner arg: finished_callback:<bound method BaseRunner.runner_finished_callback of <ansible_navigator.runner.api.CommandRunner object at 0x10a15bdc0>>
210406134435.026 DEBUG 'ansible_navigator.runner.api.generate_run_command_args' Runner arg: cwd:/Users/bthornto/github/ansible-navigator
210406134435.026 DEBUG 'ansible_navigator.runner.api.generate_run_command_args' Runner arg: input_fd:<_io.TextIOWrapper name='<stdin>' mode='r' encoding='utf-8'>
210406134435.026 DEBUG 'ansible_navigator.runner.api.generate_run_command_args' Runner arg: output_fd:<_io.TextIOWrapper name='<stdout>' mode='w' encoding='utf-8'>
210406134435.026 DEBUG 'ansible_navigator.runner.api.generate_run_command_args' Runner arg: error_fd:<_io.TextIOWrapper name='<stderr>' mode='w' encoding='utf-8'>
210406134435.026 DEBUG 'ansible_navigator.runner.api.generate_run_command_args' Runner arg: executable_cmd:/Users/bthornto/github/ansible-navigator/venv/bin/ansible-config
210406134435.026 DEBUG 'ansible_navigator.runner.api.generate_run_command_args' Runner arg: cmdline_args:['list']
-eei should implicitly make execution environment true
ansible-navigator collections
fails when an installed collection is missing plugins
directory. The terminal window resets after running the command.
ansible-navigator collections --ll debug && cat ansible_navigator.log
File "/home/craig/.virtualenvs/ansible_explorer/share/ansible_navigator/utils/catalog_collections.py", line 66, in _catalog_plugins
for f in os.scandir(path + "plugins")
FileNotFoundError: [Errno 2] No such file or directory: '/home/craig/.ansible/collections/ansible_collections/redhat_cop/tower_utilities/plugins'
If I create the ~/.ansible/collections/ansible_collections/redhat_cop/tower_utilities/plugins
directory, it works perfectly
$winston explore cli_parse_test.yaml -i inventory
Traceback (most recent call last):
File "/Users/gnalawad/Documents/ganeshrn/avenv38/bin/winston", line 10, in <module>
sys.exit(main())
File "/Users/gnalawad/Documents/ganeshrn/github/ansible-network/winston/winston/cli.py", line 186, in main
wrapper(app)
File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/curses/__init__.py", line 105, in wrapper
return func(stdscr, *args, **kwds)
File "/Users/gnalawad/Documents/ganeshrn/github/ansible-network/winston/winston/player.py", line 322, in explore
self._run_app()
File "/Users/gnalawad/Documents/ganeshrn/github/ansible-network/winston/winston/player.py", line 351, in _run_app
interaction = self._ui.show(
File "/Users/gnalawad/Documents/ganeshrn/github/ansible-network/winston/winston/ui.py", line 1064, in show
result = self._show_obj_from_list(obj, index, xform or self._xform, await_input)
File "/Users/gnalawad/Documents/ganeshrn/github/ansible-network/winston/winston/ui.py", line 893, in _show_obj_from_list
heading, lines = self._filter_and_serialize(objs[index], xform)
File "/Users/gnalawad/Documents/ganeshrn/github/ansible-network/winston/winston/ui.py", line 874, in _filter_and_serialize
heading = self._custom_heading(obj)
File "/Users/gnalawad/Documents/ganeshrn/github/ansible-network/winston/winston/explorer_ui.py", line 120, in _custom_heading
msg = obj["res"]["msg"].replace("\n", " ").replace("\r", "")
AttributeError: 'list' object has no attribute 'replace'
Playbook:
In my case first task is passing and second tasks fail (intentionally) as the command is invalid.
- hosts: nxos
connection: ansible.netcommon.network_cli
gather_facts: false
tasks:
- name: "Run command and parse with textfsm"
ansible.utils.cli_parse:
command: "show version"
parser:
name: ansible.netcommon.textfsm
register: nxos_textfsm_command
- name: Pass text and command
ansible.netcommon.cli_parse:
command: show interfaces
parser:
name: ansible.netcommon.pyats
command: show interfaces
register: parser_output
Actual playbook logs:
$winston playbook cli_parse_test.yaml -i inventory
[DEPRECATION WARNING]: Use 'ansible.utils.cli_parse' instead. See the plugin
documentation for more details. This feature will be removed from
ansible.netcommon in a release after 2022-11-01. Deprecation warnings can be
disabled by setting deprecation_warnings=False in ansible.cfg.
PLAY [nxos] ********************************************************************
TASK [Run command and parse with textfsm] **************************************
Thursday 10 December 2020 17:26:01 +0530 (0:00:00.137) 0:00:00.137 *****
[WARNING]: Use 'ansible.utils.textfsm' for parser name instead of
'ansible.netcommon.textfsm'. This feature will be removed from
'ansible.netcommon' collection in a release after 2022-11-01
ok: [nxos02]
TASK [Pass text and command] ***************************************************
Thursday 10 December 2020 17:26:08 +0530 (0:00:06.934) 0:00:07.071 *****
fatal: [nxos02]: FAILED! => {"changed": false, "msg": ["show interfaces\r\r\n ^\r\n% Invalid command at '^' marker.\r\n\ran-nxos-02# "]}
PLAY RECAP *********************************************************************
nxos02 : ok=1 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0
Thursday 10 December 2020 17:26:10 +0530 (0:00:01.886) 0:00:08.957 *****
===============================================================================
Run command and parse with textfsm -------------------------------------- 6.93s
Pass text and command --------------------------------------------------- 1.89s
note to self, the utils file is growing and should be cleaned up, will do in a single PR later
Specifically ee_image vs. execution-environment-image
In a small terminal, running :log
cuts off messages and there doesn't seem to be a way to scroll right to see them. (Tested in iTerm2 and mate-terminal)
$TITLE
Add navigation command line help options to display ansible command-line utilities help in stdout mode.
Traceback (most recent call last):
File "/home/gmuniz/Documents/ansible_navigator/ansible-navigator/bin/ansible-launcher", line 33, in <module>
sys.exit(load_entry_point('ansible-launcher==0.6.0', 'console_scripts', 'ansible-launcher')())
File "/home/gmuniz/Documents/ansible_navigator/ansible-navigator/lib64/python3.9/site-packages/ansible_launcher/cli.py", line 294, in main
run(args)
File "/home/gmuniz/Documents/ansible_navigator/ansible-navigator/lib64/python3.9/site-packages/ansible_launcher/cli.py", line 260, in run
wrapper(ActionRunner(args=args).run)
File "/usr/lib64/python3.9/curses/__init__.py", line 94, in wrapper
return func(stdscr, *args, **kwds)
File "/home/gmuniz/Documents/ansible_navigator/ansible-navigator/lib64/python3.9/site-packages/ansible_launcher/action_runner.py", line 51, in run
self._run_app(interaction)
File "/home/gmuniz/Documents/ansible_navigator/ansible-navigator/lib64/python3.9/site-packages/ansible_launcher/action_runner.py", line 60, in _run_app
interaction = run_action(
File "/home/gmuniz/Documents/ansible_navigator/ansible-navigator/lib64/python3.9/site-packages/ansible_launcher/actions/_actions.py", line 68, in call
return action_cls(app.args).run(app=app, interaction=interaction)
File "/home/gmuniz/Documents/ansible_navigator/ansible-navigator/lib64/python3.9/site-packages/ansible_launcher/actions/explore.py", line 309, in run
self._take_step()
File "/home/gmuniz/Documents/ansible_navigator/ansible-navigator/lib64/python3.9/site-packages/ansible_launcher/actions/explore.py", line 504, in _take_step
result = run_action(
File "/home/gmuniz/Documents/ansible_navigator/ansible-navigator/lib64/python3.9/site-packages/ansible_launcher/actions/_actions.py", line 68, in call
return action_cls(app.args).run(app=app, interaction=interaction)
File "/home/gmuniz/Documents/ansible_navigator/ansible-navigator/lib64/python3.9/site-packages/ansible_launcher/actions/rerun.py", line 35, in run
app.rerun()
File "/home/gmuniz/Documents/ansible_navigator/ansible-navigator/lib64/python3.9/site-packages/ansible_launcher/actions/explore.py", line 808, in rerun
if self.runner.finished:
AttributeError: 'NoneType' object has no attribute 'finished'
logging files and artifacts currently overwrite
we should be able to generate docs from the navigator_configuration object now
will need to show the environment variable for each configuration option as well
Should we have a supplemental file (yaml, json) for longer descriptions, usage, example that can help add details to the docs
the runner artifacts should be located within the EE if running with an EE or possibly a tmp directory when running without
ProductName: macOS
ProductVersion: 11.2.1
BuildVersion: 20D74
Python 3.9.2
ansible-navigator 0.6.0
../hosts contains:
[kindle]
192.168.123.111
[kindle:vars]
banter="Ok kindle. Let's automate!"
voice="Daniel"
[all:children]
kindle
pressing 1 to see the hosts crashes:
Traceback (most recent call last):
File "/Users/pgriffit/ansible-navigator_demo/venv/bin/ansible-navigator", line 8, in
sys.exit(main())
File "/Users/pgriffit/ansible-navigator_demo/venv/lib/python3.9/site-packages/ansible_navigator/cli.py", line 327, in main
run(args)
File "/Users/pgriffit/ansible-navigator_demo/venv/lib/python3.9/site-packages/ansible_navigator/cli.py", line 293, in run
wrapper(ActionRunner(args=args).run)
File "/usr/local/Cellar/[email protected]/3.9.2_2/Frameworks/Python.framework/Versions/3.9/lib/python3.9/curses/init.py", line 94, in wrapper
return func(stdscr, *args, **kwds)
File "/Users/pgriffit/ansible-navigator_demo/venv/lib/python3.9/site-packages/ansible_navigator/action_runner.py", line 51, in run
self._run_app(interaction)
File "/Users/pgriffit/ansible-navigator_demo/venv/lib/python3.9/site-packages/ansible_navigator/action_runner.py", line 60, in _run_app
interaction = run_action(
File "/Users/pgriffit/ansible-navigator_demo/venv/lib/python3.9/site-packages/ansible_navigator/actions/_actions.py", line 68, in call
return action_cls(app.args).run(app=app, interaction=interaction)
File "/Users/pgriffit/ansible-navigator_demo/venv/lib/python3.9/site-packages/ansible_navigator/actions/inventory.py", line 196, in run
self._take_step()
File "/Users/pgriffit/ansible-navigator_demo/venv/lib/python3.9/site-packages/ansible_navigator/actions/inventory.py", line 244, in _take_step
result = self._interaction.ui.show(
File "/Users/pgriffit/ansible-navigator_demo/venv/lib/python3.9/site-packages/ansible_navigator/ui_framework/ui.py", line 855, in show
result = self._show_menu(obj, columns, await_input)
File "/Users/pgriffit/ansible-navigator_demo/venv/lib/python3.9/site-packages/ansible_navigator/ui_framework/ui.py", line 790, in _show_menu
menu_heading, menu_lines = self._get_heading_menu_items(current, columns, showing_idxs)
File "/Users/pgriffit/ansible-navigator_demo/venv/lib/python3.9/site-packages/ansible_navigator/ui_framework/ui.py", line 750, in _get_heading_menu_items
menu_heading, menu_items = menu_builder.build(
File "/Users/pgriffit/ansible-navigator_demo/venv/lib/python3.9/site-packages/ansible_navigator/ui_framework/menu_builder.py", line 39, in build
return self._menu(dicts, cols, indicies)
File "/Users/pgriffit/ansible-navigator_demo/venv/lib/python3.9/site-packages/ansible_navigator/ui_framework/menu_builder.py", line 56, in _menu
convert_percentage(dicts[idx], cols, self._pbar_width)
File "/Users/pgriffit/ansible-navigator_demo/venv/lib/python3.9/site-packages/ansible_navigator/ui_framework/utils.py", line 23, in convert_percentage
value = dyct[key]
KeyError: 'ansible_network_os'
Also crashes when selecting groups and selecting the first one.
Some units tests should be timed, although we might not be able to fail based on a threshold value, having the data would be good.
Example-
tokenize large yaml file
catalog collections
others?
In case multiple invalid inventory sources are provided to the run
command in that case a form is prompted asking for the correct inventory path. However if no inventory source is provided inventory option input is not present in the form.
example command
Mulitple invalid inventory source (working scenario)
ansible-navigator run gather.yaml -i test1 -i test2
No inventory source. Ensure inventory is not set in the config file (failing scenario)
ansible-navigator run gather.yaml
I've just installed winston and ran it. Then trying to execute :doc
from the main screen is raising the following exception:
Traceback (most recent call last):
File "/home/elyezer/.virtualenvs/winston/bin/winston", line 33, in <module>
sys.exit(load_entry_point('winston', 'console_scripts', 'winston')())
File "/home/elyezer/code/ansible/winston/winston/cli.py", line 294, in main
run(args)
File "/home/elyezer/code/ansible/winston/winston/cli.py", line 260, in run
wrapper(ActionRunner(args=args).run)
File "/usr/lib64/python3.9/curses/__init__.py", line 94, in wrapper
return func(stdscr, *args, **kwds)
File "/home/elyezer/code/ansible/winston/winston/action_runner.py", line 51, in run
self._run_app(interaction)
File "/home/elyezer/code/ansible/winston/winston/action_runner.py", line 60, in _run_app
interaction = run_action(
File "/home/elyezer/code/ansible/winston/winston/actions/_actions.py", line 68, in call
return action_cls(app.args).run(app=app, interaction=interaction)
File "/home/elyezer/code/ansible/winston/winston/actions/doc.py", line 45, in run
plugin = interaction.content.showing["task_action"]
TypeError: string indices must be integers
I am currently trying on Python 3.9 on Fedora 33.
add GitHub users
Colin McNaughton cloin
Roland Wolters liquidat
Similar to what tox allows:
setenv =
TERM = xterm
passenv = HOME
I think our keys would be set_envvars
and pass_envvars
the first a dict and the later a list
Traditionally, we use a single -
prefix for the one letter parameters and two -
for the long version. e.g -v
or --verbose
. Ansible already uses one letter and I think it would be better to only expose long arguments. This way we avoid any potential clash in the future.
I faced the problem with: ansible-launcher playbook playbooks/router.yaml -i inventory -e @internet.yaml
The error: ansible-launcher: error: ambiguous option: -e could match -ee, -eei
I've verified this in mate-terminal and Konsole (KDE's terminal), but could not reproduce the issue in xterm.
When typing a :
-command like :config
, it's not currently possible in some terminals to backspace characters that were typed which seems problematic.
I have run :inventory
then filled the path to the following inventory on the form and submitted it.
[all]
ec2-54-86-73-255.compute-1.amazonaws.com ansible_user=ec2-user ansible_host=54.86.73.255 ansible_python_interpreter="/usr/libexec/platform-python"
localhost ansible_connection=local ansible_python_interpreter="/usr/libexec/platform-python"
[ungrouped]
[local]
localhost ansible_connection=local ansible_python_interpreter="/usr/libexec/platform-python"
[cloud]
ec2-54-86-73-255.compute-1.amazonaws.com ansible_user=ec2-user ansible_host=54.86.73.255 ansible_python_interpreter="/usr/libexec/platform-python"
[ec2]
ec2-54-86-73-255.compute-1.amazonaws.com ansible_user=ec2-user ansible_host=54.86.73.255 ansible_python_interpreter="/usr/libexec/platform-python"
[rhel-8.3-x86_64]
ec2-54-86-73-255.compute-1.amazonaws.com ansible_user=ec2-user ansible_host=54.86.73.255 ansible_python_interpreter="/usr/libexec/platform-python"
[tower]
ec2-54-86-73-255.compute-1.amazonaws.com ansible_user=ec2-user ansible_host=54.86.73.255 ansible_python_interpreter="/usr/libexec/platform-python"
[instance_group_non_default]
ec2-54-86-73-255.compute-1.amazonaws.com ansible_user=ec2-user ansible_host=54.86.73.255 ansible_python_interpreter="/usr/libexec/platform-python"
Then selected 0 Browse Groups
and then 0 cloud
and the following exception was raised:
Traceback (most recent call last):
File "/home/elyezer/.virtualenvs/winston/bin/winston", line 33, in <module>
sys.exit(load_entry_point('winston', 'console_scripts', 'winston')())
File "/home/elyezer/code/ansible/winston/winston/cli.py", line 294, in main
run(args)
File "/home/elyezer/code/ansible/winston/winston/cli.py", line 260, in run
wrapper(ActionRunner(args=args).run)
File "/usr/lib64/python3.9/curses/__init__.py", line 94, in wrapper
return func(stdscr, *args, **kwds)
File "/home/elyezer/code/ansible/winston/winston/action_runner.py", line 51, in run
self._run_app(interaction)
File "/home/elyezer/code/ansible/winston/winston/action_runner.py", line 60, in _run_app
interaction = run_action(
File "/home/elyezer/code/ansible/winston/winston/actions/_actions.py", line 68, in call
return action_cls(app.args).run(app=app, interaction=interaction)
File "/home/elyezer/code/ansible/winston/winston/actions/inventory.py", line 193, in run
self._take_step()
File "/home/elyezer/code/ansible/winston/winston/actions/inventory.py", line 241, in _take_step
result = self._interaction.ui.show(
File "/home/elyezer/code/ansible/winston/winston/ui_framework/ui.py", line 855, in show
result = self._show_menu(obj, columns, await_input)
File "/home/elyezer/code/ansible/winston/winston/ui_framework/ui.py", line 790, in _show_menu
menu_heading, menu_lines = self._get_heading_menu_items(current, columns, showing_idxs)
File "/home/elyezer/code/ansible/winston/winston/ui_framework/ui.py", line 750, in _get_heading_menu_items
menu_heading, menu_items = menu_builder.build(
File "/home/elyezer/code/ansible/winston/winston/ui_framework/menu_builder.py", line 39, in build
return self._menu(dicts, cols, indicies)
File "/home/elyezer/code/ansible/winston/winston/ui_framework/menu_builder.py", line 56, in _menu
convert_percentage(dicts[idx], cols, self._pbar_width)
File "/home/elyezer/code/ansible/winston/winston/ui_framework/utils.py", line 23, in convert_percentage
value = dyct[key]
KeyError: ''
for instance
ansible-navigator --ee false --eei image --ce docker
If you :inventory -i some_inventory.yaml
The original command line params are lost
You would have to :inventory -i some_inventory.yaml -ee false --eei image --ce docker
which is goofy
(the inventory integration tests have made made to work, but should be cleaned up when this is fixed)
As we've already encountered, the share
dir can cause problems during development and packaging. It seems like most of the items there should just be under various datafile subpackages in the main project tree, and the couple of items that we really want to be user-configurable/augmentable should just be loadable from config dirs (which can be located using something akin to what's there now). At first blush, it seems like themes are the only item that currently falls into that category, or am I wrong?
My primary concern is that we don't repeat the mistakes of /etc/ansible.cfg
and never being able to effectively change or augment defaults by laying down a live all-encompassing config file.
playbook that should fail (the role does not exist)
- hosts: all
gather_facts: true
tasks:
- include_role:
name: brad.foo.ntp
failure with normal ansible-playbook site2.yaml
TASK [include_role : brad.foo.ntp] ***************************************************************************************************************************************************************************
ERROR! the role 'brad.foo.ntp' was not found in /home/student1/ntp_demo/roles:/home/student1/.ansible/roles:/usr/share/ansible/roles:/etc/ansible/roles:/home/student1/ntp_demo
The error appears to be in '/home/student1/ntp_demo/site2.yaml': line 5, column 13, but may
be elsewhere in the file depending on the exact syntax problem.
The offending line appears to be:
- include_role:
name: brad.foo.ntp
^ here
with command ansible-launcher explore site2.yaml -i inventory.yaml
but it says failed in bottom right? very weird
capture screen before and after to detect changes
something like this
"""interact with the tmux session"""
start_time = date.now()
current_screen = self._pane.capture_pane()
self._pane.send_keys(value, suppress_history=False)
updated_screen = self._pane.capture_pane()
while current_screen == updated_screen:
time.sleep(0.1)
updated_screen = self._pane.capture_pane()
if date.now() == start_time > 10s:
break
return updated_screen
In interactive mode, I can type :doc ansible.buildin.file and then pull the examples out with {{ examples }}.
But when I do this same thing on that module with {{ examples | from_yaml }} it spits out a traceback and crashes.
This works on other ansible.builtin.* commands, such as yum.
fwiw updated ansible-navigator from source this am.
$winston explore cli_parse_test.yaml -i inventory
Traceback (most recent call last):
File "/Users/gnalawad/Documents/ganeshrn/avenv38/bin/winston", line 6, in <module>
from winston.cli import main
File "/Users/gnalawad/Documents/ganeshrn/github/ansible-network/winston/winston/cli.py", line 19, in <module>
from .action_runner import ActionRunner
File "/Users/gnalawad/Documents/ganeshrn/github/ansible-network/winston/winston/action_runner.py", line 8, in <module>
from .explorer_ui import ExplorerUi as Ui
File "/Users/gnalawad/Documents/ganeshrn/github/ansible-network/winston/winston/explorer_ui.py", line 7, in <module>
from .ui import UserInterface
File "/Users/gnalawad/Documents/ganeshrn/github/ansible-network/winston/winston/ui.py", line 26, in <module>
from .colorize import Colorize, rgb_to_ansi, hex_to_rgb_curses
File "/Users/gnalawad/Documents/ganeshrn/github/ansible-network/winston/winston/colorize.py", line 24, in <module>
3: curses.A_ITALIC,
AttributeError: module 'curses' has no attribute 'A_ITALIC'
should we try to specify and sync them in the tox.ini and reduce some of the longer lines in the func doc strings?
$(winston) winston --web -ll debug
Traceback (most recent call last):
File "/home/admiller/.virtualenvs/winston/bin/winston", line 8, in <module>
sys.exit(main())
File "/home/admiller/.virtualenvs/winston/lib/python3.9/site-packages/winston/cli.py", line 161, in main
if args.requires_ansible:
AttributeError: 'Namespace' object has no attribute 'requires_ansible'
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.