<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Justin Cooksey</title>
    <description>The latest articles on DEV Community by Justin Cooksey (@jscooksey).</description>
    <link>https://dev.to/jscooksey</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F143855%2F4b8a67b1-a506-4b34-92d8-0417e4cea9f8.jpg</url>
      <title>DEV Community: Justin Cooksey</title>
      <link>https://dev.to/jscooksey</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jscooksey"/>
    <language>en</language>
    <item>
      <title>Using Ansible to set standards across Cisco SMB Switches</title>
      <dc:creator>Justin Cooksey</dc:creator>
      <pubDate>Tue, 08 Jul 2025 06:00:00 +0000</pubDate>
      <link>https://dev.to/jscooksey/using-ansible-to-set-standards-across-cisco-smb-switches-4o15</link>
      <guid>https://dev.to/jscooksey/using-ansible-to-set-standards-across-cisco-smb-switches-4o15</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fphgdq8nbqz2ch177r62n.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fphgdq8nbqz2ch177r62n.jpg" alt="Ansible, Netbox, Cisco" width="600" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I covered some of the base configuration in a &lt;a href="https://justincooksey.com/blog/2024/ansible-netbox-begining" rel="noopener noreferrer"&gt;previous article&lt;/a&gt; on how Netbox and Ansible work together. This time I'm covering working with the &lt;a href="https://docs.ansible.com/ansible/latest/collections/community/ciscosmb/index.html" rel="noopener noreferrer"&gt;Ansible Community Cisco SMB collection&lt;/a&gt; to manage Cisco Small and Medium Business switches in the ranges SG300, SG500, SG350, SG550, CBS350 and C1300.&lt;/p&gt;

&lt;p&gt;The source of truth in this environment is &lt;a href="https://netbox.readthedocs.io/en/feature/introduction/" rel="noopener noreferrer"&gt;Netbox&lt;/a&gt; IPAM. As before Netbox is being used for Ansibles inventory via the &lt;a href="https://docs.ansible.com/ansible/latest/collections/netbox/netbox/index.html" rel="noopener noreferrer"&gt;Netbox Namespace collection&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting the Standard
&lt;/h2&gt;

&lt;p&gt;New switches will get a standard configuration by first adding them in to Netbox and then creating the configuration using Netbox &lt;a href="https://netbox.readthedocs.io/en/feature/features/configuration-rendering/" rel="noopener noreferrer"&gt;Configuration Rendering&lt;/a&gt;. This playbook is used to bring current switches to a standard, enforcing that standard and/or applying any new changes to the standards. Setting standards such as keeping them all on a set timezone as well as the same time, domain name servers, and security methods controlling access and password policies.&lt;/p&gt;

&lt;p&gt;To make it easier to explain I'm splitting these in to different tasks. They could all be run as one task, but this way is easier to explain what each part is trying to achieve.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start of the Playbook
&lt;/h2&gt;

&lt;p&gt;Setting the stage for the rest of the playbook. 1. No need to spend time getting &lt;a href="https://docs.ansible.com/ansible/latest/collections/ansible/builtin/gather_facts_module.html" rel="noopener noreferrer"&gt;device facts&lt;/a&gt;, so &lt;strong&gt;gather_facts&lt;/strong&gt; run so its set to &lt;strong&gt;false&lt;/strong&gt; 2. Selecting only the switches from inventory by setting &lt;strong&gt;hosts&lt;/strong&gt; as &lt;strong&gt;device_roles_switch&lt;/strong&gt;. This will pick only the switches from Netbox device list based on each device in Netbox having the &lt;strong&gt;Device Role&lt;/strong&gt; field correctly set. 3. Loading variables/secrets to be used for SSH connections as well as the Netbox API from an &lt;a href="https://docs.ansible.com/ansible/latest/vault_guide/vault.html" rel="noopener noreferrer"&gt;Ansible Vault&lt;/a&gt; file &lt;strong&gt;secrets.yml&lt;/strong&gt; 4. Setting other default variables for running the playbook&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- name: Standard Switch Configuration
  gather_facts: false
  hosts: device_roles_switch

- vars_files:
    - ~/ansible/vaults/secrets.yml

  vars:
    ansible_network_os: community.ciscosmb.ciscosmb
    ansible_connection: network_cli
    ansible_become: true
    ansible_become_method: enable

  tasks:

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Basic TCP/IP Network Settings
&lt;/h2&gt;

&lt;p&gt;Setting the basic network network settings. This will allow for changing the domain name servers across the board if that has to happen at some future point. 1. Setting the IP address of name servers (DNS) using &lt;strong&gt;ip name-server&lt;/strong&gt;. 2. Setting the default domain name to be used on name lookups using &lt;strong&gt;ip domain name&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    - name: Set Base Network (DNS)
      community.ciscosmb.command:
        commands:
          - configure terminal
          - ip name-server 192.168.1.2 192.168.2.2
          - ip domain name domainname.local
          - exit

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Setting and Syncing Time and Date
&lt;/h2&gt;

