Giter VIP home page Giter VIP logo

timesync's Introduction

timesync

ansible-lint.yml ansible-test.yml markdownlint.yml shellcheck.yml woke.yml

This role installs and configures an NTP and/or PTP implementation to operate

as an NTP client and/or PTP slave in order to synchronize the system clock with

NTP servers and/or grandmasters in PTP domains. Supported NTP/PTP implementations are chrony, ntp (the reference implementation) and linuxptp.

Warning

The role replaces the configuration of the given or detected provider service on the managed host. Previous settings will be lost, even if they are not specified in the role variables (no attempt is made to preserve or merge the previous settings, the configuration files are replaced entirely). The only setting which is preserved is the choice of provider if timesync_ntp_provider is not defined (see the description of this variable below).

Requirements

See below

Collection requirements

In order to manage rpm-ostree systems, the role requires modules from external collections. Use the following command to install them:

ansible-galaxy collection install -vv -r meta/collection-requirements.yml

Role Variables

The variables that can be passed to this role are as follows:

# List of NTP servers
timesync_ntp_servers:
  - hostname: foo.example.com   # Hostname or address of the server
    minpoll: 4                  # Minimum polling interval (default 6)
    maxpoll: 8                  # Maximum polling interval (default 10)
    iburst: true                # Flag enabling fast initial synchronization
                                # (default false)
    pool: false                 # Flag indicating that each resolved address
                                # of the hostname is a separate NTP server
                                # (default false)
    nts: false                  # Flag enabling Network Time Security (NTS)
                                # authentication mechanism (default false,
                                # supported only with chrony >= 4.0)
    prefer: false               # Flag marking the source to be preferred for
                                # synchronization over other sources
                                # (default false)
    trust: false                # Flag marking the source to be trusted over
                                # sources that don't have this flag
                                # (default false)
    xleave: false               # Flag enabling interleaved mode (default false)
    filter: 1                   # Number of NTP measurements per clock update
                                # (default 1)

# List of PTP domains
timesync_ptp_domains:
  - number: 0                   # PTP domain number
    interfaces: [eth0]          # List of interfaces in the domain
    delay: 0.000010             # Assumed maximum network delay to the
                                # grandmaster in seconds # wokeignore:rule=master
                                # (default 100 microsecond)
    transport: UDPv4            # Network transport: UDPv4, UDPv6, L2
                                # (default UDPv4)
    udp_ttl: 1                  # TTL for UDPv4 and UDPv6 transports
                                # (default 1)
    hybrid_e2e: false           # Flag enabling unicast end-to-end delay
                                # requests (default false)

# Flag enabling use of NTP servers provided by DHCP (default false)
timesync_dhcp_ntp_servers: false

# Minimum offset of the clock which can be corrected by stepping (default is
# specific to NTP/PTP implementation: chrony 1.0, ntp 0.128, linuxptp 0.00002).
# Zero threshold disables all steps.
timesync_step_threshold: 1.0

# Maximum root distance to accept measurements from NTP servers
# Set to 0 to use provider default
timesync_max_distance: 0

# Minimum number of selectable time sources required to allow synchronization
# of the clock (default 1)
timesync_min_sources: 1

# List of interfaces which should have hardware timestamping enabled for NTP
# (default empty list). As a special value, '*' enables the timestamping on all
# interfaces that support it.
timesync_ntp_hwts_interfaces: ["*"]

# Name of the package which should be installed and configured for NTP.
# Possible values are "chrony" and "ntp". If not defined, the currently active
# or enabled service will be configured. If no service is active or enabled, a
# package specific to the system and its version will be selected.
timesync_ntp_provider: chrony

# Sometimes administrators might need extended configurations for chrony which
# are not covered by the predefined settings provided by this role.
# 'timesync_chrony_custom_settings' allows to define a list of custom settings
# for the chrony.conf file, by providing a list of settings. As an example,
# for debugging, one might need to log mesurements, statistics and tracking.
# This information is usually stored in the /var/log/chrony directory. For
# that, one needs to define two different settings (logdir and log), as
# follows:
timesync_chrony_custom_settings:
  - "logdir /var/log/chrony"
  - "log measurements statistics tracking"

