Giter Site home page Giter Site logo

uoi-io / ansible-haproxy Goto Github PK

View Code? Open in Web Editor NEW
43.0 5.0 47.0 158 KB

Ansible HAproxy role for Unified OpenStack Installer and others.

Home Page: https://smartgic.io

License: Apache License 2.0

Python 7.62% Shell 5.52% Jinja 86.86%
haproxy playbook ansible molecule loadbalancer loadbalancing role ansible-playbook galaxy load-balancer

ansible-haproxy's Introduction

Ansible HAproxy (OpenStack ready)

CI Ansible Galaxy

This role provides support for the installation of HAproxy on current distributions:

  • Rocky Linux 8 / 9
  • Fedora 37 / 38 / 39
  • Debian 10 / 11 / 12
  • Ubuntu 18.04 / 20.04 / 22.04

The role allows you to configure multiple sections of HAproxy:

  • Global section
  • Default section
  • Listen section
  • Frontend section
  • Backend section
  • Peer section
  • Stats section

Requirements

This role requires at least HAproxy 1.5 (SSL native support) and Ansible 2.8.

Role Variables

There are no variables in the vars directory, all variables can be override via the playbook.

Empty variable like haproxy_global_uid wills appears in the /etc/haproxy/haproxy.cfg only if a value is define.

Variable like haproxy_global_stats: [] are arrays, in this example, the array is empty. This variable can be declare in two different ways:

haproxy_global_stats:
  - show-legends
  - show-node
  - refresh 20s
# file: roles/haproxy/defaults/main.yml
# Sysctl
haproxy_bind_nonlocal_ip: true
haproxy_ip_forward: true

# Common
haproxy_mode: system  # or docker
haproxy_firewalld: true
haproxy_selinux: true
haproxy_apt_backports: false
# default value for macOS & Docker; overridden in `vars/{{ ansible_os_family }}.yml`
haproxy_errors_directory: /usr/local/etc/haproxy/errors

# Package customizations
haproxy_package: haproxy
haproxy_selinux_packages:
  - python3-libselinux
  - python3-policycoreutils
haproxy_service: haproxy
haproxy_bin: haproxy
haproxy_config: /etc/haproxy/haproxy.cfg

# Firewall
haproxy_fw_ports:
  - "{{ haproxy_stats_port }}/tcp"

# Global
haproxy_global_maxconn: 4000
haproxy_global_chroot: /var/lib/haproxy
haproxy_global_group: haproxy
haproxy_global_user: haproxy
haproxy_global_uid:
haproxy_global_gid:
haproxy_global_pidfile: /var/run/haproxy.pid
haproxy_global_ca_base:
haproxy_global_crt_base:
haproxy_global_ssl_bind_options:
haproxy_global_ssl_bind_ciphers:
haproxy_global_ssl_bind_ciphersuites:
haproxy_global_ssl_server_options:
haproxy_global_ssl_server_ciphers:
haproxy_global_ssl_server_ciphersuites:
haproxy_global_ssl_server_verify:
haproxy_global_stats: []
haproxy_global_description:
haproxy_global_ulimit_n:
haproxy_global_logs:
  - 127.0.0.1    local0 debug
haproxy_global_daemon: true
# nbproc is deprecated. Will be removed in version 2.5
# haproxy_global_nbproc: 8
# haproxy_global_cpu_maps: [ 1 0, 2 1, 3 2, 4 3, 5 4, 6 5, 7 6, 8 7 ]
haproxy_global_tunes:
  - tune.ssl.default-dh-param: 2048

# Default
haproxy_default_logs:
  - global
haproxy_default_log_format:
haproxy_default_mode:
haproxy_default_maxconn: 4000
haproxy_default_options:
  - dontlognull
  - forwardfor
  - http-server-close
haproxy_default_retries: 3
haproxy_default_timeouts:
  - http-request 10s
  - queue 1m
  - connect 10s
  - client 1m
  - server 1m
  - http-keep-alive 10s
  - check 10s
haproxy_default_balance:
haproxy_default_errorfiles:
  - "400 {{ haproxy_errors_directory }}/400.http"
  - "403 {{ haproxy_errors_directory }}/403.http"
haproxy_default_http_check:
haproxy_default_monitor_uri:
haproxy_default_unique_id_format:

# Userlist
haproxy_userlist:
  - stats-auth:
      groups:
        - "admin users admin"
        - "readonly users user"
      users:
        - "admin insecure-password opqrstuvw"
        - "user insecure-password abcdefghi"

# Stats with HTTP Basic Auth and a single user
haproxy_stats: true
haproxy_stats_address: '*'
haproxy_stats_port: 9001
haproxy_stats_ssl: false
haproxy_stats_user: haproxy-stats
haproxy_stats_password: B1Gp4sSw0rD!!
haproxy_stats_uri: /
haproxy_stats_options:
  - refresh 20s
  - show-legends
  - show-node
  - hide-version
haproxy_stats_http_requests:
  - use-service prometheus-exporter if { path /metrics }
haproxy_stats_listener_options:
  - dontlog-normal
haproxy_stats_timeouts:
  - client 100s
  - server 100s
  - connect 100s
  - queue 100s

# Stats with HTTP Basic Auth using an userlist
haproxy_stats: true
haproxy_stats_address: "::"
haproxy_stats_port: 8081
haproxy_stats_ssl: false
haproxy_stats_uri: /stats
haproxy_stats_auth:
haproxy_stats_acls:
  - "AUTH http_auth(stats-auth)"
  - "AUTH_ADMIN http_auth_group(stats-auth) admin"
haproxy_stats_options:
  - refresh 5s
  - show-legends
  - show-node
  - http-request auth unless AUTH
  - admin if AUTH_ADMIN

# SSL
haproxy_ssl_certificate: /etc/ssl/uoi.io/uoi.io.pem
haproxy_ssl_options: no-sslv3 no-tls-tickets force-tlsv12
haproxy_ssl_ciphers: AES128+EECDH:AES128+EDH
haproxy_ssl: 'ssl crt {{ haproxy_ssl_certificate }} ciphers {{ haproxy_ssl_ciphers }} {{ haproxy_ssl_options }}'

# Docker
# see more details in `tasks/docker.yml` and https://docs.ansible.com/ansible/latest/collections/community/general/docker_container_module.html
haproxy_docker_name: "haproxy"
haproxy_docker_image: "haproxy:alpine"
haproxy_docker_network_mode: default
haproxy_docker_network_name: "haproxy"
haproxy_docker_pull: true
haproxy_docker_recreate: false
haproxy_docker_ports:
  - "8443:8443"
  - "{{ haproxy_stats_port }}:{{ haproxy_stats_port }}"
haproxy_docker_sysctls:
  net.ipv4.ip_nonlocal_bind: "{{ 1 if haproxy_bind_nonlocal_ip|bool else 0 }}"
  net.ipv4.ip_forward: "{{ 1 if haproxy_ip_forward|bool else 0 }}"
  net.core.somaxconn: 4096
  net.ipv4.tcp_syncookies: 1
haproxy_docker_ulimits:
  - "nofile:262144:262144"
haproxy_docker_volumes:
  - {{ haproxy_config }}+":/usr/local/etc/haproxy/haproxy.cfg:ro"

Dependencies

None

Example Playbook

The below examples show you how to define frontend, backend, listen, peer.

# Frontend
haproxy_frontend:
  - dashboard_cluster:
      binds_ssl:
        - :443 ssl crt /etc/ssl/uoi.io/uoi.io.pem no-sslv3
      reqadds:
        - X-Forwarded-Proto:\ https
      default_backend: dashboard_backend
      logs:
        - 127.0.0.1 local0 debug
      acls:
        - url_static path_beg -i /static /images /javascript /stylesheets
        - url_static path_end -i .jpg .gif .png .css .js
      bind_process:
        - 1
      log_formats:
        - "%ci:%cp [%tr] %ft %b/%s %TR/%Tw/%Tc/%Tr/%Ta %ST %B %CC %CS %tsc %ac/%fc/%bc/%sc/%rc %sq/%bq %hr %hs %{+Q}r"
      use_backends:
        - static if url_static
      capture:
        - request header Host len 64
        - request header X-Forwarded-For len 64