&lt;p&gt;While it's potentially a good idea to simply set all devices to a set timezone, such as UTC and then, I thought Id include the other option of using a local timezone and even incorporating daylight savings changes. With this setup the switch logs will always be on the local time of those looking at them, assuming we aren't talking timezone spanning businesses. 1. Set the timezone code and its difference from UTC 2. Set the daylight savings start and end points 3. Set the NTP servers to sync time from. 4. Ensure the source is set to use those NTP servers&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    - name: Set Time Settings (Timezone &amp;amp; SNTP)
      community.ciscosmb.command:
        commands:
          - configure terminal
          - clock timezone AEST +10
          - clock summer-time AEDT recurring first sun oct 02:00 first sun apr 03:00
          - sntp server 192.168.1.3 poll
          - sntp server 192.168.2.3 poll
          - clock source sntp
          - exit

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Securing
&lt;/h2&gt;

&lt;p&gt;We only need the one secure method of access, and SSH is it. 1. Disabling Telnet, HTTP and HTTPS access&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    - name: Disable HTTP(S) and Telnet
      community.ciscosmb.command:
        commands:
          - configure terminal
          - no ip http server
          - no ip http secure-server
          - no ip telnet server
          - exit

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Set password security limits, but disabling ageing of the password being enforced by the switch
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    - name: Set Password Security
      community.ciscosmb.command:
        commands:
          - configure terminal
          - passwords aging 0
          - passwords complexity min-length 12
          - exit

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Completed
&lt;/h2&gt;

&lt;p&gt;Finally we can clearly add more in if there are other standard that need to be kept. Otherwise we write the config to the switch.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    - name: Write Config Changes
      community.ciscosmb.command:
        commands:
          - wr mem

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Not the most complicated playbook, but a useful one to get and keep everything at a set standard. Among other options, if you want to collect logs centrally another addition would be to set a syslog server to collect all logs from each device centrally.&lt;/p&gt;

</description>
      <category>networkdevops</category>
      <category>ansible</category>
      <category>cisco</category>
      <category>network</category>
    </item>
    <item>
      <title>Development on Fedora 41</title>
      <dc:creator>Justin Cooksey</dc:creator>
      <pubDate>Mon, 20 Jan 2025 05:00:00 +0000</pubDate>
      <link>https://dev.to/jscooksey/development-on-fedora-41-1nme</link>
      <guid>https://dev.to/jscooksey/development-on-fedora-41-1nme</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fil0o8j8cg2pqkbh5gekf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fil0o8j8cg2pqkbh5gekf.png" alt="Fedora 41 and VS Code" width="800" height="454"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  So, moving to Linux ...
&lt;/h2&gt;

&lt;p&gt;I've been using MacOS for a few years now for my own development environment, and always enjoyed using something different from the required work Windows systems. MacOS, and Apple hardware, have always been pretty on point in my oppinion. However, for a while now, I'd wanted to jump back in to Linux as my primary OS. I have already been moving away from commercial applications, getting rid of my Adobe account and migrating to using &lt;a href="https://www.darktable.org/" rel="noopener noreferrer"&gt;Darktable&lt;/a&gt; along with other subscription based applications (not all). This is my inital experience migrating from developing on Windows and MacOS to developing on Linux, or in particular &lt;a href="https://fedoraproject.org/" rel="noopener noreferrer"&gt;Fedora&lt;/a&gt; 41.&lt;/p&gt;

&lt;p&gt;Most of my development work is in &lt;a href="https://www.python.org/" rel="noopener noreferrer"&gt;Python&lt;/a&gt;, although work means I do a fair share of PowerShell, so the initial focus is around &lt;a href="https://www.python.org/" rel="noopener noreferrer"&gt;Python&lt;/a&gt; and getting my normal tools up and running.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://code.visualstudio.com/" rel="noopener noreferrer"&gt;Visual Studio Code&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://code.visualstudio.com/" rel="noopener noreferrer"&gt;Visual Studio Code&lt;/a&gt; (VSCode) does come as a FlatPak via the Software app in &lt;a href="https://fedoraproject.org/" rel="noopener noreferrer"&gt;Fedora&lt;/a&gt; 41, and its a pretty recent version (as of time of writting) at 1.96.1 with the latest being 1.96.4. However I opted to install directly off the VSCode web site and use the &lt;a href="https://code.visualstudio.com/Download" rel="noopener noreferrer"&gt;rpm download&lt;/a&gt;. This installed without any issues and the &lt;a href="https://fedoraproject.org/" rel="noopener noreferrer"&gt;Fedora&lt;/a&gt; Software app does show it as installed after using this method. I had no issues at all on first run and syning in the Extenxsion I use by sing Setting Sync to replicate what I have on my MacOS machine.&lt;/p&gt;

&lt;h2&gt;
  
  
  Shell
&lt;/h2&gt;