Example Playbooks

Install and configure ntp to synchronize the system clock with three NTP servers:

- name: Manage timesync with 3 servers
  hosts: targets
  vars:
    timesync_ntp_servers:
      - hostname: foo.example.com
        iburst: true
      - hostname: bar.example.com
        iburst: true
      - hostname: baz.example.com
        iburst: true
  roles:
    - linux-system-roles.timesync

Install and configure linuxptp to synchronize the system clock with a

grandmaster in PTP domain number 0, which is accessible on interface eth0:

- name: Manage timesync in PTP domain 0, interface eth0
  hosts: targets
  vars:
    timesync_ptp_domains:
      - number: 0
        interfaces: [eth0]
  roles:
    - linux-system-roles.timesync

Install and configure chrony and linuxptp to synchronize the system clock with multiple NTP servers and PTP domains for a highly accurate and resilient synchronization:

- name: Manage multiple NTP servers and PTP domains
  hosts: targets
  vars:
    timesync_ntp_servers:
      - hostname: foo.example.com
        maxpoll: 6
      - hostname: bar.example.com
        maxpoll: 6
      - hostname: baz.example.com
        maxpoll: 6
    timesync_ptp_domains:
      - number: 0
        interfaces: [eth0, eth1]
        transport: L2
        delay: 0.000010
      - number: 1
        interfaces: [eth2]
        transport: UDPv4
        delay: 0.000010
  roles:
    - linux-system-roles.timesync

Install and configure chrony with multiple NTP servers and custom advanced settings: log measurements, statistics and tracking into /var/log/chrony:

- name: Manage with custom advanced settings
  hosts: targets
  vars:
    timesync_ntp_servers:
      - hostname: foo.example.com
      - hostname: bar.example.com
      - hostname: baz.example.com
    timesync_chrony_custom_settings:
      - "logdir /var/log/chrony"
      - "log measurements statistics tracking"
  roles:
    - linux-system-roles.timesync

rpm-ostree

See README-ostree.md

timesync's People

Contributors

bl4ckfir3 avatar dependabot[bot] avatar hvsharma12 avatar i386x avatar mlichvar avatar mto79 avatar nhosoi avatar paulfantom avatar pavel-z1 avatar pcahyna avatar richm avatar scaronni avatar spetrosi avatar thulium-drake avatar tyll avatar ukulekek avatar vcrhonek avatar yontalcar avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

timesync's Issues

Broken iburst option

The role doesn't check the value of the iburst option, only that it exists. Adding "iburst: no" to a server enables the iburst.

Adding the timesync_ntp_allow variable for setuping a server as source server

We started to use the role in a private cloud and we are using a single server that connect to externals ntp servers for synchronization while other are offline.

We would like to use it as an NTP server and client at the same time.
From what I read we need to use the configuration allow https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/system_administrators_guide/sect-understanding_chrony_and-its_configuration

We should add a new variable to handle this in timesync/templates/chrony.conf.j2, for example:

timesync_allow_network:
  - ip_net: 127.0.1.0/24

Which would result in the vars like this:

{% if timesync_allow_network is defined %}
{% for value in timesync_allow_network %}
{{ 'allow' if 'ip_net' in value and value['ip_net'] }} {{value['ip_net'] }}
{% endfor %}
{% endif %}

Resulting in in the configuration as follow :

allow 127.0.1.0/24

Destination directory /etc/sysconfig does not exist

Hey,

Brand new to Ansible so sorry if this is just me being dumb but trying to run this and getting the following error:

TASK [linux-system-roles.timesync : Generate chronyd sysconfig file] ***************************************************************************************************************************************
fatal: [192.168.0.129]: FAILED! => {"changed": false, "checksum": "c86b9165a42f39a42071825554f79870abaee593", "msg": "Destination directory /etc/sysconfig does not exist"}

This is just using the example configuration from the readme.