# Backend
haproxy_backend:
  - dashboard_backend:
      balance: source
      default_server: "inter 2s downinter 5s rise 3 fall 2 slowstart 30s maxconn 30 maxqueue 64 weight 100"
      http_checks:
        - 'send meth GET uri /check-haproxy.php hdr Host haproxy.check-vhost.de'
        - 'expect string "All services running fine"'
      bind_process:
        - 1
      server_templates:
        - srv 3 service.local:80 check resolvers mydns init-addr none
      servers:
        - ctrl01 10.0.0.67:80 check inter 2000 rise 2 fall 5
        - ctrl02 10.0.0.68:80 check inter 2000 rise 2 fall 5
        - ctrl03 10.0.0.69:80 check inter 2000 rise 2 fall 5
  - static:
      balance: roundrobin
      compression:
        - algo gzip deflate
        - type text/css text/html application/javascript
      bind_process:
        - 1
      servers:
        - cnd01 10.0.0.70:8080 check
        - cnd02 10.0.0.71:8080 check
        - cnd03 10.0.0.71:8080 check
# Listen
haproxy_listen:
  - dashboard_cluster:
      mode: http
      description: Horizon Dashboard
      balance: roundrobin
      default_server: "inter 2s downinter 5s rise 3 fall 2 slowstart 30s maxconn 30 maxqueue 64 weight 100"
      binds:
        - 10.0.0.100:80
      binds_ssl:
        - :443 ssl crt /etc/ssl/uoi.io/uoi.io.pem no-sslv3
      options: [ tcpka, httpchk, tcplog ]
      http-check: GET /auth/login
      cookie: SERVERID insert indirect nocache
      capture:
        - cookie SERVERID len 32
      timeouts:
        - client 90m
        - server 90m
      bind_process:
        - 1
      http_requests:
        - set-header X-Haproxy-Current-Date %T
      servers:
        - ctrl01 10.0.0.67:80 check cookie ctrl01inter 2000 rise 2 fall 5
        - ctrl02 10.0.0.68:80 check cookie ctrl02 inter 2000 rise 2 fall 5
        - ctrl03 10.0.0.69:80 check cookie ctrl03 inter 2000 rise 2 fall 5

  - neutron_api_cluster:
      binds_ssl:
        - 10.0.0.100:9696 {{ haproxy_ssl }}
      options: [ tcpka, httpchk, tcplog ]
      bind_process: [ 2, 3, 4, 5, 6, 7 ]
      balance: source
      servers:
        - ctrl01 10.0.0.62:9696 check inter 2000 rise 2 fall 5
        - ctrl02 10.0.0.63:9696 check inter 2000 rise 2 fall 5
        - ctrl03 10.0.0.64:9696 check inter 2000 rise 2 fall 5
# Peer
haproxy_peer:
  - remote_peers:
      peers:
        - lb223 10.0.0.223:1024
        - lb224 10.0.0.224:1024
        - lb225 10.0.0.225:1024
# Resolvers
haproxy_resolvers:
  - mydns:
      nameservers:
        - 'dns1 10.0.0.1:53'
        - 'dns3 [email protected]:53'
      parse_resolv_conf: true
      resolve_retries: 5
      timeouts:
        - 'resolve 1s'
        - 'retry 1s'
      holds:
        - 'other 30s'
        - 'refused 30s'
        - 'nx 30s'
        - 'valid 30s'

Docker usage example

Here is a short example how to use the role in another playbook and run HAProxy in Docker.

# site.yml
- hosts: haproxy
  name: HAProxy load balancer
  tags:
    - all
    - haproxy
  # can be included either via `role` or `include_role`
  # roles:
  #   - uoi-io.haproxy
  tasks:
    - include_role:
        name: uoi-io.haproxy
# (group_vars|environments/<my env>/group_vars/haproxy.yml)
haproxy_mode: docker
haproxy_config: "{{ docker_persistent_path }}/haproxy/haproxy.cfg"
haproxy_firewalld: false
haproxy_selinux: false
# Global
haproxy_global_chroot: ""
# SSL
haproxy_ssl_certificate: /usr/local/etc/haproxy/ssl/haproxy.crt
# Frontend
haproxy_frontend:
  # ... frontend definition