&lt;p&gt;I haven't yet explored and/or moved to &lt;a href="https://www.zsh.org/" rel="noopener noreferrer"&gt;ZSH&lt;/a&gt; at this time. I know that along with &lt;a href="https://ohmyz.sh/" rel="noopener noreferrer"&gt;Oh My Zsh&lt;/a&gt; it makes for a pretty useful Shell, but at this point I'm sticking with the default &lt;a href="https://www.gnu.org/software/bash/" rel="noopener noreferrer"&gt;bash&lt;/a&gt; and will look at options little later on.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://www.python.org/" rel="noopener noreferrer"&gt;Python&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Fedora 41 came with &lt;a href="https://www.python.org/" rel="noopener noreferrer"&gt;Python&lt;/a&gt; 3.13.1, which at the time of writing is the latest release version of &lt;a href="https://www.python.org/" rel="noopener noreferrer"&gt;Python&lt;/a&gt;. Sometimes though we need to be able to run our code against other, older versions of &lt;a href="https://www.python.org/" rel="noopener noreferrer"&gt;Python&lt;/a&gt;. Enter &lt;a href="https://github.com/pyenv/pyenv" rel="noopener noreferrer"&gt;pyenv&lt;/a&gt; ...&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://github.com/pyenv/pyenv" rel="noopener noreferrer"&gt;pyenv&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;If you havent used &lt;a href="https://github.com/pyenv/pyenv" rel="noopener noreferrer"&gt;pyenv&lt;/a&gt; before the &lt;a href="https://realpython.com/" rel="noopener noreferrer"&gt;Real Python&lt;/a&gt; site has a great article on &lt;a href="https://realpython.com/intro-to-pyenv/" rel="noopener noreferrer"&gt;Managing Multiple Python Versions With pyenv&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/pyenv/pyenv" rel="noopener noreferrer"&gt;pyenv&lt;/a&gt; took a little bit longer to get operational. This was because the default install of &lt;a href="https://fedoraproject.org/" rel="noopener noreferrer"&gt;Fedora&lt;/a&gt; 41 does not install development packages, so I had to do a little research and test and research again before I got it all working. First off was to install the development-tools group of packages after which I still had some missing libraries to add in as well. The final result is as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo dnf install @development-tools
sudo dnf install python3-tkinter python3-xlib bzip2-devel ncurses-devel libffi-devel readline-devel tk-devel libsqlite3x-devel

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This has now allowed me to install and use other versions of Python on my &lt;a href="https://fedoraproject.org/" rel="noopener noreferrer"&gt;Fedora&lt;/a&gt; 41 based laptop. Which means I can now update this web site with this article ...&lt;/p&gt;

</description>
      <category>python</category>
      <category>vscode</category>
      <category>linux</category>
      <category>fedora</category>
    </item>
    <item>
      <title>Cisco DHCP Pool conversion to Windows Server DHCP</title>
      <dc:creator>Justin Cooksey</dc:creator>
      <pubDate>Sun, 13 Oct 2024 05:00:00 +0000</pubDate>
      <link>https://dev.to/jscooksey/cisco-dhcp-pool-conversion-to-windows-server-dhcp-2ho9</link>
      <guid>https://dev.to/jscooksey/cisco-dhcp-pool-conversion-to-windows-server-dhcp-2ho9</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0x1x1ipwf5o2eqn2a533.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0x1x1ipwf5o2eqn2a533.png" width="415" height="222"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Well it was bound to happen!&lt;/strong&gt; Three years now after being asked to &lt;a href="https://justincooksey.com/blog/2021/2021-03-04-windows-server-dhcp-conversion-to-cisco-cli" rel="noopener noreferrer"&gt;migrate DHCP from Windows DHCP server to Cisco Routers, and automating that convertion&lt;/a&gt;, it's finally going back the other way.&lt;/p&gt;

&lt;p&gt;This time the PowerShell script will read through the file (an exported Cisco Router configuration) and build the Scopes in the Windows DHCP Role. The script will need to be run on the server becoming the DHCP server for those new scopes. The user would need to have administrator privilege to allow the DHCP settings to be made.&lt;/p&gt;

&lt;p&gt;The script follows these steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Reads through the configuration file and, using Regular Expressions, finds all DHCP Pools (Scopes), Static Assignments and Exclusions.&lt;/li&gt;
&lt;li&gt;Creates all the Scopes, along with all options found under that Pool in the router configuration file.&lt;/li&gt;
&lt;li&gt;Processes the Exclusions into each Scope&lt;/li&gt;
&lt;li&gt;Process all static assignments&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Still a little bit in the works at the time of this posting, but testing across multiple configurations has found it working well. The &lt;a href="https://github.com/jscooksey/Convert-CiscoDHCPToWindows" rel="noopener noreferrer"&gt;Code Repository can be found on GitHub&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Some DHCP Options are being handled as follows.
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Code&lt;/th&gt;
&lt;th&gt;Cisco Config&lt;/th&gt;
&lt;th&gt;Option Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;default-router&lt;/td&gt;
&lt;td&gt;Default Gateway&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;dns-server&lt;/td&gt;
&lt;td&gt;Domain Nameservers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;domain-name&lt;/td&gt;
&lt;td&gt;Domain Name&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;42&lt;/td&gt;
&lt;td&gt;option 42 ip&lt;/td&gt;
&lt;td&gt;NTP Servers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;43&lt;/td&gt;
&lt;td&gt;option 43 hex&lt;/td&gt;
&lt;td&gt;Vendor Specific Option, usually WAP Controller IP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;51&lt;/td&gt;
&lt;td&gt;lease&lt;/td&gt;
&lt;td&gt;Lease time&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;66&lt;/td&gt;
&lt;td&gt;next-server&lt;/td&gt;
&lt;td&gt;TFTP Server&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;66&lt;/td&gt;
&lt;td&gt;option 66 ip&lt;/td&gt;
&lt;td&gt;TFTP Server&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;67&lt;/td&gt;
&lt;td&gt;bootfile&lt;/td&gt;
&lt;td&gt;Boot filename&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;67&lt;/td&gt;
&lt;td&gt;option 67 ascii&lt;/td&gt;
&lt;td&gt;Boot filename&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Example Cisco Config&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ip dhcp excluded-address 10.10.0.1 10.10.1.0
ip dhcp excluded-address 10.10.3.220 10.10.3.223
ip dhcp excluded-address 192.168.0.1 192.168.0.9
!
ip dhcp pool PoolNumber1
 network 10.10.0.0 255.255.248.0
 update dns both override
 dns-server 10.10.255.1 10.10.255.2 
 domain-name domainname.local
 option 42 ip 10.10.249.11 10.10.248.11 
 default-router 10.10.0.1 
 lease 8