- hosts: servers
  vars:
    timesync_ntp_servers:
      - hostname: 0.europe.pool.ntp.org
        iburst: yes
      - hostname: 1.europe.pool.ntp.org
        iburst: yes
      - hostname: 2.europe.pool.ntp.org
        iburst: yes
  roles:
    - linux-system-roles.timesync

Have I done something wrong here?

This role do not respect chrony paths for Ubuntu

All path below
/etc/chrony# ls -la
total 20
drwxr-xr-x 4 root root 75 May 25 08:49 .
drwxr-xr-x 105 root root 8192 Jul 17 12:47 ..
-rw-r--r-- 1 root root 2232 Feb 8 2022 chrony.conf
-rw-r----- 1 root root 481 Feb 8 2022 chrony.keys
drwxr-xr-x 2 root root 20 May 25 08:49 conf.d
drwxr-xr-x 2 root root 20 May 25 08:49 sources.d

DNS TXT & SRV record lookup capabilities (aka FreeIPA support)

Hi linux-system-roles community

While volunteering at my local community radio station rabe I found myself writing a smallish wrapper role to to the linux-system-roles/timesync role to automate our deploy on a FreeIPA based domain.

Similar to what ipa-client-install does I found the DNS SRV records to be a handy way to get to the needed information. At the core of my PoC role is the following:

- name: "Find ntp servers in SRV records"
  set_fact: 
    rabe_ntp_servers: "{{ lookup('dig', '_ntp._udp.' + rabe_int_domain + './SRV', 'flat=0') | json_query('[*].target') }}"

- name: "Format dns results for linux-system-roles.timesync"
  set_fact:
    rabe_lsr_timesync_ntp_servers: "{{rabe_lsr_timesync_ntp_servers|default([]) + [ {'hostname': item, 'iburst':true} ] }}"
  with_items: "{{ rabe_ntp_servers }}"

- name: "Configure ntp using galaxy role and variables from dns"
  include_role:
    name: linux-system-roles.timesync
  vars:
    ntp_servers: "{{ rabe_lsr_timesync_ntp_servers }}"

After having implemented that I started thinking of adding full discovery based on ansible_fqdn by doing a lookup on the _kerberos TXT record to form the actual lookup.

Would this be a feature that you would welcome in a pull request? I was thinking that the feature would off by default but easily activated by using an ipa=true var.

I'm not sure if PTP is relevant to this case. I am planning our own PTP rollout but it seems to have it's own discovery protocols that are semi standardized. Any input on howto PTP are gladly appreciated and I'd add what's needed to an eventual IPA support PR.

I'd like to add this feature to your upstream repo. Let me know if you're ok with that and I'll refactor my code intro something PR worthy.

Thanks for coding what seems to be the most complete timesync module in the galaxy ๐Ÿ˜œ
Lucas

tests_ptp_multi.yml fails on RHEL 8

From the logs:

TASK [Run pmc] *********************************************************************************************************************************************************************************************
task path: /tmp/tmpm7q5012t/tests/tests_ptp_multi.yml:42
changed: [/home/till/lsr-test-harness-files/cache/rhel-guest-image-8.0-1854.x86_64.qcow2] => {"changed": true, "cmd": ["pmc", "-u", "-b", "0", "-d", "0", "-s", "/var/run/timemaster/ptp4l.0.socket", "GET DOMAIN"], "delta": "0:00:00.104295", "end": "2019-05-25 05:47:21.447882", "rc": 0, "start": "2019-05-25 05:47:21.343587", "stderr": "", "stderr_lines": [], "stdout": "sending: GET DOMAIN", "stdout_lines": ["sending: GET DOMAIN"]}

TASK [Check PTP domain] ************************************************************************************************************************************************************************************
task path: /tmp/tmpm7q5012t/tests/tests_ptp_multi.yml:46
fatal: [/home/till/lsr-test-harness-files/cache/rhel-guest-image-8.0-1854.x86_64.qcow2]: FAILED! => {
    "assertion": "'domainNumber 0' in pmc.stdout",
    "changed": false,
    "evaluated_to": false,
    "msg": "Assertion failed"
}

Errors in check mode

I am playing with this module for the first time - still slightly inexperienced with ansible but following the instructions and hitting a wall generating ntp.conf