# Backend
haproxy_backend_checks: "check inter 2000 rise 2 fall 5"
haproxy_backend:
  - my_backend:
      # ... backend definition
      # example that hosts can be dinamically linked based on another group
      servers: |-
        {%- set _list = [] %}
        {%- for _host in groups['MY_BACKEND_GROUP'] %}
          {%- set _list = _list.append(_host.split('.')[0] ~ ' ' ~ _host ~ ':' ~ MY_SERVICE_PORT ~ ' ' ~ haproxy_backend_checks) %}
        {%- endfor %}
        {{- _list }}
# Docker
haproxy_docker_ports:
  - "6443:6443"
  - "{{ haproxy_stats_port }}:{{ haproxy_stats_port }}"
# haproxy_docker_volumes: []
haproxy_docker_volumes:
  - "{{ haproxy_config }}:/usr/local/etc/haproxy/haproxy.cfg:ro"
  - "{{ docker_persistent_path }}/haproxy/haproxy.key:/usr/local/etc/haproxy/ssl/haproxy.crt.key:ro"
  - "{{ docker_persistent_path }}/haproxy/haproxy.crt:/usr/local/etc/haproxy/ssl/haproxy.crt:ro"

RedHat based repository

If you have own repository with HAProxy, you can install repo file. Next example will add repository with HAProxy 2 for CentOS 8

# Repository
haproxy_repo_yum:
  - name: haproxy
    description: HAProxy 2 repository - $basearch
    baseurl: https://download.copr.fedorainfracloud.org/results/pzinchuk/haproxy/epel-8-$basearch/
    priority: 1
    gpgcheck: true
    file: haproxy
    repo_gpgcheck: false
    skip_if_unavailable: true
    gpgkey: https://download.copr.fedorainfracloud.org/results/pzinchuk/haproxy/pubkey.gpg
    enabled: true
    state: present

Testing

This role is using ansible molecule. You'll just need to install molecule via pip and run it. Currently the molecule configuration is based on the docker driver.

apt/yum install docker
systemctl start docker
pip install docker molecule molecule-plugins pytest-testinfra
molecule test

License

Apache

Author Information

This role was created in 2016 by Gaëtan Trellu (goldyfruit).

ansible-haproxy's People

Contributors

bparry02 avatar dlerch-transporeon avatar dricoco avatar dsavineau avatar goldyfruit avatar haydenseitz avatar jimcircadian avatar jkinred avatar magenbrot avatar mathieumd avatar mkayontour avatar nerzhul avatar pavel-z1 avatar schuetzi99 avatar sfuerte avatar tedgin avatar tfamle avatar tgeywitz-transporeon avatar themonkeybrain 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

Watchers

 avatar  avatar  avatar  avatar  avatar

ansible-haproxy's Issues

Can't define multiple http_check options

Hello!
http-check can be defined in backend multiple times, e.g
http-check send ....
http-check expect ...
but now I can see possibility to configure it in role. May I request for adding this feature?

Support "option" in STATS section

Is there any way to pass "option" parameters in the STATS section? Below is an example use case to mute logging from the stats dashboard:

listen stats
    bind       *:8080
    mode       http
    maxconn    10
    stats      enable
    stats      admin if TRUE
    stats      refresh 10s
    stats      show-legends
    stats      show-node
    stats      hide-version
    stats      uri /
    option     dontlog-normal      <---
    timeout    client 100s
    timeout    server 100s
    timeout    connect 100s
    timeout    queue 100s

Missing double quotes on entries in variable haproxy_default_errorfiles ?

On Ansible 2.9:

Error during the configuration

TASK [uoi-io.haproxy : Enabling and starting HAproxy service] *********************************************************
fatal: [helper.ocp10.g1.cms.hpecorp.net]: FAILED! => {"changed": false, "msg": "Unable to start service haproxy: Job fo                                                                                                          r haproxy.service failed because the control process exited with error code.\nSee \"systemctl status haproxy.service\"                                                                                                           and \"journalctl -xe\" for details.\n"}

Systemctl output

