linux-formula | |||||
============= | |||||
0.0.1 (2015-08-03) | |||||
- Initial formula setup |
Copyright (c) 2014-2015 tcp cloud a. s. | |||||
Licensed under the Apache License, Version 2.0 (the "License"); | |||||
you may not use this file except in compliance with the License. | |||||
You may obtain a copy of the License at | |||||
http://www.apache.org/licenses/LICENSE-2.0 | |||||
Unless required by applicable law or agreed to in writing, software | |||||
distributed under the License is distributed on an "AS IS" BASIS, | |||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||||
See the License for the specific language governing permissions and | |||||
limitations under the License. |
===== | |||||
Linux | |||||
===== | |||||
Linux Operating Systems. | |||||
* Ubuntu | |||||
* CentOS | |||||
* RedHat | |||||
* Fedora | |||||
* Arch | |||||
Sample pillars | |||||
============== | |||||
Linux system | |||||
------------ | |||||
Basic Linux box | |||||
.. code-block:: yaml | |||||
linux: | |||||
system: | |||||
enabled: true | |||||
name: 'node1' | |||||
domain: 'domain.com' | |||||
cluster: 'system' | |||||
environment: prod | |||||
timezone: 'Europe/Prague' | |||||
utc: true | |||||
Linux with system users, sowe with password set | |||||
.. code-block:: yaml | |||||
linux: | |||||
system: | |||||
... | |||||
user: | |||||
jdoe: | |||||
name: 'jdoe' | |||||
enabled: true | |||||
sudo: true | |||||
shell: /bin/bash | |||||
full_name: 'Jonh Doe' | |||||
home: '/home/jdoe' | |||||
email: 'jonh@doe.com' | |||||
jsmith: | |||||
name: 'jsmith' | |||||
enabled: true | |||||
full_name: 'Password' | |||||
home: '/home/jsmith' | |||||
password: userpassword | |||||
Linux with package, latest version | |||||
.. code-block:: yaml | |||||
linux: | |||||
system: | |||||
... | |||||
package: | |||||
package-name: | |||||
version: latest | |||||
Linux with package from certail repo, version with no upgrades | |||||
.. code-block:: yaml | |||||
linux: | |||||
system: | |||||
... | |||||
package: | |||||
package-name: | |||||
version: 2132.323 | |||||
repo: 'custom-repo' | |||||
hold: true | |||||
Linux with package from certail repo, version with no GPG verification | |||||
.. code-block:: yaml | |||||
linux: | |||||
system: | |||||
... | |||||
package: | |||||
package-name: | |||||
version: 2132.323 | |||||
repo: 'custom-repo' | |||||
verify: false | |||||
Linux with cron jobs | |||||
.. code-block:: yaml | |||||
linux: | |||||
system: | |||||
... | |||||
job: | |||||
cmd1: | |||||
command: '/cmd/to/run' | |||||
enabled: true | |||||
user: 'root' | |||||
hour: 2 | |||||
minute: 0 | |||||
Repositories | |||||
~~~~~~~~~~~~ | |||||
RedHat based Linux with additional OpenStack repo | |||||
.. code-block:: yaml | |||||
linux: | |||||
system: | |||||
... | |||||
repo: | |||||
rdo-icehouse: | |||||
enabled: true | |||||
source: 'http://repos.fedorapeople.org/repos/openstack/openstack-icehouse/epel-6/' | |||||
pgpcheck: 0 | |||||
Ensure system repository to use czech Debian mirror (``default: true``) | |||||
Also pin it's packages with priority 900. | |||||
.. code-block:: yaml | |||||
linux: | |||||
system: | |||||
repo: | |||||
debian: | |||||
default: true | |||||
source: "deb http://ftp.cz.debian.org/debian/ jessie main contrib non-free" | |||||
# Import signing key from URL if needed | |||||
key_url: "http://dummy.com/public.gpg" | |||||
pin: | |||||
- pin: 'origin "ftp.cz.debian.org"' | |||||
priority: 900 | |||||
package: '*' | |||||
Linux network | |||||
------------- | |||||
Linux with network manager | |||||
.. code-block:: yaml | |||||
linux: | |||||
network: | |||||
enabled: true | |||||
network_manager: true | |||||
Linux with default static network interfaces, default gateway interface and DNS servers | |||||
.. code-block:: yaml | |||||
linux: | |||||
network: | |||||
enabled: true | |||||
interface: | |||||
eth0: | |||||
enabled: true | |||||
type: eth | |||||
address: 192.168.0.102 | |||||
netmask: 255.255.255.0 | |||||
gateway: 192.168.0.1 | |||||
name_servers: | |||||
- 8.8.8.8 | |||||
- 8.8.4.4 | |||||
mtu: 1500 | |||||
Linux with bonded interfaces | |||||
.. code-block:: yaml | |||||
linux: | |||||
network: | |||||
enabled: true | |||||
interface: | |||||
eth0: | |||||
type: eth | |||||
... | |||||
eth1: | |||||
type: eth | |||||
... | |||||
bond0: | |||||
enabled: true | |||||
type: bond | |||||
address: 192.168.0.102 | |||||
netmask: 255.255.255.0 | |||||
mtu: 1500 | |||||
use_in: | |||||
- interface: ${linux:interface:eth0} | |||||
- interface: ${linux:interface:eth0} | |||||
Linux with wireless interface parameters | |||||
.. code-block:: yaml | |||||
linux: | |||||
network: | |||||
enabled: true | |||||
gateway: 10.0.0.1 | |||||
default_interface: eth0 | |||||
interface: | |||||
wlan0: | |||||
type: eth | |||||
wireless: | |||||
essid: example | |||||
key: example_key | |||||
security: wpa | |||||
priority: 1 | |||||
Linux networks with routes defined | |||||
.. code-block:: yaml | |||||
linux: | |||||
network: | |||||
enabled: true | |||||
gateway: 10.0.0.1 | |||||
default_interface: eth0 | |||||
interface: | |||||
eth0: | |||||
type: eth | |||||
route: | |||||
default: | |||||
address: 192.168.0.123 | |||||
netmask: 255.255.255.0 | |||||
gateway: 192.168.0.1 | |||||
Native Linux Bridges | |||||
.. code-block:: yaml | |||||
linux: | |||||
network: | |||||
interface: | |||||
eth1: | |||||
enabled: true | |||||
type: eth | |||||
proto: manual | |||||
up_cmds: | |||||
- ip address add 0/0 dev $IFACE | |||||
- ip link set $IFACE up | |||||
down_cmds: | |||||
- ip link set $IFACE down | |||||
br-ex: | |||||
enabled: true | |||||
type: bridge | |||||
address: ${linux:network:host:public_local:address} | |||||
netmask: 255.255.255.0 | |||||
use_interfaces: | |||||
- eth1 | |||||
OpenVswitch Bridges | |||||
.. code-block:: yaml | |||||
linux: | |||||
network: | |||||
bridge: openvswitch | |||||
interface: | |||||
eth1: | |||||
enabled: true | |||||
type: eth | |||||
proto: manual | |||||
up_cmds: | |||||
- ip address add 0/0 dev $IFACE | |||||
- ip link set $IFACE up | |||||
down_cmds: | |||||
- ip link set $IFACE down | |||||
br-ex: | |||||
enabled: true | |||||
type: bridge | |||||
address: ${linux:network:host:public_local:address} | |||||
netmask: 255.255.255.0 | |||||
use_interfaces: | |||||
- eth1 | |||||
Linux with proxy | |||||
.. code-block:: yaml | |||||
linux: | |||||
network: | |||||
... | |||||
proxy: | |||||
host: proxy.domain.com | |||||
port: 3128 | |||||
Linux with hosts | |||||
.. code-block:: yaml | |||||
linux: | |||||
network: | |||||
... | |||||
host: | |||||
node1: | |||||
address: 192.168.10.200 | |||||
names: | |||||
- node2.domain.com | |||||
- service2.domain.com | |||||
node2: | |||||
address: 192.168.10.201 | |||||
names: | |||||
- node2.domain.com | |||||
- service2.domain.com | |||||
Linux storage pillars | |||||
--------------------- | |||||
Linux with mounted Samba | |||||
.. code-block:: yaml | |||||
linux: | |||||
storage: | |||||
enabled: true | |||||
mount: | |||||
samba1: | |||||
- path: /media/myuser/public/ | |||||
- device: //192.168.0.1/storage | |||||
- file_system: cifs | |||||
- options: guest,uid=myuser,iocharset=utf8,file_mode=0777,dir_mode=0777,noperm | |||||
Linux with file swap | |||||
.. code-block:: yaml | |||||
linux: | |||||
storage: | |||||
enabled: true | |||||
swap: | |||||
file: | |||||
enabled: true | |||||
engine: file | |||||
device: /swapfile | |||||
size: 1024 | |||||
Usage | |||||
===== | |||||
Set mtu of network interface eth0 to 1400 | |||||
.. code-block:: bash | |||||
ip link set dev eth0 mtu 1400 | |||||
Read more | |||||
========= | |||||
* https://www.archlinux.org/ | |||||
* http://askubuntu.com/questions/175172/how-do-i-configure-proxies-in-ubuntu-server-or-minimal-cli-ubuntu |
0.2 |
salt-formula-linux (0.2) trusty; urgency=medium | |||||
* First public release | |||||
-- Filip Pytloun <filip.pytloun@tcpcloud.eu> Tue, 06 Oct 2015 16:38:46 +0200 | |||||
salt-formula-linux (0.1) trusty; urgency=medium | |||||
* Initial release | |||||
-- Ales Komarek <ales.komarek@tcpcloud.eu> Thu, 13 Aug 2015 23:23:41 +0200 |
9 |
Source: salt-formula-linux | |||||
Maintainer: Ales Komarek <ales.komarek@tcpcloud.eu> | |||||
Section: admin | |||||
Priority: optional | |||||
Build-Depends: debhelper (>= 9) | |||||
Standards-Version: 3.9.6 | |||||
Homepage: http://www.tcpcloud.eu | |||||
Vcs-Browser: https://github.com/tcpcloud/salt-formula-linux | |||||
Vcs-Git: https://github.com/tcpcloud/salt-formula-linux.git | |||||
Package: salt-formula-linux | |||||
Architecture: all | |||||
Depends: ${misc:Depends}, salt-master, reclass | |||||
Description: Linux salt formula | |||||
Configure Linux operating system. |
Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ | |||||
Upstream-Name: salt-formula-linux | |||||
Upstream-Contact: Ales Komarek <ales.komarek@tcpcloud.eu> | |||||
Source: https://github.com/tcpcloud/salt-formula-linux | |||||
Files: * | |||||
Copyright: 2014-2015 tcp cloud a.s. | |||||
License: Apache-2.0 | |||||
Copyright (C) 2014-2015 tcp cloud a.s. | |||||
. | |||||
Licensed under the Apache License, Version 2.0 (the "License"); | |||||
you may not use this file except in compliance with the License. | |||||
. | |||||
On a Debian system you can find a copy of this license in | |||||
/usr/share/common-licenses/Apache-2.0. |
README.rst | |||||
CHANGELOG.rst | |||||
VERSION |
linux/* /usr/share/salt-formulas/env/linux/ | |||||
metadata/service/* /usr/share/salt-formulas/reclass/service/linux/ |
#!/usr/bin/make -f | |||||
%: | |||||
dh $@ | |||||
3.0 (native) |
{%- from "linux/map.jinja" import network with context %} | |||||
Acquire::http::proxy "http://{{ network.proxy.host }}:{{ network.proxy.port }}/"; | |||||
Acquire::ftp::proxy "ftp://{{ network.proxy.host }}:{{ network.proxy.port }}/"; | |||||
Acquire::https::proxy "https://{{ network.proxy.host }}:{{ network.proxy.port }}/"; |
LoadPlugin cpu | |||||
LoadPlugin df | |||||
LoadPlugin disk | |||||
LoadPlugin entropy | |||||
LoadPlugin interface | |||||
LoadPlugin memory | |||||
LoadPlugin processes | |||||
LoadPlugin swap | |||||
LoadPlugin uptime | |||||
LoadPlugin users | |||||
<Plugin df> | |||||
# Device "/dev/sda1" | |||||
# Device "192.168.0.2:/mnt/nfs" | |||||
# MountPoint "/home" | |||||
# FSType "ext3" | |||||
# ignore rootfs; else, the root file-system would appear twice, causing | |||||
# one of the updates to fail and spam the log | |||||
FSType rootfs | |||||
# ignore the usual virtual / temporary file-systems | |||||
FSType sysfs | |||||
FSType proc | |||||
FSType devtmpfs | |||||
FSType devpts | |||||
FSType tmpfs | |||||
FSType fusectl | |||||
FSType cgroup | |||||
IgnoreSelected true | |||||
# ReportByDevice false | |||||
# ReportReserved false | |||||
# ReportInodes false | |||||
</Plugin> | |||||
<Plugin disk> | |||||
# Disk "hda" | |||||
# Disk "/sda[23]/" | |||||
IgnoreSelected true | |||||
</Plugin> |
{{ pillar.linux.system.name }} |
filter { | |||||
if [type] == "syslog" { | |||||
grok { | |||||
match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" } | |||||
add_field => [ "received_at", "%{@timestamp}" ] | |||||
add_field => [ "received_from", "%{host}" ] | |||||
} | |||||
syslog_pri { } | |||||
date { | |||||
match => [ "syslog_timestamp", "MMM d HH:mm:ss", "MMM dd HH:mm:ss" ] | |||||
} | |||||
} | |||||
} |
{ | |||||
"paths": [ | |||||
"/var/log/syslog", | |||||
"/var/log/auth.log" | |||||
], | |||||
"fields": { "type": "syslog" } | |||||
} |
{%- from "linux/map.jinja" import storage with context %} | |||||
## | |||||
## This is a template multipath-tools configuration file | |||||
## Uncomment the lines relevent to your environment | |||||
## | |||||
{% set backend = storage.get('backend', 'default') %} | |||||
{%- if backend in ['hitachi', 'hds', 'HDS'] %} | |||||
defaults { | |||||
# udev_dir /dev | |||||
# polling_interval 10 | |||||
# selector "round-robin 0" | |||||
# path_grouping_policy multibus | |||||
# getuid_callout "/lib/udev/scsi_id --whitelisted --device=/dev/%n" | |||||
# prio const | |||||
# path_checker directio | |||||
# rr_min_io 100 | |||||
# flush_on_last_del no | |||||
# max_fds 8192 | |||||
# rr_weight priorities | |||||
# failback immediate | |||||
# no_path_retry fail | |||||
# queue_without_daemon no | |||||
user_friendly_names no | |||||
# mode 644 | |||||
# uid 0 | |||||
# gid disk | |||||
} | |||||
{%- elif backend in ['fujitsu'] %} | |||||
defaults { | |||||
user_friendly_names no | |||||
} | |||||
blacklist { | |||||
wwid "355cd2e404b76b*" | |||||
} | |||||
devices { | |||||
device { | |||||
vendor "FUJITSU" | |||||
product "ETERNUS_DXL" | |||||
prio alua | |||||
path_grouping_policy group_by_prio | |||||
path_selector "round-robin 0" | |||||
failback immediate | |||||
no_path_retry 0 | |||||
path_checker tur | |||||
dev_loss_tmo 2097151 | |||||
fast_io_fail_tmo 1 | |||||
} | |||||
} | |||||
{%- else %} | |||||
defaults { | |||||
getuid_callout "/lib/udev/scsi_id --whitelisted --device=/dev/%n" | |||||
user_friendly_names no | |||||
} | |||||
blacklist { | |||||
# wwid 26353900f02796769 | |||||
# devnode "^(ram|raw|loop|fd|md|dm-|sr|scd|st)[0-9]*" | |||||
# devnode "^hd[a-z][[0-9]*]" | |||||
# device { | |||||
# vendor DEC.* | |||||
# product MSA[15]00 | |||||
# } | |||||
# | |||||
# POZOR - filtrace vseho krome blacklistovanych veci | |||||
# | |||||
# wwid "*" | |||||
} | |||||
blacklist_exceptions { | |||||
# devnode "^dasd[c-d]+[0-9]*" | |||||
# wwid "IBM.75000000092461.4d00.34" | |||||
# wwid 3600507680280050cd000000000000035 | |||||
# wwid 3600507680280050cd000000000000030 | |||||
# wwid 3600507680280050cd0000000000000ac | |||||
# wwid 3600507680280050cd0000000000003df | |||||
wwid "*" | |||||
} | |||||
devices { | |||||
device { | |||||
vendor "IBM" | |||||
product "2145" | |||||
path_grouping_policy group_by_prio | |||||
getuid_callout "/lib/udev/scsi_id --whitelisted --device=/dev/%n" | |||||
features "1 queue_if_no_path" | |||||
prio alua | |||||
path_checker tur | |||||
failback immediate | |||||
no_path_retry "5" | |||||
rr_min_io 1 | |||||
polling_interval 30 | |||||
dev_loss_tmo 120 | |||||
} | |||||
} | |||||
{%- endif %} |
## | |||||
## This is a template multipath-tools configuration file | |||||
## Uncomment the lines relevent to your environment | |||||
## | |||||
defaults { | |||||
# udev_dir /dev | |||||
# polling_interval 10 | |||||
# selector "round-robin 0" | |||||
# path_grouping_policy multibus | |||||
# getuid_callout "/lib/udev/scsi_id --whitelisted --device=/dev/%n" | |||||
# prio const | |||||
# path_checker directio | |||||
# rr_min_io 100 | |||||
# flush_on_last_del no | |||||
# max_fds 8192 | |||||
# rr_weight priorities | |||||
# failback immediate | |||||
# no_path_retry fail | |||||
# queue_without_daemon no | |||||
user_friendly_names no | |||||
# mode 644 | |||||
# uid 0 | |||||
# gid disk | |||||
} |
{%- from "linux/map.jinja" import system with context %} | |||||
{%- set repo = system.repo[repo_name] %} | |||||
{%- for pin in repo.pin %} | |||||
{%- set package = pin.get('package', '*') %} | |||||
Package: {{ package }} | |||||
Pin: {{ pin.pin }} | |||||
Pin-Priority: {{ pin.priority }} | |||||
{% endfor %} |
{%- from "linux/map.jinja" import network with context %} | |||||
export http_proxy="http://{{ network.proxy.host }}:{{ network.proxy.port }}/" | |||||
export https_proxy="http://{{ network.proxy.host }}:{{ network.proxy.port }}/" | |||||
export ftp_proxy="http://{{ network.proxy.host }}:{{ network.proxy.port }}/" | |||||
export no_proxy="localhost,127.0.0.1,localaddress,.localdomain.com" | |||||
export HTTP_PROXY="http://{{ network.proxy.host }}:{{ network.proxy.port }}/" | |||||
export HTTPS_PROXY="http://{{ network.proxy.host }}:{{ network.proxy.port }}/" | |||||
export FTP_PROXY="http://{{ network.proxy.host }}:{{ network.proxy.port }}/" | |||||
export NO_PROXY="localhost,127.0.0.1,localaddress,.localdomain.com" |
local_linux_system_zombie_procs: | |||||
command: "PATH=$PATH:/usr/lib64/nagios/plugins:/usr/lib/nagios/plugins check_procs -w 1 -c 5 -s Z" | |||||
interval: 60 | |||||
occurrences: 3 | |||||
subscribers: | |||||
- local-linux-system | |||||
local_linux_system_total_procs: | |||||
command: "PATH=$PATH:/usr/lib64/nagios/plugins:/usr/lib/nagios/plugins check_procs -w 1500 -c 3000" | |||||
interval: 60 | |||||
occurrences: 5 | |||||
subscribers: | |||||
- local-linux-system | |||||
local_linux_system_load: | |||||
command: "PATH=$PATH:/usr/lib64/nagios/plugins:/usr/lib/nagios/plugins check_load -r -w 6,4,2 -c 12,8,4" | |||||
interval: 60 | |||||
occurrences: 1 | |||||
subscribers: | |||||
- local-linux-system | |||||
local_linux_storage_swap_usage: | |||||
command: "PATH=$PATH:/usr/lib64/nagios/plugins:/usr/lib/nagios/plugins check_swap -a -w 50% -c 20%" | |||||
interval: 60 | |||||
occurrences: 1 | |||||
subscribers: | |||||
- local-linux-storage | |||||
local_linux_storage_disk_usage: | |||||
command: "PATH=$PATH:/usr/lib64/nagios/plugins:/usr/lib/nagios/plugins check_disk -w 15% -c 5% -p / -p /var -p /usr -p /tmp -p /var/log" | |||||
interval: 60 | |||||
occurrences: 1 | |||||
subscribers: | |||||
- local-linux-storage | |||||
local_linux_network_fqdn: | |||||
command: "PATH=$PATH:/etc/sensu/plugins check_fqdn.py -n :::hostname::: -f :::fqdn:::" | |||||
interval: 60 | |||||
occurrences: 1 | |||||
subscribers: | |||||
- local-linux-network |
{%- for name, repo in default_repos.iteritems() %} | |||||
# Repository {{ name }} | |||||
{{ repo.source }} | |||||
{%- endfor %} |
# managed by salt | |||||
# user {{ user_name }} is system administrator. | |||||
# It has passwordless sudo functionality. | |||||
{{ user_name }} ALL=(ALL) NOPASSWD:ALL |
{%- set interface = salt['pillar.get']('linux:network:interface:'+interface_name) %} | |||||
Interface={{ interface_name }} | |||||
Connection=wireless | |||||
Security={{ interface.wireless.security }} | |||||
ESSID={{ interface.wireless.essid }} | |||||
IP=dhcp | |||||
Key={{ interface.wireless.key }} | |||||
Priority={{ interface.wireless.get('priority', '1') }} |
{%- if pillar.linux is defined %} | |||||
include: | |||||
{%- if pillar.linux.system is defined %} | |||||
- linux.system | |||||
{%- endif %} | |||||
{%- if pillar.linux.network is defined %} | |||||
- linux.network | |||||
{%- endif %} | |||||
{%- if pillar.linux.storage is defined %} | |||||
- linux.storage | |||||
{%- endif %} | |||||
{%- endif %} |
{% set system = salt['grains.filter_by']({ | |||||
'Arch': { | |||||
'pkgs': ['sudo', 'vim', 'wget'], | |||||
'utc': true, | |||||
'user': {}, | |||||
'group': {}, | |||||
'job': {}, | |||||
'repo': {}, | |||||
'package': {}, | |||||
'selinux': 'permissive', | |||||
'ca_certs_dir': '/usr/local/share/ca-certificates', | |||||
}, | |||||
'Debian': { | |||||
'pkgs': ['python-apt','vim'], | |||||
'utc': true, | |||||
'user': {}, | |||||
'group': {}, | |||||
'job': {}, | |||||
'repo': {}, | |||||
'package': {}, | |||||
'selinux': 'permissive', | |||||
'ca_certs_dir': '/usr/local/share/ca-certificates', | |||||
}, | |||||
'RedHat': { | |||||
'pkgs': ['policycoreutils', 'policycoreutils-python', 'vim-enhanced', 'telnet', 'wget'], | |||||
'utc': true, | |||||
'user': {}, | |||||
'group': {}, | |||||
'job': {}, | |||||
'repo': {}, | |||||
'package': {}, | |||||
'selinux': 'permissive', | |||||
'ca_certs_dir': '/usr/local/share/ca-certificates', | |||||
}, | |||||
}, grain='os_family', merge=salt['pillar.get']('linux:system')) %} | |||||
{# 'network_name', #} | |||||
{% set interface_params = [ | |||||
'gateway', | |||||
'mtu', | |||||
'network', | |||||
'broadcast', | |||||
'master', | |||||
'miimon', | |||||
'mode', | |||||
'lacp-rate', | |||||
'dns-search', | |||||
'up_cmds', | |||||
'pre_up_cmds', | |||||
'post_up_cmds', | |||||
'down_cmds', | |||||
'pre_down_cmds', | |||||
'post_down_cmds', | |||||
] %} | |||||
{% set network = salt['grains.filter_by']({ | |||||
'Arch': { | |||||
'pkgs': ['wpa_supplicant', 'dhclient', 'wireless_tools'], | |||||
'bridge_pkgs': ['bridge-utils'], | |||||
'ovs_pkgs': ['openvswitch-switch'], | |||||
'hostname_file': '/etc/hostname', | |||||
'network_manager': False, | |||||
'interface': {}, | |||||
'interface_params': interface_params, | |||||
'bridge': 'none', | |||||
'proxy': { | |||||
'host': 'none', | |||||
}, | |||||
'host': {}, | |||||
}, | |||||
'Debian': { | |||||
'hostname_file': '/etc/hostname', | |||||
'bridge_pkgs': ['bridge-utils'], | |||||
'ovs_pkgs': ['openvswitch-switch'], | |||||
'network_manager': False, | |||||
'interface': {}, | |||||
'interface_params': interface_params, | |||||
'bridge': 'none', | |||||
'proxy': { | |||||
'host': 'none', | |||||
}, | |||||
'host': {}, | |||||
}, | |||||
'RedHat': { | |||||
'bridge_pkgs': ['bridge-utils'], | |||||
'ovs_pkgs': ['openvswitch-switch'], | |||||
'hostname_file': '/etc/sysconfig/network', | |||||
'network_manager': False, | |||||
'interface': {}, | |||||
'interface_params': interface_params, | |||||
'bridge': 'none', | |||||
'proxy': { | |||||
'host': 'none', | |||||
}, | |||||
'host': {}, | |||||
}, | |||||
}, grain='os_family', merge=salt['pillar.get']('linux:network')) %} | |||||
{% set storage = salt['grains.filter_by']({ | |||||
'Arch': { | |||||
'mount': {}, | |||||
'swap': {}, | |||||
'multipath': False, | |||||
}, | |||||
'Debian': { | |||||
'mount': {}, | |||||
'swap': {}, | |||||
'multipath': False, | |||||
'multipath_pkgs': ['multipath-tools'] | |||||
}, | |||||
'RedHat': { | |||||
'mount': {}, | |||||
'swap': {}, | |||||
'multipath': False, | |||||
}, | |||||
}, grain='os_family', merge=salt['pillar.get']('linux:storage')) %} |
{%- from "linux/map.jinja" import network with context %} | |||||
{%- if network.enabled %} | |||||
{%- for name, host in network.host.iteritems() %} | |||||
{%- if host.names is defined %} | |||||
linux_host_{{ name }}: | |||||
host.present: | |||||
- ip: {{ host.address }} | |||||
- names: {{ host.names }} | |||||
{%- endif %} | |||||
{%- endfor %} | |||||
{%- endif %} |
{%- from "linux/map.jinja" import network with context %} | |||||
{%- if network.enabled %} | |||||
{%- if grains.os_family in ['Arch', 'Debian'] %} | |||||
linux_hostname_file: | |||||
file.managed: | |||||
- name: {{ network.hostname_file }} | |||||
- source: salt://linux/files/hostname | |||||
- template: jinja | |||||
- user: root | |||||
- group: root | |||||
- mode: 644 | |||||
- watch_in: | |||||
- cmd: linux_enforce_hostname | |||||
{%- endif %} | |||||
linux_enforce_hostname: | |||||
cmd.wait: | |||||
- name: hostname {{ network.hostname }} | |||||
{# | |||||
linux_hostname_hosts: | |||||
host.present: | |||||
- ip: {{ grains.ip4_interfaces[network.get('default_interface', 'eth0')][0] }} | |||||
- names: | |||||
- {{ network.fqdn }} | |||||
- {{ network.hostname }} | |||||
#} | |||||
{%- endif %} |
{%- from "linux/map.jinja" import network with context %} | |||||
include: | |||||
- linux.network.hostname | |||||
{%- if network.host|length > 0 %} | |||||
- linux.network.host | |||||
{%- endif %} | |||||
{%- if network.interface|length > 0 %} | |||||
- linux.network.interface | |||||
{%- endif %} | |||||
- linux.network.proxy |
{%- from "linux/map.jinja" import network with context %} | |||||
{%- from "linux/map.jinja" import system with context %} | |||||
{%- if network.enabled %} | |||||
{%- macro set_param(param_name, param_dict) -%} | |||||
{%- if param_dict.get(param_name, False) -%} | |||||
- {{ param_name }}: {{ param_dict[param_name] }} | |||||
{%- endif -%} | |||||
{%- endmacro -%} | |||||
{%- if network.bridge != 'none' %} | |||||
linux_network_bridge_pkgs: | |||||
pkg.installed: | |||||
{%- if network.bridge == 'openvswitch' %} | |||||
- names: {{ network.ovs_pkgs }} | |||||
{%- else %} | |||||
- names: {{ network.bridge_pkgs }} | |||||
{%- endif %} | |||||
{%- endif %} | |||||
{%- if not network.network_manager %} | |||||
{# TODO stop/disable/uninstall network manager #} | |||||
{%- for interface_name, interface in network.interface.iteritems() %} | |||||
{%- if interface.get('managed', True) %} | |||||
{%- if grains.os_family in ['RedHat', 'Debian'] %} | |||||
{%- if interface.type == 'bridge' and network.bridge == 'openvswitch' %} | |||||
linux_interface_{{ interface_name }}: | |||||
network.managed: | |||||
- enabled: {{ interface.enabled }} | |||||
- name: {{ interface_name }} | |||||
- type: eth | |||||
{%- if interface.address is defined %} | |||||
- proto: {{ interface.get('proto', 'static') }} | |||||
- ipaddr: {{ interface.address }} | |||||
- netmask: {{ interface.netmask }} | |||||
{%- else %} | |||||
- proto: {{ interface.get('proto', 'dhcp') }} | |||||
{%- endif %} | |||||
{%- if interface.name_servers is defined %} | |||||
- dns: {{ interface.name_servers }} | |||||
{%- endif %} | |||||
{%- for param in network.interface_params %} | |||||
{{ set_param(param, interface) }} | |||||
{%- endfor %} | |||||
{%- if interface.wireless is defined and grains.os_family == 'Debian' %} | |||||
{%- if interface.wireless.security == "wpa" %} | |||||
- wpa-ssid: {{ interface.wireless.essid }} | |||||
- wpa-psk: {{ interface.wireless.key }} | |||||
{%- else %} | |||||
- wireless-ssid: {{ interface.wireless.essid }} | |||||
- wireless-psk: {{ interface.wireless.key }} | |||||
{%- endif %} | |||||
{%- endif %} | |||||
- require: | |||||
- pkg: linux_network_bridge_pkgs | |||||
{%- for network in interface.use_interfaces %} | |||||
- network: linux_interface_{{ network }} | |||||
{%- endfor %} | |||||
linux_ovs_bridge_{{ interface_name }}: | |||||
cmd.run: | |||||
- name: ovs-vsctl add-br {{ interface_name }} | |||||
- unless: ovs-vsctl show | grep 'Bridge {{ interface_name }}' | |||||
- require: | |||||
- network: linux_interface_{{ interface_name }} | |||||
{%- for port in interface.use_interfaces %} | |||||
linux_ovs_bridge_{{ interface_name }}_port_{{ port }}: | |||||
cmd.run: | |||||
- name: ovs-vsctl add-port {{ interface_name }} {{ port }} | |||||
- unless: ovs-vsctl show | grep 'Interface "{{ interface_name }}"' | |||||
- require: | |||||
- cmd: linux_ovs_bridge_{{ interface_name }} | |||||
{%- endfor %} | |||||
{%- else %} | |||||
linux_interface_{{ interface_name }}: | |||||
network.managed: | |||||
- enabled: {{ interface.enabled }} | |||||
- name: {{ interface_name }} | |||||
- type: {{ interface.type }} | |||||
{%- if interface.address is defined %} | |||||
- proto: {{ interface.get('proto', 'static') }} | |||||
- ipaddr: {{ interface.address }} | |||||
- netmask: {{ interface.netmask }} | |||||
{%- else %} | |||||
- proto: {{ interface.get('proto', 'dhcp') }} | |||||
{%- endif %} | |||||
{%- if interface.name_servers is defined %} | |||||
- dns: {{ interface.name_servers }} | |||||
{%- endif %} | |||||
{%- if interface.wireless is defined and grains.os_family == 'Debian' %} | |||||
{%- if interface.wireless.security == "wpa" %} | |||||
- wpa-ssid: {{ interface.wireless.essid }} | |||||
- wpa-psk: {{ interface.wireless.key }} | |||||
{%- else %} | |||||
- wireless-ssid: {{ interface.wireless.essid }} | |||||
- wireless-psk: {{ interface.wireless.key }} | |||||
{%- endif %} | |||||
{%- endif %} | |||||
{%- for param in network.interface_params %} | |||||
{{ set_param(param, interface) }} | |||||
{%- endfor %} | |||||
{%- if interface.type == 'bridge' %} | |||||
- bridge: {{ interface_name }} | |||||
- delay: 0 | |||||
- bypassfirewall: True | |||||
- use: | |||||
{%- for network in interface.use_interfaces %} | |||||
- network: {{ network }} | |||||
{%- endfor %} | |||||
- ports: {% for network in interface.use_interfaces %}{{ network }} {% endfor %} | |||||
- require: | |||||
{%- for network in interface.use_interfaces %} | |||||
- network: linux_interface_{{ network }} | |||||
{%- endfor %} | |||||
{%- endif %} | |||||
{%- if interface.gateway is defined %} | |||||
linux_system_network: | |||||
network.system: | |||||
- enabled: {{ interface.enabled }} | |||||
- hostname: {{ network.fqdn }} | |||||
{%- if interface.gateway is defined %} | |||||
- gateway: {{ interface.gateway }} | |||||
- gatewaydev: {{ interface_name }} | |||||
{%- endif %} | |||||
- nozeroconf: True | |||||
- nisdomain: {{ system.domain }} | |||||
- require_reboot: False | |||||
{%- endif %} | |||||
{%- endif %} | |||||
{%- endif %} | |||||
{%- if interface.wireless is defined %} | |||||
{%- if grains.os_family == 'Arch' %} | |||||
linux_network_packages: | |||||
pkg.installed: | |||||
- names: {{ network.pkgs }} | |||||
/etc/netctl/network_{{ interface.wireless.essid }}: | |||||
file.managed: | |||||
- source: salt://linux/files/wireless | |||||
- mode: 755 | |||||
- template: jinja | |||||
- require: | |||||
- pkg: linux_network_packages | |||||
- defaults: | |||||
interface_name: {{ interface_name }} | |||||
switch_profile_{{ interface.wireless.essid }}: | |||||
cmd.run: | |||||
- name: netctl switch-to network_{{ interface.wireless.essid }} | |||||
- cwd: /root | |||||
- unless: "iwconfig {{ interface_name }} | grep -e 'ESSID:\"{{ interface.wireless.essid }}\"'" | |||||
- require: | |||||
- file: /etc/netctl/network_{{ interface.wireless.essid }} | |||||
enable_profile_{{ interface.wireless.essid }}: | |||||
cmd.run: | |||||
- name: netctl enable network_{{ interface.wireless.essid }} | |||||
- cwd: /root | |||||
- unless: test -e /etc/systemd/system/multi-user.target.wants/netctl@network_{{ interface.wireless.essid }}.service | |||||
- require: | |||||
- file: /etc/netctl/network_{{ interface.wireless.essid }} | |||||
{%- endif %} | |||||
{%- endif %} | |||||
{%- endif %} | |||||
{%- if interface.route is defined %} | |||||
linux_network_{{ interface_name }}_routes: | |||||
network.routes: | |||||
- name: {{ interface_name }} | |||||
- routes: | |||||
{%- for route_name, route in interface.route.iteritems() %} | |||||
- name: {{ route_name }} | |||||
ipaddr: {{ route.address }} | |||||
netmask: {{ route.netmask }} | |||||
gateway: {{ route.gateway }} | |||||
{%- endfor %} | |||||
{%- endif %} | |||||
{%- endfor %} | |||||
{%- endif %} | |||||
{%- endif %} |
{%- from "linux/map.jinja" import network with context %} | |||||
{%- if network.enabled %} | |||||
{%- if grains.os_family == 'Debian' %} | |||||
{%- if network.proxy.host == 'none' %} | |||||
/etc/profile.d/proxy.sh: | |||||
file.absent | |||||
/etc/apt/apt.conf.d/95proxies: | |||||
file.absent | |||||
{%- else %} | |||||
/etc/apt/apt.conf.d/95proxies: | |||||
file.managed: | |||||
- template: jinja | |||||
- source: salt://linux/files/95proxies | |||||
{%- endif %} | |||||
{%- endif %} | |||||
{%- endif %} |
{%- from "linux/map.jinja" import storage with context %} | |||||
{%- if storage.mount|length > 0 or storage.swap|length > 0 or storage.multipath %} | |||||
include: | |||||
{%- if storage.mount|length > 0 %} | |||||
- linux.storage.mount | |||||
{%- endif %} | |||||
{%- if storage.swap|length > 0 %} | |||||
- linux.storage.swap | |||||
{%- endif %} | |||||
{%- if storage.multipath %} | |||||
- linux.storage.multipath | |||||
{%- endif %} | |||||
{%- endif %} |
{%- from "linux/map.jinja" import storage with context %} | |||||
{%- if storage.enabled %} | |||||
{%- for name, mount in storage.mount.iteritems() %} | |||||
{%- if mount.enabled %} | |||||
mkfs_{{ mount.device}}: | |||||
cmd.run: | |||||
- name: "mkfs.{{ mount.file_system }} -L {{ name }} {{ mount.device }}" | |||||
- onlyif: "test `blkid {{ mount.device }} >/dev/null;echo $?` -eq 2" | |||||
- require_in: | |||||
- mount: {{ mount.path }} | |||||
{{ mount.path }}: | |||||
mount.mounted: | |||||
- device: {{ mount.device }} | |||||
- fstype: {{ mount.file_system }} | |||||
- mkmnt: True | |||||
- opts: {{ mount.get('opts', 'defaults,noatime') }} | |||||
{%- endif %} | |||||
{%- endfor %} | |||||
{%- endif %} |
{%- from "linux/map.jinja" import storage with context %} | |||||
{%- if storage.enabled %} | |||||
{%- if grains.os_family == 'Debian' %} | |||||
linux_multipath_pkgs: | |||||
pkg.installed: | |||||
- names: {{ storage.multipath_pkgs }} | |||||
{%- if storage.multipath.backend not in ['fujitsu'] %} | |||||
linux_multipath_boot_pkg: | |||||
pkg.installed: | |||||
- name: multipath-tools-boot | |||||
{%- endif %} | |||||
{%- if storage.multipath.backend == 'HDS' %} | |||||
/etc/multipath.conf: | |||||
file.managed: | |||||
- source: salt://linux/files/multipath.conf.hds | |||||
- template: jinja | |||||
- require: | |||||
- pkg: linux_multipath_pkgs | |||||
{%- else %} | |||||
/etc/multipath.conf: | |||||
file.managed: | |||||
- source: salt://linux/files/multipath.conf | |||||
- template: jinja | |||||
- require: | |||||
- pkg: linux_multipath_pkgs | |||||
{%- endif %} | |||||
multipath_service: | |||||
service.running: | |||||
- enable: True | |||||
- name: multipath-tools | |||||
- watch: | |||||
- file: /etc/multipath.conf | |||||
- sig: multipathd | |||||
{%- endif %} | |||||
{%- endif %} |
{%- from "linux/map.jinja" import storage with context %} | |||||
{%- if storage.enabled %} | |||||
{%- for swap_name, swap in storage.swap.iteritems() %} | |||||
{%- if swap.enabled %} | |||||
{%- if swap.engine == 'file' %} | |||||
linux_create_swap_file_{{ swap.device }}: | |||||
cmd.run: | |||||
- name: 'dd if=/dev/zero of={{ swap.device }} bs=1048576 count={{ swap.size }} && chmod 0600 {{ swap.device }}' | |||||
- creates: {{ swap.device }} | |||||
linux_set_swap_file_{{ swap.device }}: | |||||
cmd.wait: | |||||
- name: 'mkswap {{ swap.device }}' | |||||
- watch: | |||||
- cmd: linux_create_swap_file_{{ swap.device }} | |||||
linux_set_swap_file_status_{{ swap.device }}: | |||||
cmd.run: | |||||
- name: 'swapon {{ swap.device }}' | |||||
- unless: grep {{ swap.device }} /proc/swaps | |||||
- require: | |||||
- cmd: linux_set_swap_file_{{ swap.device }} | |||||
{{ swap.device }}: | |||||
mount.swap: | |||||
- persist: True | |||||
- require: | |||||
- cmd: linux_set_swap_file_{{ swap.device }} | |||||
{%- endif %} | |||||
{%- endif %} | |||||
{%- endfor %} | |||||
{%- endif %} |
{%- from "linux/map.jinja" import system with context %} | |||||
include: | |||||
- linux.system.package | |||||
{%- if system.apparmor.enabled %} | |||||
apparmor_service: | |||||
service.running: | |||||
- name: apparmor | |||||
- enable: true | |||||
- require: | |||||
- pkg: linux_packages | |||||
{%- else %} | |||||
apparmor_service_disable: | |||||
service.dead: | |||||
name: apparmor | |||||
enable: false | |||||
apparmor_teardown: | |||||
cmd.wait: | |||||
- name: /etc/init.d/apparmor teardown | |||||
- watch: | |||||
- service: apparmor_service_disable | |||||
{%- endif %} |
{%- from "linux/map.jinja" import system with context %} | |||||
{%- if system.enabled %} | |||||
{%- if system.ca_certificates is defined %} | |||||
{%- for certificate in system.ca_certificates %} | |||||
{{ system.ca_certs_dir }}/{{ certificate }}.crt: | |||||
file.managed: | |||||
- source: salt://pki/{{ certificate }}/{{ certificate }}-chain.cert.pem | |||||
- watch_in: | |||||
- cmd: update_certificates | |||||
{%- endfor %} | |||||
update_certificates: | |||||
cmd.wait: | |||||
- name: /usr/sbin/update-ca-certificates | |||||
{%- endif %} | |||||
{%- endif %} |
{%- from "linux/map.jinja" import system with context %} | |||||
{%- if system.enabled %} | |||||
{%- for group_name, group in system.group.iteritems() %} | |||||
{%- if group.enabled %} | |||||
system_group_{{ group_name }}: | |||||
group.present: | |||||
- name: {{ group.name }} | |||||
{%- if group.system is defined and group.system %} | |||||
- system: True | |||||
{%- endif %} | |||||
{%- if group.gid is defined and group.gid %} | |||||
- gid: {{ group.gid }} | |||||
{%- endif %} | |||||
{%- else %} | |||||
system_group_{{ group_name }}: | |||||
group.absent: | |||||
- name: {{ group.name }} | |||||
{%- endif %} | |||||
{%- endfor %} | |||||
{%- endif %} |
{%- from "linux/map.jinja" import system with context %} | |||||
include: | |||||
{%- if system.repo|length > 0 %} | |||||
- linux.system.repo | |||||
{%- endif %} | |||||
{%- if system.pkgs|length > 0 %} | |||||
- linux.system.package | |||||
{%- endif %} | |||||
{%- if system.timezone is defined %} | |||||
- linux.system.timezone | |||||
{%- endif %} | |||||
{%- if system.kernel is defined %} | |||||
- linux.system.kernel | |||||
{%- endif %} | |||||
{%- if system.locale is defined %} | |||||
- linux.system.locale | |||||
{%- endif %} | |||||
{%- if system.user|length > 0 %} | |||||
- linux.system.user | |||||
{%- endif %} | |||||
{%- if system.group|length > 0 %} | |||||
- linux.system.group | |||||
{%- endif %} | |||||
{%- if system.job|length > 0 %} | |||||
- linux.system.job | |||||
{%- endif %} | |||||
{%- if grains.os_family == 'RedHat' %} | |||||
- linux.system.selinux | |||||
{%- endif %} | |||||
{%- if system.ca_certificates is defined %} | |||||
- linux.system.certificate | |||||
{%- endif %} | |||||
{%- if system.apparmor is defined %} | |||||
- linux.system.apparmor | |||||
{%- endif %} |
{%- from "linux/map.jinja" import system with context %} | |||||
{%- if system.enabled %} | |||||
{%- for name, job in system.job.iteritems() %} | |||||
linux_job_{{ job.command }}: | |||||
{%- if job.enabled %} | |||||
cron.present: | |||||
- name: {{ job.command }} | |||||
- user: {{ job.user }} | |||||
{%- if job.minute is defined %} | |||||
- minute: '{{ job.minute }}' | |||||
{%- endif %} | |||||
{%- if job.hour is defined %} | |||||
- hour: '{{ job.hour }}' | |||||
{%- endif %} | |||||
{%- if job.daymonth is defined %} | |||||
- daymonth: '{{ job.daymonth }}' | |||||
{%- endif %} | |||||
{%- if job.month is defined %} | |||||
- month: '{{ job.month }}' | |||||
{%- endif %} | |||||
{%- if job.dayweek is defined %} | |||||
- dayweek: '{{ job.dayweek }}' | |||||
{%- endif %} | |||||
{%- else %} | |||||
job.absent: | |||||
- name: {{ job.command }} | |||||
{%- endif %} | |||||
{%- endfor %} | |||||
{%- endif %} |
{%- from "linux/map.jinja" import system with context %} | |||||
{%- if system.enabled %} | |||||
{%- if system.kernel is defined %} | |||||
Basic kernel: | |||||
linux: | |||||
system: | |||||
kernel: | |||||
hold: true | |||||
versions: | |||||
generic: | |||||
headers: true | |||||
linux: | |||||
system: | |||||
kernel: | |||||
source: | |||||
engine: pkg | |||||
repo: from_repo | |||||
version: 1.13.42 | |||||
hold: true | |||||
headers: true | |||||
generic: true | |||||
linux-headers-3.13.0-34 | |||||
linux-image-3.13.0-34-generic | |||||
linux-headers-3.13.0-34-generic | |||||
{%- if system.kernel.get('source', {'engine': 'pkg'}).engine == 'pkg' %} | |||||
{%- if system.kernel.version is defined %} | |||||
linux_kernel_package: | |||||
pkg.installed: | |||||
- name: linux-image-{{ system.kernel.version }} | |||||
- refresh: true | |||||
{%- else %} | |||||
linux_kernel_package: | |||||
pkg.latest: | |||||
- name: linux-image-generic | |||||
- refresh: true | |||||
{%- endif %} | |||||
{%- if system.kernel.headers is defined %} | |||||
{%- if system.kernel.version is defined %} | |||||
linux_kernel_package: | |||||
pkg.installed: | |||||
- name: linux-image-{{ system.kernel.version }} | |||||
- version: | |||||
- refresh: true | |||||
{%- else %} | |||||
linux_kernel_package: | |||||
pkg.latest: | |||||
- name: linux-image-generic | |||||
- refresh: true | |||||
{%- endif %} | |||||
{%- endif %} | |||||
{%- endif %} | |||||
{%- endif %} | |||||
{%- endif %} |
{%- from "linux/map.jinja" import system with context %} | |||||
{%- if system.enabled %} | |||||
{%- endif %} |
{%- from "linux/map.jinja" import system with context %} | |||||
{%- if system.enabled %} | |||||
linux_packages: | |||||
pkg.installed: | |||||
- names: {{ system.pkgs }} | |||||
{%- for name, package in system.package.iteritems() %} | |||||
linux_extra_package_{{ name }}: | |||||
{%- if package.version == 'latest' %} | |||||
pkg.latest: | |||||
{%- else %} | |||||
pkg.installed: | |||||
- version: {{ package.version }} | |||||
{%- endif %} | |||||
- name: {{ name }} | |||||
{%- if package.repo is defined %} | |||||
- fromrepo: {{ package.repo }} | |||||
{%- endif %} | |||||
{%- if package.hold is defined %} | |||||
- hold: {{ package.hold }} | |||||
{%- endif %} | |||||
{%- if package.verify is defined %} | |||||
- skip_verify: {% if package.verify %}false{% else %}true{% endif %} | |||||
{%- endif %} | |||||
{%- endfor %} | |||||
{%- endif %} |
{%- from "linux/map.jinja" import system with context %} | |||||
{%- if system.enabled %} | |||||
{% set default_repos = {} %} | |||||
{%- for name, repo in system.repo.iteritems() %} | |||||
{%- if grains.os_family == 'Debian' %} | |||||
{%- if repo.pin is defined %} | |||||
linux_repo_{{ name }}_pin: | |||||
file.managed: | |||||
- name: /etc/apt/preferences.d/{{ name }} | |||||
- source: salt://linux/files/preferences_repo | |||||
- template: jinja | |||||
- defaults: | |||||
repo_name: {{ name }} | |||||
{%- else %} | |||||
linux_repo_{{ name }}_pin: | |||||
file.absent: | |||||
- name: /etc/apt/preferences.d/{{ name }} | |||||
{%- endif %} | |||||
{%- if repo.get('default', False) %} | |||||
{%- do default_repos.update({name: repo}) %} | |||||
{%- if repo.key_url %} | |||||
linux_repo_{{ name }}_key: | |||||
cmd.wait: | |||||
- name: "curl -s {{ repo.key_url }} | apt-key add -" | |||||
- watch: | |||||
- file: default_repo_list | |||||
{%- endif %} | |||||
{%- else %} | |||||
linux_repo_{{ name }}: | |||||
pkgrepo.managed: | |||||
- human_name: {{ name }} | |||||
- name: {{ repo.source }} | |||||
{%- if repo.architectures is defined %} | |||||
- architectures: {{ repo.architectures }} | |||||
{%- endif %} | |||||
- file: /etc/apt/sources.list.d/{{ name }}.list | |||||
{%- if repo.key_id is defined %} | |||||
- keyid: {{ repo.key_id }} | |||||
{%- endif %} | |||||
{%- if repo.key_server is defined %} | |||||
- keyserver: {{ repo.key_server }} | |||||
{%- endif %} | |||||
{%- if repo.key_url is defined %} | |||||
- key_url: {{ repo.key_url }} | |||||
{%- endif %} | |||||
{%- endif %} | |||||
{%- endif %} | |||||
{%- if grains.os_family == "RedHat" %} | |||||
{%- if not repo.get('default', False) %} | |||||
linux_repo_{{ name }}: | |||||
pkgrepo.managed: | |||||
- name: {{ name }} | |||||
- humanname: {{ name }} | |||||
- baseurl: {{ repo.source }} | |||||
- gpgcheck: {% if repo.get('gpgcheck', False) %}1{% else %}0{% endif %} | |||||
{%- endif %} | |||||
{%- endif %} | |||||
{%- endfor %} | |||||
{%- if default_repos|length > 0 and grains.os_family == 'Debian' %} | |||||
default_repo_list: | |||||
file.managed: | |||||
- name: /etc/apt/sources.list | |||||
- source: salt://linux/files/sources.list | |||||
- template: jinja | |||||
- user: root | |||||
- group: root | |||||
- mode: 0644 | |||||
- defaults: | |||||
default_repos: {{ default_repos }} | |||||
{%- endif %} | |||||
{%- endif %} |
{%- from "linux/map.jinja" import system with context %} | |||||
{%- if system.enabled %} | |||||
include: | |||||
- linux.system.package | |||||
{%- if grains.os_family == 'RedHat' %} | |||||
{%- if system.selinux == 'disabled' %} | |||||
selinux_config: | |||||
cmd.run: | |||||
- names: | |||||
- "sed -i 's/enforcing/disabled/g' /etc/selinux/config; setenforce 0" | |||||
- "sed -i 's/permissive/disabled/g' /etc/selinux/config; setenforce 0" | |||||
- unless: cat '/etc/selinux/config' | grep 'SELINUX=disabled' | |||||
{%- else %} | |||||
selinux_config: | |||||
selinux.mode: | |||||
- name: {{ system.get('selinux', 'permissive') }} | |||||
- require: | |||||
- pkg: linux_packages | |||||
{%- endif %} | |||||
{%- endif %} | |||||
{%- endif %} |
{%- from "linux/map.jinja" import system with context %} | |||||
{%- if system.enabled %} | |||||
{%- if system.timezone is defined %} | |||||
{{ system.timezone }}: | |||||
timezone.system: | |||||
- utc: {{ system.utc }} | |||||
{%- endif %} | |||||
{%- endif %} |
{%- from "linux/map.jinja" import system with context %} | |||||
{%- if system.enabled %} | |||||
{%- for name, user in system.user.iteritems() %} | |||||
{%- if user.enabled %} | |||||
system_user_{{ name }}: | |||||
user.present: | |||||
- name: {{ name }} | |||||
- home: {{ user.home }} | |||||
{%- if user.password is defined %} | |||||
- password: {{ user.password }} | |||||
- enforce_password: true | |||||
- gid_from_name: true | |||||
{%- endif %} | |||||
{%- if user.groups is defined %} | |||||
- groups: {{ user.groups }} | |||||
{%- endif %} | |||||
{%- if user.system is defined and user.system %} | |||||
- system: True | |||||
{%- else %} | |||||
- shell: {{ user.get('shell', '/bin/bash') }} | |||||
{%- endif %} | |||||
{%- if user.uid is defined and user.uid %} | |||||
- uid: {{ user.uid }} | |||||
{%- endif %} | |||||
system_user_home_{{ user.home }}: | |||||
file.directory: | |||||
- name: {{ user.home }} | |||||
- user: {{ name }} | |||||
- mode: 700 | |||||
- makedirs: true | |||||
- require: | |||||
- user: system_user_{{ name }} | |||||
{%- if user.get('sudo', False) %} | |||||
/etc/sudoers.d/90-salt-user-{{ name }}: | |||||
file.managed: | |||||
- source: salt://linux/files/sudoer | |||||
- template: jinja | |||||
- user: root | |||||
- group: root | |||||
- mode: 440 | |||||
- defaults: | |||||
user_name: {{ name }} | |||||
- require: | |||||
- user: system_user_{{ name }} | |||||
{%- endif %} | |||||
{%- else %} | |||||
system_user_{{ name }}: | |||||
user.absent: | |||||
- name: {{ name }} | |||||
system_user_home_{{ user.home }}: | |||||
file.absent: | |||||
- name: {{ user.home }} | |||||
/etc/sudoers.d/90-salt-user-{{ name }}: | |||||
file.absent | |||||
{%- endif %} | |||||
{%- endfor %} | |||||
{%- endif %} |
applications: | |||||
- linux | |||||
parameters: | |||||
linux: | |||||
system: | |||||
enabled: true | |||||
user: | |||||
root: | |||||
enabled: true | |||||
name: root | |||||
home: /root | |||||
timezone: Europe/Prague | |||||
cluster: default | |||||
network: | |||||
enabled: true | |||||
hostname: ${linux:system:name} | |||||
fqdn: ${linux:system:name}.${linux:system:domain} | |||||
storage: | |||||
enabled: true |