TASK [linux-system-roles.timesync : Generate ntp.conf file] ********************************************
fatal: [tumbleweed-x]: FAILED! => {"changed": false, "msg": "AnsibleFilterError: Version comparison: 'dict object' has no attribute 'stdout'"}

I am trying to get the basics to work and then looking at modifying this role/module to incorporate settings for timekeeper. - I am also looking for options to use this on SLES if possible.

{{ ansible_managed | comment }}

Hello,

at the template files you are using # {{ ansible_managed }}.
In the Ansible documentation is described how to distribute ansible_managed to several lines for better readability.

It can be done by {{ ansible_managed | comment }}.

Could you please adapt the template files from # {{ ansible_managed }} to {{ ansible_managed | comment }}?

Thank you very much.

Best regards

chrony.conf ubuntu crash

The timesync role places the chrony.conf into /etc for each OS. Ubuntu (DEBIAN) expects the config in the /etc/chrony/ directory. Should be handled inside /tasks/main.yml as os specific variable.

- name: Generate chrony.conf file
  template:
    src: chrony.conf.j2
    dest: /etc/chrony.conf
    backup: true
    mode: 0644
  notify: restart {{ 'chronyd' if timesync_mode == 1 else 'timemaster' }}
  when:
    - timesync_mode != 2
    - timesync_ntp_provider == 'chrony'
    - "'chrony' in ansible_facts.packages"

RFE: Add option for noselect to the timesync_ntp_servers options

noselect is a valid option for server & pool entries for both chronyd and ntpd. It has usefulness when you want to have a reference clock available but not utilized as a synchronization option such as in a tightly controlled network. It would be a boolean value, much the same as pool or nts.

bad Galaxy score because of whitespace warnings

Ansible Galaxy gives timesync a quality score of 2.5/5 solely because of whitespace warnings in tests. The import page says:

===== LINTING ROLE =====
 yamllint Warnings:
 ./tests/tests_default.yml:1:1: [error] too many blank lines (1 > 0) (empty-lines)
 ./tests/tests_ntp.yml:1:1: [error] too many blank lines (1 > 0) (empty-lines)
 ./tests/tests_ntp_provider1.yml:1:1: [error] too many blank lines (1 > 0) (empty-lines)
 ./tests/tests_ntp_provider2.yml:1:1: [error] too many blank lines (1 > 0) (empty-lines)
 ./tests/tests_ntp_provider3.yml:1:1: [error] too many blank lines (1 > 0) (empty-lines)
 ./tests/tests_ntp_provider4.yml:1:1: [error] too many blank lines (1 > 0) (empty-lines)
 ./tests/tests_ntp_provider5.yml:1:1: [error] too many blank lines (1 > 0) (empty-lines)
 ./tests/tests_ntp_provider6.yml:1:1: [error] too many blank lines (1 > 0) (empty-lines)
 ./tests/tests_ntp_ptp.yml:1:1: [error] too many blank lines (1 > 0) (empty-lines)
 ./tests/tests_ptp_multi.yml:1:1: [error] too many blank lines (1 > 0) (empty-lines)
 ./tests/tests_ptp_single.yml:1:1: [error] too many blank lines (1 > 0) (empty-lines)

Tests are not checked by Molecule which otherwise does a yamllint pass over the role, so this did not get caught.

refactor setting of use of DHCP for NTP servers

#92 has the logic in the template to consider various versions of chrony and operating system and platform. This should be refactored into vars/ files.

Have vars/Fedora.yml like this:

timesync_can_use_dhcp_ntp_servers: "{{ 'yes' if __timesync_chrony_version is version('4.0', '>=') else 'no' }}"

