Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Developing your Windows environments with Puppet
Search
Peter Ericson
October 29, 2013
Technology
0
67
Developing your Windows environments with Puppet
From packer build to mco puppet runonce, automate and version your entire workflow in code.
Peter Ericson
October 29, 2013
Tweet
Share
More Decks by Peter Ericson
See All by Peter Ericson
Back to the future with Erlang (and Elixir)
pdericson
3
370
Other Decks in Technology
See All in Technology
DenoとJSRで実現する最速MCPサーバー開発記 / Building MCP Servers at Lightning Speed with Deno and JSR
yamanoku
1
230
doda開発 生成AI元年宣言!自家製AIエージェントから始める生産性改革 / doda Development Declaration of the First Year of Generated AI! Productivity Reforms Starting with Home-grown AI Agents
techtekt
0
180
Agentic Workflowという選択肢を考える
tkikuchi1002
1
240
Welcome to the LLM Club
koic
0
120
新卒3年目の後悔〜機械学習モデルジョブの運用を頑張った話〜
kameitomohiro
0
360
~宇宙最速~2025年AWS Summit レポート
satodesu
1
650
(非公式) AWS Summit Japan と 海浜幕張 の歩き方 2025年版
coosuke
PRO
1
320
Microsoft Build 2025 技術/製品動向 for Microsoft Startup Tech Community
torumakabe
1
180
Кто отправит outbox? Валентин Удальцов, автор канала Пых
lamodatech
0
240
原則から考える保守しやすいComposable関数設計
moriatsushi
3
490
Prox Industries株式会社 会社紹介資料
proxindustries
0
120
A2Aのクライアントを自作する
rynsuke
1
120
Featured
See All Featured
Intergalactic Javascript Robots from Outer Space
tanoku
271
27k
Speed Design
sergeychernyshev
31
1k
jQuery: Nuts, Bolts and Bling
dougneiner
63
7.8k
How to Ace a Technical Interview
jacobian
276
23k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
130
19k
Side Projects
sachag
455
42k
How to Think Like a Performance Engineer
csswizardry
24
1.7k
The World Runs on Bad Software
bkeepers
PRO
68
11k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
45
7.4k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
35
2.3k
Building an army of robots
kneath
306
45k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
123
52k
Transcript
Developing your Windows environments with Puppet Peter Ericson @pdericson
[email protected]
About me • I like OSs! • I don’t like
typing the same thing more than twice… • …so naturally I’m into automation! • I also like distributed systems and RESTful web services…
None
• High maintenance cost • Low flexibility • Focus is
removed from business value Hand crafted machines, no CM (idealised)
None
Automated OS install, CM • One Puppet Master • Sheep
herd well, outliers seldom get lost because of pack awareness • Cheap - utilising shared infrastructure (road), able to adapt to peak traffic
None
Hand crafted machines, no CM (reality) • chaos! • configuration
drift • slow turnaround • key-man risks • focus and energy spent in the wrong areas
Introducing The Sheep- Cat Herding Spectrum
Introducing The Sheep- Cat Herding Spectrum Hand crafted machines, no
CM
Introducing The Sheep- Cat Herding Spectrum Hand crafted machines, no
CM Hand crafted machines, CM
Introducing The Sheep- Cat Herding Spectrum Hand crafted machines, no
CM Hand crafted machines, CM Automated OS install, CM
Beyond the physical (and virtual physical) • The environment is
defined in code • Changes to the environment happen in code (e.g. Git branches, pull requests, etc) • Environments are hooked into CI/CD
Insert analogy here… • There does not currently exist an
automated way to produce sheep that are ready to be shawn and/or butchered • Infrastructure as code allows us to do something more meta
Demos…
What are we building? • A Puppet Master • A
Vagrant Base Box (Windows) • Two nodes (Windows)
vagrant up --provider=vmware_fusion puppet Demo - A Puppet Master
Vagrant.configure("2") do |config| ! config.vm.define :puppet do |puppet| puppet.vm.box =
"precise64_vmware" puppet.vm.box_url = "http://files.vagrantup.com/precise64_vmware.box" puppet.vm.hostname = "puppet" ! puppet.vm.provider :vmware_fusion do |v| v.vmx["memsize"] = 1024 v.vmx["rtc.diffFromUTC"] = 0 end ! puppet.vm.provision :shell, :path => "provision.sh" Vagrantfile
if [ ! -e /opt/puppet/bin/puppet ]; then ! # fix
hosts (add missing fqdn) sed -i 's/^127\.0\.0\.1.*/127.0.0.1 localhost/' /etc/hosts sed -i 's/^127\.0\.1\.1.*/127.0.1.1 puppet.localdomain puppet/' /etc/hosts ! # set apt proxy and update echo 'Acquire::http::Proxy "http://192.168.13.1:3128/";' >> /etc/apt/apt.conf apt-get update ! # install extra packages apt-get install -y rsync samba ! # install puppet enterprise tar xzf /vagrant/puppet-enterprise-3.1.0-ubuntu-12.04-amd64.tar.gz -C /tmp /tmp/puppet-enterprise-3.1.0-ubuntu-12.04-amd64/puppet-enterprise-installer -a / vagrant/puppet-enterprise-3.1.0-ubuntu-12.04-amd64.answers provision.sh (part 1/2)
q_all_in_one_install=y q_backup_and_purge_old_configuration=n q_backup_and_purge_old_database_directory=n q_database_host=localhost q_database_install=y q_database_port=5432 q_database_root_password=uSQJSzwTfYAyxywAiZ1R q_database_root_user=pe-postgres q_install=y q_pe_database=y
q_puppet_cloud_install=n q_puppet_enterpriseconsole_auth_database_name=console_auth q_puppet_enterpriseconsole_auth_database_password=CLUM7ShY0qcjj0LV5eDv q_puppet_enterpriseconsole_auth_database_user=console_auth q_puppet_enterpriseconsole_auth_password=password q_puppet_enterpriseconsole_auth_user_email=admin@puppet.localdomain q_puppet_enterpriseconsole_database_name=console q_puppet_enterpriseconsole_database_password=16DAKlq0Ke0YBtYCFyP5 q_puppet_enterpriseconsole_database_user=console q_puppet_enterpriseconsole_httpd_port=443 q_puppet_enterpriseconsole_install=y q_puppet_enterpriseconsole_master_hostname=puppet.localdomain q_puppet_enterpriseconsole_smtp_host=localhost q_puppet_enterpriseconsole_smtp_password= q_puppet_enterpriseconsole_smtp_port=25 q_puppet_enterpriseconsole_smtp_use_tls=n q_puppet_enterpriseconsole_smtp_user_auth=n q_puppet_enterpriseconsole_smtp_username= q_puppet_symlinks_install=y q_puppetagent_certname=puppet.localdomain q_puppetagent_install=y q_puppetagent_server=puppet.localdomain q_puppetdb_database_name=pe-puppetdb q_puppetdb_database_password=cIunOpWBPRJqv3RbAywZ q_puppetdb_database_user=pe-puppetdb q_puppetdb_hostname=puppet.localdomain q_puppetdb_install=y q_puppetdb_port=8081 q_puppetmaster_certname=puppet.localdomain q_puppetmaster_dnsaltnames=puppet,puppet.localdomain q_puppetmaster_enterpriseconsole_hostname=localhost q_puppetmaster_enterpriseconsole_port=443 q_puppetmaster_install=y q_run_updtvpkg=n q_vendor_packages_install=y puppet-enterprise-3.1.0- ubuntu-12.04-amd64.answers q_puppetmaster_install=y
# setup autosign for *.localdomain echo '*.localdomain' > /etc/puppetlabs/puppet/autosign.conf !
# add windows nodes to hosts as they come online # XXX this is less than ideal sudo -i -u root crontab -l > /tmp/crontab cat >> /tmp/crontab <<EOF * * * * * for n in \`/opt/puppet/bin/puppet cert list --all | grep '^+ "[a-z][a-z]*\.localdomain"' | grep -v '^+ "puppet\.' | sed 's/^+ "\(.*\)\..*/\1/'\`; do grep "\$n\.localdomain" /etc/hosts || echo \`nmblookup \$n | grep -v ^querying | awk '{print \$1}'\` \$n.localdomain \$n >> /etc/hosts; done EOF sudo -i -u root crontab /tmp/crontab rm -f /tmp/crontab ! … ! else ! # copy manifests and modules to puppet master rsync -prtv --delete --exclude \*~ /vagrant/manifests/ /etc/puppetlabs/puppet/manifests/ rsync -prtv --delete --exclude \*~ /vagrant/modules/ /etc/puppetlabs/puppet/modules/ ! # queue a puppet run on all nodes sudo -i -u peadmin mco puppet runonce -v # sudo -i -u peadmin mco puppet -F osfamily=windows runonce -v ! fi provision.sh (part 2/2)
packer build -var proxy=http://192.168.13.1:3128 template.json Demo - A Vagrant Base
Box (Windows)
{ "variables": { … }, ! "builders": [ … ],
! "provisioners": [ … ], ! "post-processors": [ … ] ! } template.json
{ "type": "vmware", "guest_os_type": "windows7srv-64", ! "vmx_data": { "memsize": 2048,
"numvcpus": 1 }, ! "disk_size": 50000, ! "iso_url": "./7601.17514.101119-1850_x64fre_server_eval_en-us-GRMSXEVAL_EN_DVD.iso", "iso_checksum": "30832ad76ccfa4ce48ccb936edefe02079d42fb1da32201bf9e3a880c8ed6312", "iso_checksum_type": "sha256", ! "ssh_username": "Administrator", "ssh_password": "{{user `password`}}", ! "boot_wait": "5m", ! "floppy_files": [ "scripts/Autounattend.xml", "scripts/cygwin.bat", "scripts/winrm.bat", "scripts/vmware.cer" ], ! "shutdown_command": "shutdown /d p:4:1 /s /t 0", ! "tools_upload_flavor": "windows" } builders
{ "variables": { … }, ! "builders": [ … ],
! "provisioners": [ … ], ! "post-processors": [ … ] ! } template.json
{ "type": "shell", "script": "scripts/vmware.sh", "execute_command": "chmod +x {{.Path}}; {{.Vars}}
http_proxy={{user `proxy`}} {{.Path}}" }, { "type": "shell", "inline": [ "mkdir -p .ssh", "echo 'ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA6NF8iallvQVp22WDkTkyrtvp9eWW6A8YVr +kz4TjGYe7gHzIw +niNltGEFHzD8+v1I2YJ6oXevct1YeS0o9HZyN1Q9qgCgzUFtdOKLv6IedplqoPkcmF0aYet2PkEDo3MlTBck FXPITAMzF8dJSIFo9D8HfdOV0IAdx4O7PtixWKn5y2hMNG0zQPyUecp4pzC6kivAIhyfHilFR61RGL +GPXQ2MWZWFYbAGjyiYJnAmCP3NOTd0jMZEnDkbUvxhMmBYSdETk1rRgm+R4LOzFUGaHqHDLKLX +FIPKcF96hrucXzcWyLbIbEgE98OHlnVYCzRdK8jlqm8tehUc9c9WhQ== vagrant insecure public key' >> .ssh/authorized_keys" ], "execute_command": "chmod +x {{.Path}}; {{.Vars}} http_proxy={{user `proxy`}} {{.Path}}" } provisioners
{ "variables": { … }, ! "builders": [ … ],
! "provisioners": [ … ], ! "post-processors": [ … ] ! } template.json
{ "type": "vagrant", "output": "windows.box", "compression_level": 0 } post-processors
vagrant up --provider=vmware_fusion foo bar Demo - Two nodes (Windows)
Let’s get coding • Add windows support to Puppet Forge
puppetlabs-ntp
else ! # copy manifests and modules to puppet master
rsync -prtv --delete --exclude \*~ /vagrant/manifests/ /etc/ puppetlabs/puppet/manifests/ rsync -prtv --delete --exclude \*~ /vagrant/modules/ /etc/ puppetlabs/puppet/modules/ ! # queue a puppet run on all nodes sudo -i -u peadmin mco puppet runonce -v # sudo -i -u peadmin mco puppet -F osfamily=windows runonce -v ! fi provision.sh (part 2/2)
mod 'puppetlabs/ntp' ! #mod 'ntp', # :git => '
[email protected]
:pdericson/puppetlabs- ntp.git',
# :ref => 'windows' ! mod 'puppetlabs/registry' Puppetfile
Demo - puppetlabs-ntp • Does not currently have Windows support…
• …So expect it to fail on Windows vagrant provision puppet
puppetlabs-ntp • Fork the puppetlabs repo, make some changes, submit
a pull request • https://github.com/pdericson/puppetlabs- ntp
#mod 'puppetlabs/ntp' ! mod 'ntp', :git => '
[email protected]
:pdericson/puppetlabs-ntp.git', :ref =>
'windows' ! mod 'puppetlabs/registry' Puppetfile (updated)
Demo - puppetlabs-ntp (fork) • Working? • If it isn’t
repeat vagrant provision puppet
More... • https://github.com/pdericson/talk-pupwin • @pdericson •
[email protected]