!
ip dhcp pool PoolNumber2
 network 192.168.0.0 255.255.255.0
 dns-server 192.168.0.10
 option 43 hex f108.0afe.0064
 default-router 192.168.0.1
!
ip dhcp pool Device1
 host 10.10.1.30 255.255.248.0
 client-identifier 01b7.37eb.1f1a.0a
 default-router 10.10.0.1 
!
ip dhcp pool Device2
 host 192.168.0.44 255.255.255.0
 client-identifier 0132.c19f.b7f3.3b

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;This script makes use of the &lt;a href="https://www.powershellgallery.com/packages/IPv4Calc" rel="noopener noreferrer"&gt;IPv4Calc Module&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>networkdevops</category>
      <category>dhcp</category>
      <category>windows</category>
      <category>powershell</category>
    </item>
    <item>
      <title>Netbox and Ansible for for Small to Mid Business Networks</title>
      <dc:creator>Justin Cooksey</dc:creator>
      <pubDate>Sat, 31 Aug 2024 04:00:00 +0000</pubDate>
      <link>https://dev.to/jscooksey/netbox-and-ansible-for-for-small-to-mid-business-networks-1i2j</link>
      <guid>https://dev.to/jscooksey/netbox-and-ansible-for-for-small-to-mid-business-networks-1i2j</guid>
      <description>&lt;p&gt;&lt;a href="https://docs.ansible.com/ansible/latest/index.html" rel="noopener noreferrer"&gt;Ansible&lt;/a&gt; and &lt;a href="https://netboxlabs.com/docs/netbox/en/stable/" rel="noopener noreferrer"&gt;Netbox&lt;/a&gt; are not just for the high end data centre systems. They can also be used on networks using small to medium business switches and routers such as the &lt;a href="https://www.cisco.com/c/en_au/solutions/small-business.html#~products" rel="noopener noreferrer"&gt;Cisco SMB Product&lt;/a&gt; range.&lt;/p&gt;

&lt;h2&gt;
  
  
  Initial Auditing and OnBoarding
&lt;/h2&gt;