Then for the fedora platforms that do not support it e.g. vars/Fedora_32.yml, vars/Fedora_31.yml (don't need to go back before that as Fedora 30 is EOL):

timesync_can_use_dhcp_ntp_servers: no

create vars/RedHat.yml like this:

timesync_can_use_dhcp_ntp_servers: no

Also add that to vars/RedHat_6.yml and vars/CentOS_6.yml

Then create vars/RedHat_9.yml and vars/CentOS_9.yml like Fedora.yml:

timesync_can_use_dhcp_ntp_servers: "{{ 'yes' if __timesync_chrony_version is version('4.0', '>=') else 'no' }}"

Then the logic in templates/chrony.conf.j2 can be simplified like this:


{% if timesync_dhcp_ntp_servers and timesync_can_use_dhcp_ntp_servers %}
# Use NTP servers from DHCP.
sourcedir /run/chrony-dhcp

{% endif %}

timesync failes on fedora35 trying to disable ntpd service because it is not installed

Hello,

When applying the timesync role on fedora35 it tries to disable ntpd and it failed because it is not installed.

somehow it failed to check that ntpd was not installed.

ansible and collections versions

ansible [core 2.12.0]
  config file = /home/rob/code/playbooks/ansible.cfg
  configured module search path = ['/home/rob/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /home/rob/code/playbooks/venv/lib64/python3.10/site-packages/ansible
  ansible collection location = /home/rob/.ansible/collections:/usr/share/ansible/collections
  executable location = /home/rob/code/playbooks/venv/bin/ansible
  python version = 3.10.0 (default, Oct  4 2021, 00:00:00) [GCC 11.2.1 20210728 (Red Hat 11.2.1-1)]
  jinja version = 3.0.2
  libyaml = True

ansible-galaxy collection list                                                                            ๎‚ฒ 127 ๎‚ฒ ๎‚  master 

# /home/rob/.ansible/collections/ansible_collections
Collection                Version
------------------------- -------
RobVerduijn.lab           0.1.2  
ansible.netcommon         2.4.0  
ansible.posix             1.3.0  
ansible.utils             2.4.2  
ansible.windows           1.8.0  
community.crypto          2.0.0  
community.general         4.0.1  
community.libvirt         1.0.2  
community.windows         1.8.0  
fedora.linux_system_roles 1.10.1 
freeipa.ansible_freeipa   0.4.2  
theforeman.foreman        3.0.0  
theforeman.operations     0.3.0

Suggestion: configure timezone

I consider configuring a timezone to be part of making sure the system displays the correct time.

Do you guys agree? If so, I can make a PR that will implement it :-)

Deprecation Warnings

The following warning is displayed at several places if I turn the warnings on:

[DEPRECATION WARNING]: Using tests as filters is deprecated. Instead of using result|version_compare use result is version_compare. This feature will be
removed in version 2.9. Deprecation warnings can be disabled by setting deprecation_warnings=False in ansible.cfg.

I suppose that is a fairly simple fix.

role fails in check mode if not having been executed in normal mode before

Followup to #27 .

We fixed failures in check mode some time ago and now the role does not fail if executed in check mode after having been executed in normal mode. There is still a problem though when the role is executed in check mode on a fresh system (without having been applied in normal mode before), because it assumes that some packages are installed, and in check mode they do not get installed. This is the case described in ansible/molecule#128 (comment) (note that the current Molecule setup does not test for it, as explained in that link).
The change submitted by @hhaniel in #27 (comment) should fix this case as well.
Test playbook:

- name: Ensure that the role runs with default parameters
  hosts: all
  roles:
    - name: timesync
      vars:
        timesync_ntp_provider: ntp

error:

TASK [timesync : Get ntp version] **********************************************
fatal: [/home/pcahyna/linux-system-roles-testing/local/CentOS-7-x86_64-GenericCloud-1702.qcow2c]: FAILED! => {"changed": false, "cmd": ["rpm", "-q", "--qf", "%{version}", "ntp"], "delta": "0:00:00.033978", "end": "2019-09-30 14:53:22.430978", "msg": "non-zero return code", "rc": 1, "start": "2019-09-30 14:53:22.397000", "stderr": "", "stderr_lines": [], "stdout": "package ntp is not installed", "stdout_lines": ["package ntp is not installed"]}

PLAY RECAP *********************************************************************
/home/pcahyna/linux-system-roles-testing/local/CentOS-7-x86_64-GenericCloud-1702.qcow2c : ok=3 changed=1 unreachable=0 failed=1 skipped=9 rescued=0 ignored=0

Potential typo on timesync Galaxy docs

I'm not 100% sure if this is the correct repo to report this issue to. If I need to be directed somewhere else, please let me know.

On the timesync Galaxy page README (https://galaxy.ansible.com/linux-system-roles/timesync), I believe there's a typo at the bottom of the example playbook reference.

Specifically, here:

  roles:
    - timesync

When I execute this playbook using the preceding role definition, I get an error saying that timesync is not a valid role. However, the playbook correctly executes when defining it like this:

  roles:
    - linux-system-roles.timesync

I think timesync needs to be switched to linux-system-roles.timesync. Thanks! :)

Tests on rhel-7 are failing

See the CI results on #3. Note that the PR did not change anything relevant AFAICT and it merely triggered a test run. The error is "No package matching 'linuxptp' found available, installed or updated". The same error was already noted in the last comment on #1.

Surprisingly, the tests pass for CentOS 7.

Feature request: support for systemd-timesyncd

systemd-timesyncd offers very basic NTP time synchronization support, but is often times sufficient. Is there a reason why this Ansible system role does not support it? If not, is there an interest to receive a pull request for this? Has it maybe been tried before and should I be aware of any caveats? I couldn't find any closed issues on the topic.

Feature request: "prefer" keyword for 'server' and 'peer' commands

The 'prefer' keyword is a standard config setting for ntp and chrony applications, and is commonly in use (in my experience). I don't see in the documentation here or downstream for rhel-system-roles that the 'prefer' keyword is supported. I've specified in vars 'prefer: true' and applied the role, but it does not configure the keyword in my targets chrony.conf (I was testing if this was an undocumented feature).

It would be helpful to add support for this standard and seemingly somewhat simple parameter.

Thanks for your consideration.

Tests on rhel-6 are failing

See the CI results on #3 . Note that the PR did not change anything relevant AFAICT and it merely triggered a test run. The error is "no package matching 'chrony' found available, installed or updated".

Surprisingly, the tests pass for CentOS 6.

Conscious Language: Please rename master branch to main branch

As part of the conscious language project, the master branch is to be renamed to the main branch.

Here are the instructions.

  1. Rename the master branch to main: https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/managing-branches-in-your-repository/renaming-a-branch
  2. Check this to ensure the default branch has been changed to main: https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/managing-branches-in-your-repository/changing-the-default-branch - this should keep the github history, as well as updating the default branch configuration and updating any existing PRs

If you use the gh cli (highly recommended) you can use this to check which repos need to be updated:

gh repo list linux-system-roles -L 100 --json name,defaultBranchRef --source | \
  jq --raw-output '.[] | select(.defaultBranchRef.name == "master") | .name'

Thanks.

ansible-lint reports errors

See https://travis-ci.com/vcrhonek/timesync/builds/107422467

--> Executing Ansible Lint on /home/travis/build/vcrhonek/timesync/tests/tests_default.yml...
[204] Lines should be no longer than 160 chars
/home/travis/build/vcrhonek/timesync/tests/roles/linux-system-roles.timesync/tasks/main.yml:11
when: timesync_mode is not defined and (timesync_ntp_servers|length == 0) and timesync_ptp_domains|length == 1 and timesync_ptp_domains[0].interfaces|length == 1

[602] Don't compare to empty string
/home/travis/build/vcrhonek/timesync/tests/roles/linux-system-roles.timesync/tasks/main.yml:20
  when: timesync_mode != 2 and (timesync_ntp_provider is not defined or timesync_ntp_provider == '')

[602] Don't compare to empty string
/home/travis/build/vcrhonek/timesync/tests/roles/linux-system-roles.timesync/tasks/main.yml:24
    timesync_ntp_provider: "{{ timesync_ntp_provider_os_default if timesync_ntp_provider_current == '' else timesync_ntp_provider_current }}"

[602] Don't compare to empty string
/home/travis/build/vcrhonek/timesync/tests/roles/linux-system-roles.timesync/tasks/main.yml:25
  when: timesync_mode != 2 and (timesync_ntp_provider is not defined or timesync_ntp_provider == '')

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.