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
Ansible and Scala Projects
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Shannon
May 30, 2019
Technology
290
0
Share
Ansible and Scala Projects
Shannon
May 30, 2019
More Decks by Shannon
See All by Shannon
Signify Bootcamp
signify
0
280
Event Sourcing Blockchains at TokenAnalyst
signify
0
150
The Last Frontier and Beyond
signify
0
150
Jon Pither
signify
0
250
How to write like Cats
signify
0
250
Kubernetes as a Streaming Data Platform with Kafka, Spark, and Scala
signify
0
94
Writing human readable tests using Scala
signify
0
160
Making Contracts Smart, Secure and Functional with DAML and Scala
signify
0
130
Automatic differentiation in Scala by Xiayun Sun
signify
0
400
Other Decks in Technology
See All in Technology
ServiceNow Knowledge 26 の歩き方
manarobot
0
150
データを"持てない"環境でのアノテーション基盤設計
sansantech
PRO
1
140
AIコーディング時代における、ソフトウェアサプライチェーン攻撃に対する防衛術(簡易版)
soysoysoyb
0
120
生成AIが変える SaaS の競争原理と弁護士ドットコムのプロダクト戦略
bengo4com
1
2.3k
Good Enough Types: Heuristic Type Inference for Ruby
riseshia
1
300
ネットワーク運用を楽にするAWS DevOps Agent活用法!! / 20260421 Masaki Okuda
shift_evolve
PRO
2
220
LLM時代の検索アーキテクチャと技術的意思決定
shibuiwilliam
3
1.5k
Pure Intonation on Browser: Building a Sequencer with Ruby
nagachika
0
160
実践ハーネスエンジニアリング:TAKTで実現するAIエージェント制御 / Practical Harness Engineering: AI Agent Control Enabled by TAKT
nrslib
12
4.8k
ニックトレイン2026[名古屋]
furutaatsuya
0
100
Choose your own adventure in agentic design patterns
glaforge
0
150
運用システムにおけるデータ活用とPlatform
sansantech
PRO
0
120
Featured
See All Featured
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
1.9k
So, you think you're a good person
axbom
PRO
2
2k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
2.8k
brightonSEO & MeasureFest 2025 - Christian Goodrich - Winning strategies for Black Friday CRO & PPC
cargoodrich
3
680
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
220
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
2
770
sira's awesome portfolio website redesign presentation
elsirapls
0
220
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
170
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
2.9k
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.2k
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
200
Transcript
Ansible for Scala projects José Miguel 0pt1mates | @jm2dev 1
/ 39
Introducción ▶ Who am I? ▶ What do I do?
0pt1mates | @jm2dev 2 / 39
What do I want Make everything as simpler as possible,
but not simpler. Albert Einstein 0pt1mates | @jm2dev 3 / 39
Motivation ▶ Don’t repeat yourself ▶ Knwoledge sharing 0pt1mates |
@jm2dev 4 / 39
A definition Automated provisioning, also called self-service provision- ing, is
the ability to deploy an information technology or telecommunications service by using predefined proce- dures that are carried out electronically without requiring human intervention. 0pt1mates | @jm2dev 5 / 39
Options ▶ ansible ▶ cfengine ▶ chef ▶ puppet ▶
salt 0pt1mates | @jm2dev 6 / 39
Ansible ▶ Simple requisites ▶ ssh ▶ python ▶ Simple
language ▶ yaml 0pt1mates | @jm2dev 7 / 39
Setup ▶ python 3 with virtualenv mkdir proyecto cd proyecto
python3 -m venv venv 0pt1mates | @jm2dev 8 / 39
cat requirements.txt ansible 0pt1mates | @jm2dev 9 / 39
Inventario: cat hosts [local] 127.0.0.1 0pt1mates | @jm2dev 10 /
39
Tasks for a dev ▶ software installation ▶ copy files
▶ etc Our requirements for a Scala project: ▶ git ▶ openjdk ▶ sbt 0pt1mates | @jm2dev 11 / 39
Role ▶ Group tasks. mkdir -p roles/programador/tasks touch roles/programador/tasks/main.yml 0pt1mates
| @jm2dev 12 / 39
cat programador/tasks/main.yml --- - name: Update pacman cache become: true
pacman: update_cache: yes - name: Install packages become: true pacman: name: "{{ item }}" state: present 0pt1mates | @jm2dev 13 / 39
cat programador.yml --- - name: Preparacion proyecto X hosts: local
connection: local roles: - programador 0pt1mates | @jm2dev 14 / 39
Does it work? cd proyecto source venv/bin/activate pip install -r
requirements.txt ansible-playbook -i hosts programador.yml 0pt1mates | @jm2dev 15 / 39
Role per project ▶ barebone project ▶ more things to
automate? 0pt1mates | @jm2dev 16 / 39
Tasks version 2 Let’s clean in it a bit mv
roles/programador/tasks/main.yml \ roles/programador/tasks/paquetes.yml 0pt1mates | @jm2dev 17 / 39
cat roles/programador/tasks/sbt.yml --- - name: SBT config plugins directory file:
path: "{{ home_dir }}/.sbt/1.0/plugins" recurse: yes state: directory mode: 0755 - name: SBT Global plugins copy: src: files/plugins.sbt 0pt1mates | @jm2dev 18 / 39
Those variables touch group_vars/all --- home_dir: "{{ lookup('env', 'HOME') }}"
0pt1mates | @jm2dev 19 / 39
Configuring SBT (II) mkdir -p roles/programador/files touch roles/programador/files/plugins.sbt touch roles/programador/files/repositories.sbt
0pt1mates | @jm2dev 20 / 39
cat roles/programador/files/plugins.sbt addSbtPlugin("org.ensime" % "sbt-ensime" % "2.1.0") addSbtPlugin("io.get-coursier" % "sbt-coursier"
% "1.1.0-M1 addSbtPlugin("net.virtual-void" % "sbt-dependency-graph" % addSbtPlugin("org.scoverage" % "sbt-scoverage" % "1.5.1") 0pt1mates | @jm2dev 21 / 39
cat roles/programador/files/repositories.sbt [repositories] local my-ivy-proxy-releases: https://nexus.proyecto.xyz/content [organization]/[module]/(scala_[scalaVersion]/)(sbt_[sb my-maven-proxy-releases: https://nexus.proyecto.xyz/conte 0pt1mates
| @jm2dev 22 / 39
cat roles/programador/tasks/git.yml --- - name: Git config directory file: path:
"{{ home_dir }}/.config/git" state: directory mode: 0755 - name: Git setup template: src: templates/git_config.j2 dest: "{{ home_dir }}/.config/git/config" 0pt1mates | @jm2dev 23 / 39
Configuring GIT (II) What are templates? mkdir -p roles/programador/templates touch
roles/programador/templates/git_config.j2 0pt1mates | @jm2dev 24 / 39
cat roles/programador/templates/gitconfig .j2 [user] name = {{ git_username }} email
= {{ git_email }} [color] ui = auto [push] default = simple [core] 0pt1mates | @jm2dev 25 / 39
Configuring GIT (IV) And those are … variables? mkdir -p
roles/programador/vars touch roles/programador/vars/main.yml 0pt1mates | @jm2dev 26 / 39
cat roles/programador/vars/main.yml --- git_username: Jose Miguel Martinez Carrasco git_email:
[email protected]
0pt1mates | @jm2dev 27 / 39
Developer tasks (II) And the new main.yml version: --- -
import_tasks: paquetes.yml - import_tasks: git.yml - import_tasks: sbt.yml 0pt1mates | @jm2dev 28 / 39
Porject X role ▶ simple & functional setup ▶ extensible
0pt1mates | @jm2dev 29 / 39
Tasks mkdir -p roles/proyectoX/tasks touch roles/proyectoX/tasks/main.yml touch roles/proyectoX/tasks/database.yml --- -
import_tasks: database.yml 0pt1mates | @jm2dev 30 / 39
A database --- - name: Update pacman cache become: true
pacman: update_cache: yes - name: Install postgresql become: true pacman: name: "{{ item }}" state: present 0pt1mates | @jm2dev 31 / 39
Fatjar ▶ package our service as a fatjar ▶ run
it locally as a service so we can ▶ run integration/acceptance tests 0pt1mates | @jm2dev 32 / 39
Systemd unit mkdir -p roles/fatjar/{tasks,templates,vars} touch roles/fatjar/tasks/main.yml touch roles/fatjar/templates/fatjar.service.j2 touch
roles/fatjar/vars/all 0pt1mates | @jm2dev 33 / 39
cat roles/fatjar/vars/all service_user: "hello" service_name: "Hello" service_install_dir: "/opt/{{ service_name }}"
bin_location: "{{ service_install_dir }}/bin/server" 0pt1mates | @jm2dev 34 / 39
cat roles/fatjar/templates/fatjar.service.j2 [Unit] Description={{ service_name }} After=syslog.target [Service] ExecStart={{ bin_location
}} User={{ service_user }} [Install] WantedBy=multi-user.target 0pt1mates | @jm2dev 35 / 39
cat roles/fatjar/tasks/main.yml - name: Create systemd directory file: path: "{{
service_install }}" state: directory mode: 0755 - name: Install fatjar service copy: src: "item" dest: "{{ service_install }}" with_items: 0pt1mates | @jm2dev 36 / 39
Playbook --- - name: Preparacion proyecto X hosts: local connection:
local roles: - programador - proyectoX - fatjar 0pt1mates | @jm2dev 37 / 39
Finally curl localhost:8080/hello/scalaInTheCity { "message": "Hello, Scala in the City"
} 0pt1mates | @jm2dev 38 / 39
Contact @jm2dev 0pt1mates | @jm2dev 39 / 39