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
他作Playbookを実行することになって読みにくかった話
Search
Daichi Yamaguchi
June 23, 2020
Technology
1.9k
3
Share
他作Playbookを実行することになって読みにくかった話
Ansible Night Online 2020.06
Daichi Yamaguchi
June 23, 2020
More Decks by Daichi Yamaguchi
See All by Daichi Yamaguchi
CloudNativeをなぜ実践するのか? / Why practive CloudNative
dayamaguchi1
1
560
CloudNative Nagoya Code of conduct
dayamaguchi1
0
54
Dockerインストール後の設定をしよう/Set up after installing Docker
dayamaguchi1
2
790
ITエンジニアが学ぶ「ティール組織」概要 / IT Engineer learns "Teal organization" summary
dayamaguchi1
2
240
Rancherから始めるCloud Native Journey / Start with Rancher Cloud Native Journey
dayamaguchi1
0
390
Other Decks in Technology
See All in Technology
Bref でサービスを運用している話
sgash708
0
220
Tour of Agent Protocols: MCP, A2A, AG-UI, A2UI with ADK
meteatamel
0
200
契約書からの情報抽出を行うLLMのスループットを、バッチ処理を用いて最大40%改善した話
sansantech
PRO
3
340
【Oracle Cloud ウェビナー】データ主権はクラウドで守れるのか?NTTデータ様のOracle Alloyで実現するソブリン対応クラウドの最適解
oracle4engineer
PRO
3
130
第26回FA設備技術勉強会 - Claude/Claude_codeでデータ分析 -
happysamurai294
0
350
Babylon.js Japan Activities (2026/4)
limes2018
0
150
不確実性と戦いながら見積もりを作成するプロセス/mitsumori-process
hirodragon112
1
180
AIエージェント時代に必要な オペレーションマネージャーのロールとは
kentarofujii
0
290
推し活エージェント
yuntan_t
1
420
バックオフィスPJのPjMをコーポレートITが担うとうまくいく3つの理由
yueda256
1
160
JEDAI認定プログラム JEDAI Order 2026 受賞者一覧 / JEDAI Order 2026 Winners
databricksjapan
0
490
Cortex Code君、今日から内製化支援担当ね。
coco_se
0
190
Featured
See All Featured
Skip the Path - Find Your Career Trail
mkilby
1
93
Done Done
chrislema
186
16k
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
0
190
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
470
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
99
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
700
WCS-LA-2024
lcolladotor
0
510
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
200
Ethics towards AI in product and experience design
skipperchong
2
250
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
320
Transcript
他作Playbookを 実行することになって 読みにくかった話 Ansible Night オンライン! 2020.06 山口大地 (@dayamaguchi1)
自己紹介 氏名:山口 大地( @dayamaguchi1 ) 所属会社:株式会社エイチームライフスタイル [業務] AWS インフラ全般(最近は terraform
触ることが多い) [ その他 ] ・ Ansible Night in Nagoya 2019.02 の登壇以来です ・在宅勤務の間にフィットボクシングとスパイスカレーに目覚めました ・土曜日に映画ミッドサマー ディレクターズカット版をみて心が沈んでいます
今日伝えたいこと • Ansible でプログラマブルなコードを書くと複雑性が増してわかりにくい • 想定どおり動かないケースもあるから気をつけよう
業務背景 • 旧い環境を再現する必要があった • 過去に作成された AnsiblePlaybook を利用して、環境を再現させる • 現行環境に追随されていないので、そこの差分は個別で埋めていく(これは本発表 外の話)
問題が起きたコード - name: "Httpd 設定ファイルコピー(staging)" when: web.server_name_staging is defined template:
src: 'vhost.d/staging.conf' dest: '/etc/httpd/conf.d/vhost.d/staging.conf' - name: "Httpd 各種ディレクトリ展開 (staging)" when: web.server_name_staging is defined set_fact: web: env: 'staging' - name: "Httpd 設定ファイルコピー(prod)" when: web.server_name_prod is defined template: src: 'vhost.d/prod.conf' dest: '/etc/httpd/conf.d/vhost.d/prod.conf' - name: "Httpd 各種ディレクトリ展開 (prod)" when: web.server_name_prod is defined set_fact: web: env: 'prod' vars: web: server_name_prod: "{{ inventory_hostname }}" server_name_staging: "{{ inventory_hostname | regex_replace('prod', 'staging') }}"
問題が起きたコード - name: "Httpd 設定ファイルコピー(staging)" when: web.server_name_staging is defined template:
src: 'vhost.d/staging.conf' dest: '/etc/httpd/conf.d/vhost.d/staging.conf' - name: "Httpd 各種ディレクトリ展開 (staging)" when: web.server_name_staging is defined set_fact: web: env: 'staging' - name: "Httpd 設定ファイルコピー(prod)" when: web.server_name_prod is defined template: src: 'vhost.d/prod.conf' dest: '/etc/httpd/conf.d/vhost.d/prod.conf' - name: "Httpd 各種ディレクトリ展開 (prod)" when: web.server_name_prod is defined set_fact: web: env: 'prod' vars: web: server_name_prod: "{{ inventory_hostname }}" server_name_staging: "{{ inventory_hostname | regex_replace('prod', 'staging') }}" この変数(web.server_name_staging)の定 義有無で判定したいようだ stagingかprodか、環境に応じて配置する configを変えたいようだ
問題が起きたコード - name: "Httpd 設定ファイルコピー(staging)" when: web.server_name_staging is defined template:
src: 'vhost.d/staging.conf' dest: '/etc/httpd/conf.d/vhost.d/staging.conf' - name: "Httpd 各種ディレクトリ展開 (staging)" when: web.server_name_staging is defined set_fact: web: env: 'staging' - name: "Httpd 設定ファイルコピー(prod)" when: web.server_name_prod is defined template: src: 'vhost.d/prod.conf' dest: '/etc/httpd/conf.d/vhost.d/prod.conf' - name: "Httpd 各種ディレクトリ展開 (prod)" when: web.server_name_prod is defined set_fact: web: env: 'prod' vars: web: server_name_prod: "{{ inventory_hostname }}" server_name_staging: "{{ inventory_hostname | regex_replace('prod', 'staging') }}" envの変数を定義したいようだ(なんでここで ・・・?) mainのvarsで定義されており、inventory_hostname が登録されるようだ inventory_hostnameをweb.prod.local.testに指定し た場合、以下の通りになるはず server_name_prod:web.prod.local.test server_name_staging: web.staging.local.test
コードを動かす前の私の考え inventory_hostname を web.prod.test.local とした場合、以下の var が有効になる server_name_prod = web.prod.local.test
server_name_staging = web.staging.local.test 定義されたので、 when の条件分岐も true となる web.prod.test.local 上に prod と staging 両方の httpd config が配置されるだろう
実行してみたらそうならなかった TASK [web : Httpd 設定ファイルコピー (staging)] ***************************************************************************************** changed: [web.prod.test.local]
=> ~~~(ry~~~~ TASK [web : Httpd 各種ディレクトリ展開 (staging)] **************************************************************************************** ok: [web.prod.test.local] => {"ansible_facts": {"web": {"env": "staging"}}, "changed": false} TASK [web : Httpd 設定ファイルコピー (prod)] ******************************************************************************************** skipping: [web.prod.test.local] => ~(ry~: "Conditional result was False"} TASK [web : Httpd 各種ディレクトリ展開 (prod)] ******************************************************************************************* skipping: [web.prod.test.local] => {"changed": false, "skip_reason": "Conditional result was False"}
実行してみたらそうならなかった TASK [web : Httpd 設定ファイルコピー (staging)] ***************************************************************************************** changed: [web.prod.test.local]
=> ~~~(ry~~~~ TASK [web : Httpd 各種ディレクトリ展開 (staging)] **************************************************************************************** ok: [web.prod.test.local] => {"ansible_facts": {"web": {"env": "staging"}}, "changed": false} TASK [web : Httpd 設定ファイルコピー (prod)] ******************************************************************************************** skipping: [web.prod.test.local] => ~(ry~: "Conditional result was False"} TASK [web : Httpd 各種ディレクトリ展開 (prod)] ******************************************************************************************* skipping: [web.prod.test.local] => {"changed": false, "skip_reason": "Conditional result was False"} どうでもいい話ですが、 (ry って死語かな?と弊社チャットで話題になったら、 2020 年新卒の方から古文に片足つっこんでますとコメントいただきました
なんでskipされてしまうん? • よくわからん(教えて詳しい人) • 作業的には vars の server_name_staging をコメントアウトすることで、 httpd(prod)
が実 行できた ◦ set_fact で設定した env 変数が、この先の playbook の条件分岐で利用されている ◦ ここが skip されると prod 用の環境構築ができない状態になる • 期待としては変数を上書きして動的に処理させたかったのだと思われる ◦ けど実行できてなかったので、正しい状態とは言えない
まとめ • 変数を上書きしていく、はプログラマブルな発想 • ansible においては条件分岐はミスの元なので、多用しない方が良さそう ◦ ましてや条件分岐の先に条件分岐があると、もはやよくわからん状態に ◦ 複雑性が増していくだけなので、個人的には使いたくない
◦ 変数を指定したい場合は、 playbook 内で set_fact しなくても普通に vars に書けば良い
おわり