&lt;p&gt;Initally I started with brand new empty &lt;a href="https://netboxlabs.com/docs/netbox/en/stable/" rel="noopener noreferrer"&gt;Netbox&lt;/a&gt;. In which I manually created a base setup adding in each:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Site&lt;/li&gt;
&lt;li&gt;Patch&lt;/li&gt;
&lt;li&gt;Device model in use&lt;/li&gt;
&lt;li&gt;Prefix, to begin with just the management subnets&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then creating a yaml file host listing to beging with, I ran an &lt;a href="https://docs.ansible.com/ansible/latest/index.html" rel="noopener noreferrer"&gt;Ansible&lt;/a&gt; Playbook that then went through that list of devices pulling base device information:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;IP Address (Management)&lt;/li&gt;
&lt;li&gt;Hostname&lt;/li&gt;
&lt;li&gt;Model&lt;/li&gt;
&lt;li&gt;Serial number&lt;/li&gt;
&lt;li&gt;Firmware (&lt;em&gt;This was not initally used&lt;/em&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This was then to record in to &lt;a href="https://netboxlabs.com/docs/netbox/en/stable/" rel="noopener noreferrer"&gt;Netbox&lt;/a&gt; as new devices as well as exported to CSV. After I had the devices in &lt;a href="https://netboxlabs.com/docs/netbox/en/stable/" rel="noopener noreferrer"&gt;Netbox&lt;/a&gt; I could do some base housekeeping and put them in the right sites, patches and rack locations.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://netboxlabs.com/docs/netbox/en/stable/" rel="noopener noreferrer"&gt;Netbox&lt;/a&gt;, the Source of Truth
&lt;/h2&gt;

&lt;p&gt;Once the devices were in and housekeeping done &lt;a href="https://netboxlabs.com/docs/netbox/en/stable/" rel="noopener noreferrer"&gt;Netbox&lt;/a&gt; then became the &lt;a href="https://netboxlabs.com/blog/what-is-a-network-source-of-truth/" rel="noopener noreferrer"&gt;Source of Truth&lt;/a&gt; for both our engineers and technicians and also for &lt;a href="https://docs.ansible.com/ansible/latest/index.html" rel="noopener noreferrer"&gt;Ansible&lt;/a&gt;. I could remove the hosts yaml file an dpointing AQnsible at Netbox for its inventory I could now allow playbooks to be run against a site and other locations or across the whole group.&lt;/p&gt;

&lt;h2&gt;
  
  
  Minimum config
&lt;/h2&gt;

&lt;p&gt;One of the frist tasks was to ensure I had all devices, configured to a standard. I hoped that they have been, but over time, without continued audits and checks, things can become a little out. So using &lt;a href="https://docs.ansible.com/ansible/latest/index.html" rel="noopener noreferrer"&gt;Ansible&lt;/a&gt; I was able to ensure some defaults are set, such has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Disabling of access methods, such as HTTP, Telnet and also HTTPS&lt;/li&gt;
&lt;li&gt;NTP time servers and synchronised time&lt;/li&gt;
&lt;li&gt;Name Servers&lt;/li&gt;
&lt;li&gt;Monitoring service setting (SNMP)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Backup config
&lt;/h2&gt;

&lt;p&gt;Another task for &lt;a href="https://docs.ansible.com/ansible/latest/index.html" rel="noopener noreferrer"&gt;Ansible&lt;/a&gt; was to get regular configuration backups for all devices. Running an &lt;a href="https://docs.ansible.com/ansible/latest/index.html" rel="noopener noreferrer"&gt;Ansible&lt;/a&gt; Playbook on a daily schedule (Cron) to pull the current configuration and store it on the local file system of the &lt;a href="https://docs.ansible.com/ansible/latest/index.html" rel="noopener noreferrer"&gt;Ansible&lt;/a&gt; server. This was then replicated off site over secure protocols.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- name: Gather Facts
  gather_facts: no
  hosts: device_roles_switch
  vars:
    output_path: "{{ lookup('env', 'HOME') }}/backups/"

  tasks:
    ## Create backup folder for today
    - name: Get date stamp for filename creation
      set_fact: date="{{lookup('pipe','date +%Y%m%d')}}"
      run_once: true

    # Get Switch Config
    - name: Get Config
      community.ciscosmb.facts:
        gather_subset:
          - config

    - name: Save Config
      copy:
        content: "{{ ansible_net_config }}"
        dest: "{{ output_path }}{{ inventory_hostname }}-{{ date }}.txt"

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Finding Trunks and Devices
&lt;/h2&gt;

&lt;p&gt;Another task was find all the trunks between switches &amp;amp; patches and docuemnt them correctly in Netbox. Running an &lt;a href="https://docs.ansible.com/ansible/latest/index.html" rel="noopener noreferrer"&gt;Ansible&lt;/a&gt; Playbook to use LLDP from gather facts to then determine th elinks between device, that could then be documented as Netbox cables. Once that was done I also used the &lt;a href="https://github.com/netbox-community/netbox-topology-views" rel="noopener noreferrer"&gt;Netbox Topology Views&lt;/a&gt; plugin to visualise the network.&lt;/p&gt;

&lt;p&gt;Once that was done I could also use MAC address searches to determine what ports IP Phones, DAPs and WAPs were connected to among other devices. Since a standard brand of those was used throughout it was only a matter of searching for the manufacturer portion of the MAC address.&lt;/p&gt;

</description>
      <category>networkdevops</category>
      <category>ansible</category>
      <category>network</category>
      <category>netbox</category>
    </item>
    <item>
      <title>Publishing Pelican Created Site</title>
      <dc:creator>Justin Cooksey</dc:creator>
      <pubDate>Sun, 30 Jul 2023 09:30:00 +0000</pubDate>
      <link>https://dev.to/jscooksey/publishing-pelican-created-site-8l4</link>
      <guid>https://dev.to/jscooksey/publishing-pelican-created-site-8l4</guid>
      <description>&lt;p&gt;&lt;a href="https://getpelican.com/"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wCP9Dfsc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://justincooksey.com/blog/2023/pelican.png" alt="" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is the second part (&lt;a href="https://dev.to/jscooksey/pelican-static-site-generator-4p8f-temp-slug-2831331"&gt;see part 1 here&lt;/a&gt;) of my migrating a static web site over to &lt;a href="https://docs.getpelican.com/en/latest/index.html"&gt;Pelican Static Site Generator&lt;/a&gt;, after my inital posting Pelican Static Site Generator&lt;/p&gt;

&lt;h2&gt;
  
  
  Google Analytics
&lt;/h2&gt;

&lt;p&gt;To transfer over &lt;a href="https://developers.google.com/analytics/devguides/collection"&gt;Google Analytics&lt;/a&gt; web site code to the Pelican created site was as simple as adding it in to pelicanconf.py as a varible and done. This is all well docmented on the &lt;a href="https://docs.getpelican.com/en/latest/settings.html"&gt;Pelican doumentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;pelicanconf.py&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GOOGLE_ANALYTICS = your_site_code

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Hosting and Replacing on Netlify
&lt;/h2&gt;

&lt;p&gt;As the GatsbyJS site was hosted on Netlify which also supports Python and Pelican builds rehosting on Netlify was relatively easy.&lt;/p&gt;

&lt;p&gt;First though was getting the source repository ready. Starting with making sure the requirements.txt file exists, as Netfliy build process will be using this to install the required python libraries for the site. I generally keep this up to date as I work, but simply creating it again with the usual command is easy enough:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pip freeze &amp;gt; requirements.txt

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then making sure the &lt;strong&gt;publishconf.py&lt;/strong&gt; file has all the correct settings for the final published site. This was pretty much correct and needed only confirming that it had the correct variables in it for the final site. Overwriting the development variables stored in &lt;strong&gt;pelicanconf.py&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;netfliy.toml&lt;/strong&gt; file in the root of the repo will give Netlify the commands to build the site and location of the built site files to publish:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[build]
command = "pelican content -s publishconf.py"
publish = "output"

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;also a block to specificy the page (HTML file) to display for a 404 page not found repsonse:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[[redirects]]
from = "/*"
to = "/404.html"
status = 404

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Linking in the new repo
&lt;/h2&gt;

&lt;p&gt;After those things are all settled it is just a matter of &lt;a href="https://docs.netlify.com/configure-builds/repo-permissions-linking/"&gt;linking the GitHub repo to the the Netlify site&lt;/a&gt;, and Netfliy will do the rest. Building the site and publishing it ready for use.&lt;/p&gt;

&lt;h2&gt;
  
  
  So is that it?
&lt;/h2&gt;

&lt;p&gt;Well, while I have the Pelican built site now the active builder for the static pages on the site, I still have plenty to work on. Plenty to upgrade including the theme, which is still not quite right, and of course content on the site for other projects and well whatever else is happening in life......&lt;/p&gt;

</description>
      <category>code</category>
      <category>python</category>
      <category>frontend</category>
      <category>pelican</category>
    </item>
    <item>
      <title>Pelican Static Site Generator</title>
      <dc:creator>Justin Cooksey</dc:creator>
      <pubDate>Sun, 18 Jun 2023 10:33:00 +0000</pubDate>
      <link>https://dev.to/jscooksey/pelican-static-site-generator-4fk4</link>
      <guid>https://dev.to/jscooksey/pelican-static-site-generator-4fk4</guid>
      <description>&lt;p&gt;&lt;a href="https://getpelican.com/"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wCP9Dfsc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://justincooksey.com/blog/2023/pelican.png" alt="" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I've been investigating &lt;a href="https://getpelican.com/"&gt;Pelican a static site generator&lt;/a&gt; to replace my current &lt;a href="https://www.gatsbyjs.com/"&gt;GatsbyJS&lt;/a&gt; generated site. Im far more at home and familiar with &lt;a href="https://www.python.org/"&gt;Python&lt;/a&gt; and &lt;a href="https://palletsprojects.com/p/jinja/"&gt;Jinja2&lt;/a&gt;, so that was part of my reasoning for taking a look in to it.&lt;/p&gt;

&lt;p&gt;So working along the basis of replacing my current GatsbyJS created site and posts with one created by Pelican, the following cover my initial issues and solutions. I've only added brief notes on what was done, without going in to detail as the plugin sites cover correct use in detail.&lt;/p&gt;

&lt;p&gt;Table of Contents&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Redirect old site paths&lt;/li&gt;
&lt;li&gt;Canonical&lt;/li&gt;
&lt;li&gt;Sitemap&lt;/li&gt;
&lt;li&gt;Social Media Shares&lt;/li&gt;
&lt;li&gt;RSS/Atom Feed&lt;/li&gt;
&lt;li&gt;Code Highlighting&lt;/li&gt;
&lt;li&gt;Conclusion&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Redirect old site paths
&lt;/h2&gt;

&lt;p&gt;In investigting moving to a new static site gernerator I also decided to change the sturcure a little. Since not many articles existed at the time of this posting minimal redirects will have to be created.&lt;/p&gt;

&lt;p&gt;So how does Pelican handle this on a per article basis?&lt;/p&gt;

&lt;p&gt;Enter the &lt;a href="https://github.com/slinkp/pelican-redirect"&gt;pelican-redirect&lt;/a&gt; plugin. Installing it is as simple as installling from PyPi&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pip install pelican-redirect

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then by adding an additional line in to the metadata of each post&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;original_url: blog/hacktoberfest-2019.html

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pelican will create an HTML file at the URL location specified that will redirect to the new post location that it will create.&lt;/p&gt;

&lt;h2&gt;
  
  
  Canonical
&lt;/h2&gt;

&lt;p&gt;In order to add the canonical header entry on articles using the &lt;strong&gt;SITEURL&lt;/strong&gt; variable does not create what you need if &lt;strong&gt;RELATIVE_URL = True&lt;/strong&gt; is set. To get around this and always use a full URL you can copy the &lt;strong&gt;SITEURL&lt;/strong&gt; variable in to &lt;strong&gt;CANONICALURL&lt;/strong&gt; and then use that variable in the &lt;strong&gt;base.html&lt;/strong&gt; template.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;pelicanconf.py&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SITEURL = "https://jscooksey.github.io/Pelican"
CANONICALURL = SITEURL

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;base.html&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;head&amp;gt;
  &amp;lt;title&amp;gt;{{SITENAME}}&amp;lt;/title&amp;gt;
  {% if article %}
    &amp;lt;link rel="canonical" href="{{ CANONICALURL }}/{{ article.url }}" /&amp;gt;
  {% endif%}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Sitemap
&lt;/h2&gt;

&lt;p&gt;To produce &lt;a href="https://developers.google.com/search/docs/crawling-indexing/sitemaps/overview"&gt;sitemap&lt;/a&gt; files for SEO add the &lt;a href="https://github.com/pelican-plugins/sitemap"&gt;pelican-sitemap&lt;/a&gt; plugin:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pip install pelican-sitemap

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and then adding a &lt;strong&gt;SITEMAP&lt;/strong&gt; variable to the &lt;strong&gt;pelicanconf.py&lt;/strong&gt; as described in the README of the Repo&lt;/p&gt;

&lt;h2&gt;
  
  
  Social Media Shares
&lt;/h2&gt;

&lt;p&gt;I also had on my curent site social media sharing links at the bottom of every article, allowing the reader to share the article on there own social media streams.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://github.com/pelican-plugins/"&gt;share-post&lt;/a&gt; plugin does this and again is simply installed using pip&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pip install pelican-share-post

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then in the article.html template add link to atricle.share_post attribute&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;a href="{{article.share_post\['twitter'\]}}"&amp;gt;...&amp;lt;/a&amp;gt;
&amp;lt;a href="{{article.share_post\['facebook'\]}}"&amp;gt;...&amp;lt;/a&amp;gt;
&amp;lt;a href="{{article.share_post\['linkedin'\]}}"&amp;gt;...&amp;lt;/a&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  RSS/Atom Feed
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://docs.getpelican.com/en/latest/settings.html#feed-settings"&gt;Adding in Atom (or RSS) feeds&lt;/a&gt; is as easy as changing a few options, as this is built in to Pelcon. Changing a few options in the &lt;strong&gt;pelicanconf.py&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;FEED_MAX_ITEMS = 20
FEED_ALL_ATOM = "feeds/all.atom.xml"
CATEGORY_FEED_ATOM = "feeds/{slug}.atom.xml"
TRANSLATION_FEED_ATOM = None
AUTHOR_FEED_ATOM = None
AUTHOR_FEED_RSS = None

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Code Highlighting
&lt;/h2&gt;

&lt;p&gt;Markdown code highlighting is processed ultimately through Pygment which can be personailsed but has some builtin styles. Examples are on the Pygment site &lt;a href="https://pygments.org/styles/#"&gt;here&lt;/a&gt; and css files for these can be copied from the repo &lt;a href="https://github.com/richleland/pygments-css"&gt;richleland/pygments-css&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You can copy the CSS file of your choice to your themes static folder (eg &lt;strong&gt;static/css/pygment.css&lt;/strong&gt; ) and then import that in the &lt;strong&gt;base.html&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@import url(pygment.css);

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Markdown code blocks can then be used and &lt;a href="https://www.markdownguide.org/extended-syntax/#syntax-highlighting"&gt;refer to the type of code&lt;/a&gt; inside them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;This is as far as I've gotten so far in working in Pelican and this Pelican created site is initially hosted on &lt;a href="https://pages.github.com/"&gt;GitHub Pages&lt;/a&gt; at the URL &lt;a href="https://jscooksey.github.io/Pelican/"&gt;https://jscooksey.github.io/Pelican/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'll as I figure things out further, with the intention this will replace the primary site hosted at my domain.&lt;/p&gt;

</description>
      <category>code</category>
      <category>python</category>
      <category>frontend</category>
      <category>pelican</category>
    </item>
    <item>
      <title>Windows Server DHCP conversion to Cisco CLI</title>
      <dc:creator>Justin Cooksey</dc:creator>
      <pubDate>Wed, 03 Mar 2021 21:00:00 +0000</pubDate>
      <link>https://dev.to/jscooksey/windows-server-dhcp-conversion-to-cisco-cli-4j6n</link>
      <guid>https://dev.to/jscooksey/windows-server-dhcp-conversion-to-cisco-cli-4j6n</guid>
      <description>&lt;p&gt;I recently ran in to an issue where I needed to convert a reasonably large DHCP database from a Windows Server in to a Cisco CLI to allow the Cisco to take over DHCP roles for a subnet. I found nothing that realy automated this task, even using the exported XML file. So knowing that this was the second time I needed the tool, and likely to need it again, even if it was for smaller tasks, I set about coding it in Powershell. It is the scripting system well supported in Windows land.&lt;/p&gt;

&lt;p&gt;The current version of the script can be found on my GitHub repository:&lt;a href="https://github.com/jscooksey/Convert-WindowsDHCPToCisco"&gt;Convert-WindowsDHCPToCisco&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Still ha smany DHCP options that it hasn't been setup to hanle at this point but it does follow the basic ones that most of us use.&lt;/p&gt;

&lt;h4&gt;
  
  
  Currently handles DHCP Options
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Code&lt;/th&gt;
&lt;th&gt;Option Description&lt;/th&gt;
&lt;th&gt;Cisco Output&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Default Gateway&lt;/td&gt;
&lt;td&gt;default-router&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Time Server&lt;/td&gt;
&lt;td&gt;&lt;em&gt;ignoring&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Domain Nameserver&lt;/td&gt;
&lt;td&gt;dns-server&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;Domain Name&lt;/td&gt;
&lt;td&gt;domain-name&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;42&lt;/td&gt;
&lt;td&gt;NTP Servers&lt;/td&gt;
&lt;td&gt;option 42 ip&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;51&lt;/td&gt;
&lt;td&gt;Lease time&lt;/td&gt;
&lt;td&gt;&lt;em&gt;ignoring&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;66&lt;/td&gt;
&lt;td&gt;TFTP Server&lt;/td&gt;
&lt;td&gt;next-server&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;67&lt;/td&gt;
&lt;td&gt;Boot filename&lt;/td&gt;
&lt;td&gt;bootfile&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;81&lt;/td&gt;
&lt;td&gt;MS DHCP Name Protection&lt;/td&gt;
&lt;td&gt;&lt;em&gt;ignoring&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;121&lt;/td&gt;
&lt;td&gt;Static routes&lt;/td&gt;
&lt;td&gt;option 121 hex&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;161&lt;/td&gt;
&lt;td&gt;FTP Server&lt;/td&gt;
&lt;td&gt;option 161 ip&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;162&lt;/td&gt;
&lt;td&gt;Path&lt;/td&gt;
&lt;td&gt;option 162 ascii&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;252&lt;/td&gt;
&lt;td&gt;Proxy PAC URL&lt;/td&gt;
&lt;td&gt;option 252 asicc&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h4&gt;
  
  
  DHCP References Used
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://tools.ietf.org/html/rfc2132"&gt;RFC2312&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Dynamic_Host_Configuration_Protocol#Client_configuration_parameters"&gt;Wikipedia DHCP Options table&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>powershell</category>
      <category>dhcp</category>
    </item>
    <item>
      <title>Hacktoberfest - What a great idea!</title>
      <dc:creator>Justin Cooksey</dc:creator>
      <pubDate>Sat, 02 Nov 2019 21:32:56 +0000</pubDate>
      <link>https://dev.to/jscooksey/hacktoberfest-what-a-great-idea-7cg</link>
      <guid>https://dev.to/jscooksey/hacktoberfest-what-a-great-idea-7cg</guid>
      <description>&lt;p&gt;While I enjoyed my first involvement with &lt;a href="https://hacktoberfest.digitalocean.com/"&gt;Hacktoberfest&lt;/a&gt; this year, I didn't end up completing enough pull request for the month. Partly this was due to a busy workload for the 9-5 job, but also I found that I wanted to find projects I could stay involved with. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://hacktoberfest.digitalocean.com/"&gt;Hacktoberfest&lt;/a&gt; did its job and got me more involved, more interested in contributing to open source projects on GiHub.  I'd already done a first step back in Dec 18 on &lt;a href="https://github.com/ollelauribostrom/rebus"&gt;ollelauribostrom/rebus&lt;/a&gt; which is a great repository for your first attempt at a pull request. So I was ready to find some more projects I could help with.&lt;/p&gt;

&lt;p&gt;To begin with I tried to just find anything that would get me across the line, but the fist project was really just an open repository to submit any code to help get 4 pull requests.  Not really what's intended, and a few of these were (rightly) getting excluded from the competition.&lt;/p&gt;

&lt;p&gt;The second one was valid, and gave me a better feeling of accomplishment when submitting the pull request, but that also made me more focussed on finding something that I could not only help with, but that I could have some continued interest in.&lt;/p&gt;

&lt;p&gt;I know that in a lot of projects any help is appreciated, and that full support of the whole project is not really required, as long as you can help solve the issue, add the feature.....  But I think I spent most of my time searching for that elusive project. One that was not only looking for help but was something that would be longer term than just one pull request.&lt;/p&gt;

&lt;p&gt;I'm thinking the only way to find these projects is time, getting involved in open source by helping any project you can, and somewhere along the way one will appear that really takes your focus.  Or perhaps, over time, a project you contribute to will become something more to you.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://hacktoberfest.digitalocean.com/"&gt;Hacktoberfest&lt;/a&gt; is a great idea. It got me contributing, and keen to try again next year, but I hope to keep its intent rolling through the year.&lt;/p&gt;

&lt;p&gt;My thanks to &lt;a href="https://www.digitalocean.com/"&gt;DigitalOcean&lt;/a&gt; and &lt;a href="https://dev.to/"&gt;DEV&lt;/a&gt; for the incentive.&lt;/p&gt;

</description>
      <category>hacktoberfest</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
