003 File Manager
Current Path:
/usr/local/lib/python3.8/site-packages/salt/states
usr
/
local
/
lib
/
python3.8
/
site-packages
/
salt
/
states
/
📁
..
📄
__init__.py
(25 B)
📁
__pycache__
📄
acme.py
(5.08 KB)
📄
alias.py
(2.49 KB)
📄
alternatives.py
(6.75 KB)
📄
ansiblegate.py
(7.61 KB)
📄
apache.py
(3.95 KB)
📄
apache_conf.py
(2.72 KB)
📄
apache_module.py
(2.73 KB)
📄
apache_site.py
(2.66 KB)
📄
aptpkg.py
(1.42 KB)
📄
archive.py
(67.76 KB)
📄
artifactory.py
(6.84 KB)
📄
at.py
(7.54 KB)
📄
augeas.py
(10.57 KB)
📄
aws_sqs.py
(2.59 KB)
📄
azurearm_compute.py
(10.86 KB)
📄
azurearm_dns.py
(25.09 KB)
📄
azurearm_network.py
(87.86 KB)
📄
azurearm_resource.py
(27.22 KB)
📄
beacon.py
(7.58 KB)
📄
bigip.py
(96.63 KB)
📄
blockdev.py
(5.13 KB)
📄
boto3_elasticache.py
(48.01 KB)
📄
boto3_elasticsearch.py
(32.6 KB)
📄
boto3_route53.py
(37.54 KB)
📄
boto3_sns.py
(12.69 KB)
📄
boto_apigateway.py
(82.78 KB)
📄
boto_asg.py
(31.93 KB)
📄
boto_cfn.py
(11.53 KB)
📄
boto_cloudfront.py
(6.01 KB)
📄
boto_cloudtrail.py
(13.18 KB)
📄
boto_cloudwatch_alarm.py
(6.4 KB)
📄
boto_cloudwatch_event.py
(12.33 KB)
📄
boto_cognitoidentity.py
(13.69 KB)
📄
boto_datapipeline.py
(18.5 KB)
📄
boto_dynamodb.py
(29.32 KB)
📄
boto_ec2.py
(71.98 KB)
📄
boto_elasticache.py
(16.75 KB)
📄
boto_elasticsearch_domain.py
(12.27 KB)
📄
boto_elb.py
(55.1 KB)
📄
boto_elbv2.py
(12.19 KB)
📄
boto_iam.py
(69.16 KB)
📄
boto_iam_role.py
(27.12 KB)
📄
boto_iot.py
(25.33 KB)
📄
boto_kinesis.py
(16.69 KB)
📄
boto_kms.py
(12.11 KB)
📄
boto_lambda.py
(35.52 KB)
📄
boto_lc.py
(11.04 KB)
📄
boto_rds.py
(26 KB)
📄
boto_route53.py
(19.38 KB)
📄
boto_s3.py
(9.32 KB)
📄
boto_s3_bucket.py
(24.67 KB)
📄
boto_secgroup.py
(32.62 KB)
📄
boto_sns.py
(8.92 KB)
📄
boto_sqs.py
(7.97 KB)
📄
boto_vpc.py
(61.77 KB)
📄
bower.py
(8.26 KB)
📄
btrfs.py
(10.31 KB)
📄
cabal.py
(5.73 KB)
📄
ceph.py
(1.9 KB)
📄
chef.py
(3.68 KB)
📄
chocolatey.py
(17.33 KB)
📄
chronos_job.py
(4.6 KB)
📄
cimc.py
(14.32 KB)
📄
cisconso.py
(3.14 KB)
📄
cloud.py
(14.4 KB)
📄
cmd.py
(41.24 KB)
📄
composer.py
(8.38 KB)
📄
cron.py
(23.39 KB)
📄
cryptdev.py
(6.17 KB)
📄
csf.py
(9.98 KB)
📄
cyg.py
(7.05 KB)
📄
ddns.py
(4.2 KB)
📄
debconfmod.py
(6.33 KB)
📄
dellchassis.py
(24.49 KB)
📄
disk.py
(6.49 KB)
📄
docker_container.py
(85.27 KB)
📄
docker_image.py
(16.38 KB)
📄
docker_network.py
(36.34 KB)
📄
docker_volume.py
(6.72 KB)
📄
drac.py
(4.17 KB)
📄
dvs.py
(26.29 KB)
📄
elasticsearch.py
(20.38 KB)
📄
elasticsearch_index.py
(3.25 KB)
📄
elasticsearch_index_template.py
(3.67 KB)
📄
environ.py
(5.81 KB)
📄
eselect.py
(2.27 KB)
📄
esxcluster.py
(21.16 KB)
📄
esxdatacenter.py
(3.24 KB)
📄
esxi.py
(61.77 KB)
📄
esxvm.py
(18.86 KB)
📄
etcd_mod.py
(8.36 KB)
📄
ethtool.py
(7.84 KB)
📄
event.py
(2.48 KB)
📄
file.py
(299.79 KB)
📄
firewall.py
(1.33 KB)
📄
firewalld.py
(26.08 KB)
📄
gem.py
(7.13 KB)
📄
git.py
(124.23 KB)
📄
github.py
(27.25 KB)
📄
glance_image.py
(2.26 KB)
📄
glassfish.py
(21.47 KB)
📄
glusterfs.py
(12.12 KB)
📄
gnomedesktop.py
(7.47 KB)
📄
gpg.py
(5.28 KB)
📄
grafana.py
(12.11 KB)
📄
grafana4_dashboard.py
(17.31 KB)
📄
grafana4_datasource.py
(6.15 KB)
📄
grafana4_org.py
(7.73 KB)
📄
grafana4_user.py
(5.52 KB)
📄
grafana_dashboard.py
(17.74 KB)
📄
grafana_datasource.py
(5.31 KB)
📄
grains.py
(15.57 KB)
📄
group.py
(9.57 KB)
📄
heat.py
(9.69 KB)
📄
helm.py
(10.39 KB)
📄
hg.py
(6.33 KB)
📄
highstate_doc.py
(1.41 KB)
📄
host.py
(8.64 KB)
📄
http.py
(7.43 KB)
📄
icinga2.py
(9.07 KB)
📄
idem.py
(3.91 KB)
📄
ifttt.py
(2.12 KB)
📄
incron.py
(5.71 KB)
📄
influxdb08_database.py
(2.85 KB)
📄
influxdb08_user.py
(3.39 KB)
📄
influxdb_continuous_query.py
(2.81 KB)
📄
influxdb_database.py
(2.11 KB)
📄
influxdb_retention_policy.py
(4.82 KB)
📄
influxdb_user.py
(4.84 KB)
📄
infoblox_a.py
(4.24 KB)
📄
infoblox_cname.py
(4.19 KB)
📄
infoblox_host_record.py
(6.59 KB)
📄
infoblox_range.py
(6.85 KB)
📄
ini_manage.py
(12.67 KB)
📄
ipmi.py
(8.39 KB)
📄
ipset.py
(9.66 KB)
📄
iptables.py
(25.96 KB)
📄
jboss7.py
(23.95 KB)
📄
jenkins.py
(3.36 KB)
📄
junos.py
(17.78 KB)
📄
kapacitor.py
(6.46 KB)
📄
kernelpkg.py
(6.42 KB)
📄
keyboard.py
(2.01 KB)
📄
keystone.py
(27.12 KB)
📄
keystone_domain.py
(2.81 KB)
📄
keystone_endpoint.py
(4.69 KB)
📄
keystone_group.py
(3.25 KB)
📄
keystone_project.py
(3.36 KB)
📄
keystone_role.py
(2.33 KB)
📄
keystone_role_grant.py
(4.08 KB)
📄
keystone_service.py
(2.89 KB)
📄
keystone_user.py
(3.47 KB)
📄
keystore.py
(5.29 KB)
📄
kmod.py
(8.38 KB)
📄
kubernetes.py
(24.87 KB)
📄
layman.py
(2.44 KB)
📄
ldap.py
(19.78 KB)
📄
libcloud_dns.py
(5.7 KB)
📄
libcloud_loadbalancer.py
(5.66 KB)
📄
libcloud_storage.py
(5.13 KB)
📄
linux_acl.py
(24.43 KB)
📄
locale.py
(2.52 KB)
📄
logadm.py
(4.73 KB)
📄
logrotate.py
(3.86 KB)
📄
loop.py
(7.74 KB)
📄
lvm.py
(13.33 KB)
📄
lvs_server.py
(6.28 KB)
📄
lvs_service.py
(4.38 KB)
📄
lxc.py
(22.17 KB)
📄
lxd.py
(7.88 KB)
📄
lxd_container.py
(22.25 KB)
📄
lxd_image.py
(10.59 KB)
📄
lxd_profile.py
(7.11 KB)
📄
mac_assistive.py
(1.59 KB)
📄
mac_keychain.py
(5.59 KB)
📄
mac_xattr.py
(3.15 KB)
📄
macdefaults.py
(2.65 KB)
📄
macpackage.py
(6.76 KB)
📄
makeconf.py
(6.87 KB)
📄
marathon_app.py
(4.45 KB)
📄
mdadm_raid.py
(6.41 KB)
📄
memcached.py
(3.95 KB)
📄
modjk.py
(2.84 KB)
📄
modjk_worker.py
(6.49 KB)
📄
module.py
(17.99 KB)
📄
mongodb_database.py
(1.65 KB)
📄
mongodb_user.py
(6.26 KB)
📄
monit.py
(2.68 KB)
📄
mount.py
(49.55 KB)
📄
mssql_database.py
(3 KB)
📄
mssql_login.py
(3.64 KB)
📄
mssql_role.py
(2.37 KB)
📄
mssql_user.py
(3.51 KB)
📄
msteams.py
(2.53 KB)
📄
mysql_database.py
(6.05 KB)
📄
mysql_grants.py
(8.49 KB)
📄
mysql_query.py
(13.07 KB)
📄
mysql_user.py
(9.51 KB)
📄
net_napalm_yang.py
(9.15 KB)
📄
netacl.py
(31.92 KB)
📄
netconfig.py
(33.42 KB)
📄
netntp.py
(12.48 KB)
📄
netsnmp.py
(11.33 KB)
📄
netusers.py
(16.1 KB)
📄
network.py
(23.7 KB)
📄
neutron_network.py
(3.96 KB)
📄
neutron_secgroup.py
(4 KB)
📄
neutron_secgroup_rule.py
(4.75 KB)
📄
neutron_subnet.py
(4.29 KB)
📄
nexus.py
(4.97 KB)
📄
nfs_export.py
(4.92 KB)
📄
nftables.py
(19.5 KB)
📄
npm.py
(11.21 KB)
📄
ntp.py
(2.12 KB)
📄
nxos.py
(10.67 KB)
📄
nxos_upgrade.py
(3.5 KB)
📄
openstack_config.py
(3.26 KB)
📄
openvswitch_bridge.py
(3.13 KB)
📄
openvswitch_port.py
(17.25 KB)
📄
opsgenie.py
(4.07 KB)
📄
pagerduty.py
(1.89 KB)
📄
pagerduty_escalation_policy.py
(5.42 KB)
📄
pagerduty_schedule.py
(6.09 KB)
📄
pagerduty_service.py
(3.93 KB)
📄
pagerduty_user.py
(1.18 KB)
📄
panos.py
(48.13 KB)
📄
pbm.py
(20.46 KB)
📄
pcs.py
(36.46 KB)
📄
pdbedit.py
(3.48 KB)
📄
pecl.py
(3.65 KB)
📄
pip_state.py
(37.55 KB)
📄
pkg.py
(127.05 KB)
📄
pkgbuild.py
(11.37 KB)
📄
pkgng.py
(685 B)
📄
pkgrepo.py
(23.59 KB)
📄
portage_config.py
(5.01 KB)
📄
ports.py
(5.65 KB)
📄
postgres_cluster.py
(4.19 KB)
📄
postgres_database.py
(6.08 KB)
📄
postgres_extension.py
(5.68 KB)
📄
postgres_group.py
(8.52 KB)
📄
postgres_initdb.py
(2.84 KB)
📄
postgres_language.py
(3.94 KB)
📄
postgres_privileges.py
(7.86 KB)
📄
postgres_schema.py
(4.34 KB)
📄
postgres_tablespace.py
(6.62 KB)
📄
postgres_user.py
(9.49 KB)
📄
powerpath.py
(2.34 KB)
📄
probes.py
(15.06 KB)
📄
process.py
(1.32 KB)
📄
proxy.py
(4.94 KB)
📄
pushover.py
(3.13 KB)
📄
pyenv.py
(6.07 KB)
📄
pyrax_queues.py
(2.97 KB)
📄
quota.py
(1.4 KB)
📄
rabbitmq_cluster.py
(1.84 KB)
📄
rabbitmq_plugin.py
(2.77 KB)
📄
rabbitmq_policy.py
(4.58 KB)
📄
rabbitmq_upstream.py
(7.9 KB)
📄
rabbitmq_user.py
(8.89 KB)
📄
rabbitmq_vhost.py
(3.04 KB)
📄
rbac_solaris.py
(6.67 KB)
📄
rbenv.py
(7.36 KB)
📄
rdp.py
(1.28 KB)
📄
redismod.py
(4.76 KB)
📄
reg.py
(19.22 KB)
📄
rsync.py
(4.45 KB)
📄
rvm.py
(6.56 KB)
📄
salt_proxy.py
(1.34 KB)
📄
saltmod.py
(30.88 KB)
📄
saltutil.py
(8.91 KB)
📄
schedule.py
(11.89 KB)
📄
selinux.py
(18.61 KB)
📄
serverdensity_device.py
(6.41 KB)
📄
service.py
(37.06 KB)
📄
slack.py
(4.98 KB)
📄
smartos.py
(44.89 KB)
📄
smtp.py
(2.3 KB)
📄
snapper.py
(7.24 KB)
📄
solrcloud.py
(4.48 KB)
📄
splunk.py
(4.32 KB)
📄
splunk_search.py
(3.17 KB)
📄
sqlite3.py
(14.7 KB)
📄
ssh_auth.py
(19.1 KB)
📄
ssh_known_hosts.py
(7.87 KB)
📄
stateconf.py
(494 B)
📄
status.py
(2.21 KB)
📄
statuspage.py
(17.29 KB)
📄
supervisord.py
(10.48 KB)
📄
svn.py
(8.14 KB)
📄
sysctl.py
(3.82 KB)
📄
syslog_ng.py
(2.97 KB)
📄
sysrc.py
(2.82 KB)
📄
telemetry_alert.py
(7.04 KB)
📄
test.py
(13.09 KB)
📄
testinframod.py
(1.35 KB)
📄
timezone.py
(3.42 KB)
📄
tls.py
(1.81 KB)
📄
tomcat.py
(9.72 KB)
📄
trafficserver.py
(8.82 KB)
📄
tuned.py
(3.32 KB)
📄
uptime.py
(1.87 KB)
📄
user.py
(35.43 KB)
📄
vagrant.py
(11.4 KB)
📄
vault.py
(3.28 KB)
📄
vbox_guest.py
(4.05 KB)
📄
victorops.py
(3.32 KB)
📄
virt.py
(80.06 KB)
📄
virtualenv_mod.py
(11.21 KB)
📄
webutil.py
(3.78 KB)
📄
win_certutil.py
(2.88 KB)
📄
win_dacl.py
(7.96 KB)
📄
win_dism.py
(13.02 KB)
📄
win_dns_client.py
(8.32 KB)
📄
win_firewall.py
(6.87 KB)
📄
win_iis.py
(31.56 KB)
📄
win_lgpo.py
(25.41 KB)
📄
win_license.py
(1.6 KB)
📄
win_network.py
(14.18 KB)
📄
win_path.py
(6.39 KB)
📄
win_pki.py
(5.56 KB)
📄
win_powercfg.py
(3.79 KB)
📄
win_servermanager.py
(10.4 KB)
📄
win_smtp_server.py
(10.01 KB)
📄
win_snmp.py
(6.64 KB)
📄
win_system.py
(13.78 KB)
📄
win_wua.py
(14.47 KB)
📄
win_wusa.py
(3.53 KB)
📄
winrepo.py
(2.74 KB)
📄
wordpress.py
(4.82 KB)
📄
x509.py
(26.98 KB)
📄
xml.py
(1.75 KB)
📄
xmpp.py
(2.61 KB)
📄
zabbix_action.py
(9.35 KB)
📄
zabbix_host.py
(27.25 KB)
📄
zabbix_hostgroup.py
(5.64 KB)
📄
zabbix_mediatype.py
(16.89 KB)
📄
zabbix_template.py
(35.14 KB)
📄
zabbix_user.py
(15.76 KB)
📄
zabbix_usergroup.py
(9.64 KB)
📄
zabbix_usermacro.py
(9.69 KB)
📄
zabbix_valuemap.py
(8.11 KB)
📄
zcbuildout.py
(5.16 KB)
📄
zenoss.py
(2.89 KB)
📄
zfs.py
(34.27 KB)
📄
zk_concurrency.py
(5.81 KB)
📄
zone.py
(46.49 KB)
📄
zookeeper.py
(11.53 KB)
📄
zpool.py
(13.08 KB)
Editing: network.py
""" Configuration of network interfaces =================================== The network module is used to create and manage network settings, interfaces can be set as either managed or ignored. By default all interfaces are ignored unless specified. .. note:: RedHat-based systems (RHEL, CentOS, Scientific, etc.) have been supported since version 2014.1.0. Debian-based systems (Debian, Ubuntu, etc.) have been supported since version 2017.7.0. The following options are not supported: ipaddr_start, and ipaddr_end. Other platforms are not yet supported. .. note:: On Debian-based systems, networking configuration can be specified in `/etc/network/interfaces` or via included files such as (by default) `/etc/network/interfaces.d/*`. This can be problematic for configuration management. It is recommended to use either `file.managed` *or* `network.managed`. If using ``network.managed``, it can be useful to ensure ``interfaces.d/`` is empty. This can be done using the following state .. code-block:: yaml /etc/network/interfaces.d: file.directory: - clean: True Configuring Global Network Settings ----------------------------------- Use the :py:func:`network.system <salt.states.network.system>` state to set global network settings: .. code-block:: yaml system: network.system: - enabled: True - hostname: server1.example.com - gateway: 192.168.0.1 - gatewaydev: eth0 - nozeroconf: True - nisdomain: example.com - require_reboot: True - apply_hostname: True .. note:: The use of ``apply_hostname`` above will apply changes to the hostname immediately. .. versionchanged:: 2015.5.0 ``apply_hostname`` added retain_settings *************** .. versionadded:: 2016.11.0 Use `retain_settings` to retain current network settings that are not otherwise specified in the state. Particularly useful if only setting the hostname. Default behavior is to delete unspecified network settings. .. code-block:: yaml system: network.system: - hostname: server2.example.com - apply_hostname: True - retain_settings: True Configuring Network Routes -------------------------- Use the :py:func:`network.routes <salt.states.network.routes>` state to set network routes. .. code-block:: yaml routes: network.routes: - name: eth0 - routes: - name: secure_network ipaddr: 10.2.0.0 netmask: 255.255.255.0 gateway: 10.1.0.3 - name: HQ_network ipaddr: 10.100.0.0 netmask: 255.255.0.0 gateway: 10.1.0.10 Managing Network Interfaces --------------------------- The :py:func:`network.managed <salt.states.network.managed>` state is used to configure network interfaces. Here are several examples: Ethernet Interface ****************** .. code-block:: yaml eth0: network.managed: - enabled: True - type: eth - proto: static - ipaddr: 10.1.0.7 - netmask: 255.255.255.0 - gateway: 10.1.0.1 - enable_ipv6: true - ipv6proto: static - ipv6addrs: - 2001:db8:dead:beef::3/64 - 2001:db8:dead:beef::7/64 - ipv6gateway: 2001:db8:dead:beef::1 - ipv6netmask: 64 - dns: - 8.8.8.8 - 8.8.4.4 - channels: rx: 4 tx: 4 other: 4 combined: 4 Ranged Interfaces (RHEL/CentOS Only) ************************************ .. versionadded:: 2015.8.0 Ranged interfaces can be created by including the word ``range`` in the interface name. .. important:: The interface type must be ``eth``. .. code-block:: yaml eth0-range0: network.managed: - type: eth - ipaddr_start: 192.168.1.1 - ipaddr_end: 192.168.1.10 - clonenum_start: 10 - mtu: 9000 bond0-range0: network.managed: - type: eth - ipaddr_start: 192.168.1.1 - ipaddr_end: 192.168.1.10 - clonenum_start: 10 - mtu: 9000 eth1.0-range0: network.managed: - type: eth - ipaddr_start: 192.168.1.1 - ipaddr_end: 192.168.1.10 - clonenum_start: 10 - vlan: True - mtu: 9000 bond0.1-range0: network.managed: - type: eth - ipaddr_start: 192.168.1.1 - ipaddr_end: 192.168.1.10 - clonenum_start: 10 - vlan: True - mtu: 9000 Bond Interfaces *************** To configure a bond, you must do the following: - Configure the bond slaves with a ``type`` of ``slave``, and a ``master`` option set to the name of the bond interface. - Configure the bond interface with a ``type`` of ``bond``, and a ``slaves`` option defining the bond slaves for the bond interface. .. code-block:: yaml eth2: network.managed: - enabled: True - type: slave - master: bond0 eth3: network.managed: - enabled: True - type: slave - master: bond0 bond0: network.managed: - type: bond - ipaddr: 10.1.0.1 - netmask: 255.255.255.0 - mode: gre - proto: static - dns: - 8.8.8.8 - 8.8.4.4 - enabled: False - slaves: eth2 eth3 - require: - network: eth2 - network: eth3 - miimon: 100 - arp_interval: 250 - downdelay: 200 - lacp_rate: fast - max_bonds: 1 - updelay: 0 - use_carrier: on - hashing-algorithm: layer2 - mtu: 9000 - autoneg: on - speed: 1000 - duplex: full - rx: on - tx: off - sg: on - tso: off - ufo: off - gso: off - gro: off - lro: off VLANs ***** Set ``type`` to ``vlan`` to configure a VLANs. These VLANs are configured on the bond interface defined above. .. code-block:: yaml bond0.2: network.managed: - type: vlan - ipaddr: 10.1.0.2 - use: - network: bond0 - require: - network: bond0 bond0.3: network.managed: - type: vlan - ipaddr: 10.1.0.3 - use: - network: bond0 - require: - network: bond0 bond0.10: network.managed: - type: vlan - ipaddr: 10.1.0.4 - use: - network: bond0 - require: - network: bond0 bond0.12: network.managed: - type: vlan - ipaddr: 10.1.0.5 - use: - network: bond0 - require: - network: bond0 Bridge Interfaces ***************** .. code-block:: yaml eth4: network.managed: - enabled: True - type: eth - proto: dhcp - bridge: br0 br0: network.managed: - enabled: True - type: bridge - proto: dhcp - bridge: br0 - delay: 0 - ports: eth4 - bypassfirewall: True - use: - network: eth4 - require: - network: eth4 .. note:: When managing bridged interfaces on a Debian/Ubuntu based system, the ``ports`` argument is required. RedHat-based systems will ignore the argument. Network Teaming (RHEL/CentOS 7 and later) ***************************************** .. versionadded:: 3002 - Configure the members of the team interface with a ``type`` of ``teamport``, and a ``team_master`` option set to the name of the bond interface. - ``master`` also works, but will be ignored if both ``team_master`` and ``master`` are present. - If applicable, include a ``team_port_config`` option. This should be formatted as a dictionary. Keep in mind that due to a quirk of PyYAML, dictionaries nested under a list item must be double-indented (see example below for interface ``eth5``). - Configure the team interface with a ``type`` of ``team``. The team configuration should be passed via the ``team_config`` option. As with ``team_port_config``, the dictionary should be double-indented. .. code-block:: yaml eth5: network.managed: - type: teamport - team_master: team0 - team_port_config: prio: 100 eth6: network.managed: - type: teamport - team_master: team0 team0: network.managed: - type: team - ipaddr: 172.24.90.42 - netmask: 255.255.255.128 - enable_ipv6: True - ipv6addr: 'fee1:dead:beef:af43::' - team_config: runner: hwaddr_policy: by_active name: activebackup link_watch: name: ethtool .. note:: While ``teamd`` must be installed to manage a team interface, it is not required to configure a separate :py:func:`pkg.installed <salt.states.pkg.installed>` state for it, as it will be silently installed if needed. Configuring the Loopback Interface ********************************** Use :py:func:`network.managed <salt.states.network.managed>` with a ``type`` of ``eth`` and a ``proto`` of ``loopback``. .. code-block:: yaml lo: network.managed: - name: lo - type: eth - proto: loopback - onboot: yes - userctl: no - ipv6_autoconf: no - enable_ipv6: true Other Useful Options -------------------- noifupdown ********** The ``noifupdown`` option, if set to ``True``, will keep Salt from restart the interface if changes are made, requiring them to be restarted manually. Here are a couple examples: .. code-block:: yaml eth7: network.managed: - enabled: True - type: eth # Automatic IP/DNS - proto: dhcp - noifupdown: True eth8: network.managed: - type: eth - noifupdown: True # IPv4 - proto: static - ipaddr: 192.168.4.9 - netmask: 255.255.255.0 - gateway: 192.168.4.1 - enable_ipv6: True # IPv6 - ipv6proto: static - ipv6addr: 2001:db8:dead:c0::3 - ipv6netmask: 64 - ipv6gateway: 2001:db8:dead:c0::1 # override shared; makes those options v4-only - ipv6ttl: 15 # Shared - mtu: 1480 - ttl: 18 - dns: - 8.8.8.8 - 8.8.4.4 """ import difflib import logging import salt.loader import salt.utils.network import salt.utils.platform # Set up logging log = logging.getLogger(__name__) def __virtual__(): """ Confine this module to non-Windows systems with the required execution module available. """ if salt.utils.platform.is_windows(): return (False, "Only supported on non-Windows OSs") if "ip.get_interface" in __salt__: return True return (False, "ip module could not be loaded") def managed(name, enabled=True, **kwargs): """ Ensure that the named interface is configured properly. name The name of the interface to manage type : eth Type of interface and configuration .. versionchanged:: 3002 enabled Designates the state of this interface. """ # For this function we are purposefully overwriting a bif # to enhance the user experience. This does not look like # it will cause a problem. Just giving a heads up in case # it does create a problem. ret = { "name": name, "changes": {}, "result": True, "comment": "Interface {} is up to date.".format(name), } if "test" not in kwargs: kwargs["test"] = __opts__.get("test", False) # set ranged status apply_ranged_setting = False # Pull interface type out of kwargs iface_type = str(kwargs.pop("type", "eth")) if "addr" in kwargs: hwaddr = kwargs.pop("addr") msg = "'addr' is not a valid argument name, " if "hwaddr" not in kwargs: msg += "its value has been assigned to 'hwaddr' instead." kwargs["hwaddr"] = hwaddr else: msg += "it has been ignored in favor of 'hwaddr'." msg += " Update your SLS file to get rid of this warning." ret.setdefault("warnings", []).append(msg) # Build interface try: old = __salt__["ip.get_interface"](name) new = __salt__["ip.build_interface"](name, iface_type, enabled, **kwargs) if kwargs["test"]: if old == new: pass if not old and new: ret["result"] = None ret["comment"] = "Interface {} is set to be added.".format(name) elif old != new: diff = difflib.unified_diff(old, new, lineterm="") ret["result"] = None ret["comment"] = "Interface {} is set to be updated:\n{}".format( name, "\n".join(diff) ) else: if not old and new: ret["comment"] = "Interface {} added.".format(name) ret["changes"]["interface"] = "Added network interface." apply_ranged_setting = True elif old != new: diff = difflib.unified_diff(old, new, lineterm="") ret["comment"] = "Interface {} updated.".format(name) ret["changes"]["interface"] = "\n".join(diff) apply_ranged_setting = True except AttributeError as error: ret["result"] = False ret["comment"] = str(error) return ret # Debian based system can have a type of source # in the interfaces file, we don't ifup or ifdown it if iface_type == "source": return ret # Setup up bond modprobe script if required if iface_type == "bond" and "ip.get_bond" in __salt__: try: old = __salt__["ip.get_bond"](name) new = __salt__["ip.build_bond"](name, **kwargs) if kwargs["test"]: if not old and new: ret["result"] = None ret["comment"] = "Bond interface {} is set to be added.".format( name ) elif old != new: diff = difflib.unified_diff(old, new, lineterm="") ret["result"] = None ret[ "comment" ] = "Bond interface {} is set to be updated:\n{}".format( name, "\n".join(diff) ) else: if not old and new: ret["comment"] = "Bond interface {} added.".format(name) ret["changes"]["bond"] = "Added bond {}.".format(name) apply_ranged_setting = True elif old != new: diff = difflib.unified_diff(old, new, lineterm="") ret["comment"] = "Bond interface {} updated.".format(name) ret["changes"]["bond"] = "\n".join(diff) apply_ranged_setting = True except AttributeError as error: # TODO Add a way of reversing the interface changes. ret["result"] = False ret["comment"] = str(error) return ret if kwargs["test"]: return ret # For Redhat/Centos ranged network if "range" in name: if apply_ranged_setting: try: ret["result"] = __salt__["service.restart"]("network") ret["comment"] = "network restarted for change of ranged interfaces" return ret except Exception as error: # pylint: disable=broad-except ret["result"] = False ret["comment"] = str(error) return ret ret["result"] = True ret["comment"] = "no change, passing it" return ret # Bring up/shutdown interface try: # Get Interface current status interfaces = salt.utils.network.interfaces() interface_status = False if name in interfaces: interface_status = interfaces[name].get("up") else: for iface in interfaces: if "secondary" in interfaces[iface]: for second in interfaces[iface]["secondary"]: if second.get("label", "") == name: interface_status = True if iface == "lo": if "inet" in interfaces[iface]: inet_data = interfaces[iface]["inet"] if len(inet_data) > 1: for data in inet_data: if data.get("label", "") == name: interface_status = True if "inet6" in interfaces[iface]: inet6_data = interfaces[iface]["inet6"] if len(inet6_data) > 1: for data in inet6_data: if data.get("label", "") == name: interface_status = True if enabled: if "noifupdown" not in kwargs: if interface_status: if ret["changes"]: # Interface should restart to validate if it's up __salt__["ip.down"](name, iface_type) __salt__["ip.up"](name, iface_type) ret["changes"][ "status" ] = "Interface {} restart to validate".format(name) else: __salt__["ip.up"](name, iface_type) ret["changes"]["status"] = "Interface {} is up".format(name) else: if "noifupdown" not in kwargs: if interface_status: __salt__["ip.down"](name, iface_type) ret["changes"]["status"] = "Interface {} down".format(name) except Exception as error: # pylint: disable=broad-except ret["result"] = False ret["comment"] = str(error) return ret # Try to enslave bonding interfaces after master was created if iface_type == "bond" and "noifupdown" not in kwargs: if "slaves" in kwargs and kwargs["slaves"]: # Check that there are new slaves for this master present_slaves = __salt__["cmd.run"]( ["cat", "/sys/class/net/{}/bonding/slaves".format(name)] ).split() desired_slaves = kwargs["slaves"].split() missing_slaves = set(desired_slaves) - set(present_slaves) # Enslave only slaves missing in master if missing_slaves: ifenslave_path = __salt__["cmd.run"](["which", "ifenslave"]).strip() if ifenslave_path: log.info( "Adding slaves '%s' to the master %s", " ".join(missing_slaves), name, ) cmd = [ifenslave_path, name] + list(missing_slaves) __salt__["cmd.run"](cmd, python_shell=False) else: log.error("Command 'ifenslave' not found") ret["changes"]["enslave"] = "Added slaves '{}' to master '{}'".format( " ".join(missing_slaves), name ) else: log.info( "All slaves '%s' are already added to the master %s" ", no actions required", " ".join(missing_slaves), name, ) if enabled and interface_status: # Interface was restarted, return return ret # Make sure that the network grains reflect any changes made here __salt__["saltutil.refresh_grains"]() return ret def routes(name, **kwargs): """ Manage network interface static routes. name Interface name to apply the route to. kwargs Named routes """ ret = { "name": name, "changes": {}, "result": True, "comment": "Interface {} routes are up to date.".format(name), } apply_routes = False if "test" not in kwargs: kwargs["test"] = __opts__.get("test", False) # Build interface routes try: old = __salt__["ip.get_routes"](name) new = __salt__["ip.build_routes"](name, **kwargs) if kwargs["test"]: if old == new: return ret if not old and new: ret["result"] = None ret["comment"] = "Interface {} routes are set to be added.".format(name) return ret elif old != new: diff = difflib.unified_diff(old, new, lineterm="") ret["result"] = None ret[ "comment" ] = "Interface {} routes are set to be updated:\n{}".format( name, "\n".join(diff) ) return ret if not old and new: apply_routes = True ret["comment"] = "Interface {} routes added.".format(name) ret["changes"]["network_routes"] = "Added interface {} routes.".format(name) elif old != new: diff = difflib.unified_diff(old, new, lineterm="") apply_routes = True ret["comment"] = "Interface {} routes updated.".format(name) ret["changes"]["network_routes"] = "\n".join(diff) except AttributeError as error: ret["result"] = False ret["comment"] = str(error) return ret # Apply interface routes if apply_routes: try: __salt__["ip.apply_network_settings"](**kwargs) except AttributeError as error: ret["result"] = False ret["comment"] = str(error) return ret return ret def system(name, **kwargs): """ Ensure that global network settings are configured properly. name Custom name to represent this configuration change. kwargs The global parameters for the system. """ ret = { "name": name, "changes": {}, "result": True, "comment": "Global network settings are up to date.", } apply_net_settings = False kwargs["test"] = __opts__["test"] # Build global network settings try: old = __salt__["ip.get_network_settings"]() new = __salt__["ip.build_network_settings"](**kwargs) if __opts__["test"]: if old == new: return ret if not old and new: ret["result"] = None ret["comment"] = "Global network settings are set to be added." return ret elif old != new: diff = difflib.unified_diff(old, new, lineterm="") ret["result"] = None ret[ "comment" ] = "Global network settings are set to be updated:\n{}".format( "\n".join(diff) ) return ret if not old and new: apply_net_settings = True ret["changes"]["network_settings"] = "Added global network settings." elif old != new: diff = difflib.unified_diff(old, new, lineterm="") apply_net_settings = True ret["changes"]["network_settings"] = "\n".join(diff) except AttributeError as error: ret["result"] = False ret["comment"] = str(error) return ret except KeyError as error: ret["result"] = False ret["comment"] = str(error) return ret # Apply global network settings if apply_net_settings: try: __salt__["ip.apply_network_settings"](**kwargs) except AttributeError as error: ret["result"] = False ret["comment"] = str(error) return ret return ret
Upload File
Create Folder