[tester@helper ~]$ sudo systemctl status haproxy
● haproxy.service - HAProxy Load Balancer
   Loaded: loaded (/usr/lib/systemd/system/haproxy.service; enabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since Thu 2021-04-15 13:13:55 UTC; 3min 47s ago
  Process: 1430 ExecStartPre=/usr/sbin/haproxy -f $CONFIG -c -q $OPTIONS (code=exited, status=1/FAILURE)


Apr 15 13:13:55 helper haproxy[1430]: [ALERT] 104/131355 (1430) : parsing [/etc/haproxy/haproxy.cfg:35] : error opening file <{{> for custom error message <400>.
Apr 15 13:13:55 helper haproxy[1430]: [ALERT] 104/131355 (1430) : parsing [/etc/haproxy/haproxy.cfg:36] : error opening file <{{> for custom error message <403>.

The config file hasn't been instantiated with variable. Brackets are still present

 errorfile   400 {{ haproxy_errors_directory }}/400.http
 errorfile   403 {{ haproxy_errors_directory }}/403.http

Maybe this is due to the fact default variable should use double quote as jinja brackets variable are used in the line.

So this:

haproxy_default_errorfiles:
  - 400 {{ haproxy_errors_directory }}/400.http
  - 403 {{ haproxy_errors_directory }}/403.http

Should become this:

haproxy_default_errorfiles:
  - "400 {{ haproxy_errors_directory }}/400.http"
  - "403 {{ haproxy_errors_directory }}/403.http"

Provide Tags for stable releases

I want to use your role in production, but without a stable release tag it's not really suitable to use the master.

Can you provide stable release tags for this matter?

haproxy 1.8

Hi, can you confirm could be use on 1.8 version on CentOS ?

Fix RockyLinux 9 Molecule test

Hi @haydenseitz

For some reasons, the sysctl check fails on RockyLinux 9, could you please have a quick look about it?

  TASK [ansible-haproxy : Enabling/Disabling net.ipv4.ip_nonlocal_bind option] ***
  An exception occurred during task execution. To see the full traceback, use -vvv. The error was: FileNotFoundError: [Errno 2] No such file or directory: '/etc/sysctl.d/.ansible_m_sysctl_cmopjkon.conf'
  fatal: [rockylinux9]: FAILED! => {"changed": false, "module_stderr": "Traceback (most recent call last):\n  File \"/root/.ansible/tmp/ansible-tmp-1686226107.6770117-4721-163638435957505/AnsiballZ_sysctl.py\", line 107, in <module>\n    _ansiballz_main()\n  File \"/root/.ansible/tmp/ansible-tmp-1686226107.6770117-4721-163638435957505/AnsiballZ_sysctl.py\", line 99, in _ansiballz_main\n    invoke_module(zipped_mod, temp_path, ANSIBALLZ_PARAMS)\n  File \"/root/.ansible/tmp/ansible-tmp-1686226107.6770117-4721-163638435957505/AnsiballZ_sysctl.py\", line 47, in invoke_module\n    runpy.run_module(mod_name='ansible_collections.ansible.posix.plugins.modules.sysctl', init_globals=dict(_module_fqn='ansible_collections.ansible.posix.plugins.modules.sysctl', _modlib_path=modlib_path),\n  File \"/usr/lib64/python3.9/runpy.py\", line 225, in run_module\n    return _run_module_code(code, init_globals, run_name, mod_spec)\n  File \"/usr/lib64/python3.9/runpy.py\", line 97, in _run_module_code\n    _run_code(code, mod_globals, init_globals,\n  File \"/usr/lib64/python3.9/runpy.py\", line 87, in _run_code\n    exec(code, run_globals)\n  File \"/tmp/ansible_ansible.posix.sysctl_payload_j160ptfc/ansible_ansible.posix.sysctl_payload.zip/ansible_collections/ansible/posix/plugins/modules/sysctl.py\", line 420, in <module>\n  File \"/tmp/ansible_ansible.posix.sysctl_payload_j160ptfc/ansible_ansible.posix.sysctl_payload.zip/ansible_collections/ansible/posix/plugins/modules/sysctl.py\", line 414, in main\n  File \"/tmp/ansible_ansible.posix.sysctl_payload_j160ptfc/ansible_ansible.posix.sysctl_payload.zip/ansible_collections/ansible/posix/plugins/modules/sysctl.py\", line 133, in __init__\n  File \"/tmp/ansible_ansible.posix.sysctl_payload_j160ptfc/ansible_ansible.posix.sysctl_payload.zip/ansible_collections/ansible/posix/plugins/modules/sysctl.py\", line 193, in process\n  File \"/tmp/ansible_ansible.posix.sysctl_payload_j160ptfc/ansible_ansible.posix.sysctl_payload.zip/ansible_collections/ansible/posix/plugins/modules/sysctl.py\", line 369, in write_sysctl\n  File \"/usr/lib64/python3.9/tempfile.py\", line 336, in mkstemp\n    return _mkstemp_inner(dir, prefix, suffix, flags, output_type)\n  File \"/usr/lib64/python3.9/tempfile.py\", line 255, in _mkstemp_inner\n    fd = _os.open(file, flags, 0o600)\nFileNotFoundError: [Errno 2] No such file or directory: '/etc/sysctl.d/.ansible_m_sysctl_cmopjkon.conf'\n", "module_stdout": "", "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error", "rc": 1}

https://github.com/uoi-io/ansible-haproxy/actions/runs/5206388585/jobs/9402736710

Missing options http-request in listen stats block

Hello

I have to add some options in template file , haproxy-stats.cfg.j2
I use the integrated prometheus exporter for haproxy.
So i have to declare
http-request use-service prometheus-exporter if { path /metrics }

To do this, i have added this block in haproxy-stats.cfg.j2

{% for listener_httprequest in haproxy_stats_listener_httprequest %}
    http-request     {{ listener_httprequest }}
{% endfor %}
....
{% for listener_opt in haproxy_stats_listener_options %}
    option     {{ listener_opt }}
{% endfor %}
{% for listener_httprequest in haproxy_stats_listener_httprequest %}
    http-request     {{ listener_httprequest }}
{% endfor %}
    timeout    client 100s
....

Is it possible to update the role and integrate http-request directives ?

Regards

Arnaud

crt-base entry in template wrong

Hi,
I just discovered a mistake in the template file "templates/etc/haproxy/haproxy-global.cfg.j2" which cost me several hours of debugging (im new to ansible ;) )

current state:
{% if haproxy_global_crt_base %}
crt_base {{ haproxy_global_crt_base }}
{% endif %}

should be:
{% if haproxy_global_crt_base %}
crt-base {{ haproxy_global_crt_base }}
{% endif %}

variable capture parsed incorretly by haproxy-frontend.cfg.j2

If variable capture defined like this in frontend section

haproxy_frontend:
  - www.foo-bar.com_cluster:
      mode: http
      binds_ssl:
        - 192.168.17.103:443 ssl crt /home/haproxy/certs/www.foo-bar.com.pem
      capture: request  header Host len 20

thsi will produce the following in haproxy.cfg

capture: r
capture: e
capture: q
capture: u
.
.
.

each charater wil be a variable called capture validation than fails.

As a workaround i have modifyed haproxy-frontend.cfg.j2 not to have the for cycle

from:

{% if value.capture is defined %}
                {% for cap in value.capture %}
    capture         {{ cap }}
                {% endfor %}
            {% endif %}

TO:

        {% if value.capture is defined %}
    capture         {{ value.capture }}
            {% endif %}

            {% if value.capture1 is defined %}
    capture         {{ value.capture1 }}
            {% endif %}
            {% if value.capture2 is defined %}
    capture         {{ value.capture2 }}
            {% endif %}
    
            {% if value.capture3 is defined %}
    capture         {{ value.capture3 }}
            {% endif %}

to allow four capture variable / frontend

Empty default var leads to wrong haproxy.cfg

This empty value leads to broken configuration.

haproxy_default_mode:

/etc/haproxy$ haproxy -f haproxy.cfg -c
[ALERT] 287/110138 (17625) : parsing [haproxy.cfg:40] : unknown proxy mode ''.
[ALERT] 287/110138 (17625) : Error(s) found in configuration file : haproxy.cfg
[ALERT] 287/110138 (17625) : Fatal errors found in configuration.

"include" is deprecated

Ansible tell us that "include" is deprecated:

[DEPRECATION WARNING]: "include" is deprecated, use include_tasks/import_tasks instead...

There are a few includes that should be replace with "include_tasks":

tasks/install.yml
2:- include: install-Debian.yml
5:- include: install-Generic.yml

tasks/main.yml
14:- include: install.yml
18:- include: firewall.yml
22:- include: selinux.yml
26:- include: config.yml
29:- include: sysctl.yml
33:- include: docker.yml

Could you please fix them? Thanks!

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.