ときどきAnsible日記

主にITインフラ基盤の自動化に関する事を書いているブログです

with_itemsの使い方

お疲れ様です。伊藤です。
すいません、サボっていたわけではないのですが1ヶ月...ってか丸2ヶ月ぶりの更新です。サボって...たのかな...


Playbook内で繰り返しを使いたい場合があります。たとえばユーザを作成する際に変数にユーザ名を複数入れても作成する側で繰り返し処理を入れていないと1ユーザしか作成されません。プログラムを書いたことがある人であれば当たり前のことですが、インフラとなるとなかなかプログラミング経験がない方も多いので、苦労されるかもわかりません。そーゆー意味にでも、今はちょっとコードを書けるインフラ技術者が引く手数多だと聞きます。

では繰り返し処理の書き方ですが、結構簡単です。が、種類がいっぱいあるので、なれないといやな感じがします。でもとりあえずこれさえ覚えておけばOK。with_itemsです。まあ普通に調べるとこれが出てきますね。ただし、使い方は簡単なのですが、その周りが少々わかりづらい部分がありますので、最後にちょっと説明出来ればと思います。

まずは変数の宣言ですが、以下のような形になります。

vars: 
 user_info:
   user_name: test_user

varsは変数宣言の先頭です。varsフォルダのmain.ymlに記載する際には不要ですが、Playbook内に記載する際には必要となります。
実際の変数はuser_infoからです。user_infoの配下にuser_nameという変数があり、そこにtest_userという値を入れています。書き方を変えると
user_info.use_name=test_user
という感じです。こっちのほうがわかりやすい人が多いかと思います。実際にPlaybook内で使用するにはこちらの形になります。

また、これでuser_nameを複数持たせたい場合は

vars: 
 user_info:
   - user_name: test_user1
   - user_name: test_user2

という感じで先頭に‐(ハイフン)をつけます。
さらにこのユーザごとに変数を増やしたい場合は

vars: 
 user_info:
   - user_name: test_user1
     user_id: 1
     user_group: 1
   - user_name: test_user2
     user_id: 2
     user_group: 2

という感じで増やしていきます。この辺の理解がないと結構混乱します。

データベースっぽく表現するとこんな感じになります。
f:id:pj_doaa:20180403162514p:plain

そしてこの変数をUserを作るモジュールに当てはめていきます。単純に繰り返しをしない場合は下記のようになります。

---
- name: user make
  user:
    name: '{{ user_info.user_name }}'
    uid: '{{ user_info.user_id | default(omit) }}'
    group: '{{ user_info.user_group | default(omit) }}'
    state: 'present'

変数は{{}}に囲まれた形で表記されます。default(omit)はこの変数定義がなかった場合にはデフォルト値を入れる、という意味です。このパイプの書き方はjinja2のフィルターという機能を使っています。まあ慣れれば難しいものではないですね。

で、これを繰り返し表現で書くとこんな感じ

---
- name: user make
  user:
    name: '{{ item.user_name }}'
    uid: '{{ item.user_id | default(omit) }}'
    group: '{{ item.user_group | default(omit) }}'
    state: 'present'
  with_items: "{{ user_info }}"

with_itemsで宣言した変数の中身がitemという名前で置き換えられて展開されます。こうしておけば変数に追加するたびにどんどんユーザが作成されていくというわけです。非常に簡単ですね。

ただ冒頭で書いたちょっとハマるとしては、変数と連携しておかないとエラーになるというところです。途中で変数にハイフンをつけて複数入力可能にしましたが、あれをリスト形式と呼びます。変数がリストの場合は繰り返しにしておかないとエラーになります。また、リスト形式でない変数を繰り返しに入れるとエラーになります。このあたりやや注意が必要です。

取り合えずwith_itemsについては以上です。機会があればほかの繰り返し表現についても記載していきます。例えばwith_sequenceなどは連番で繰り返しなどが出来て便利なのですがあまり記載がなかったりするので…それ辺はまた今度書きます。

お疲れ様でした。

インフラ勉強会やりました

お疲れ様です。伊藤です。

完全に身内向けの記事ですが、ご了承ください。
去る1/31にグループ社内に向けてAnsibleとDockerの情報共有会を行いました。
30名を超える皆様にお集まりいただき、誠にありがとうございます。
本来であれば最初に色々と説明するつもりが、開始当初にPCが怪しい動きを起こしてテンパってしまい、何も説明出来なかったことをお詫びいたします。(最初2時間予定って言っておきながら1時間30分で終わったこととか。。)

というわけで勉強会で上がったQAをこちらにまとめておきます。
もし、「俺の質問どこ行った!?」という方がいらっしゃれば是非ご連絡ください(すいません、書記がいなくて。。)あと、私の知識で答えていますが、お客様などに提案する場合には裏取りをお願いいたします(弱気)
あと有識者の方で「おいおい嘘ついてんじゃねーよ」というかたがいらっしゃいましたら是非コメントをください。よろしくお願いいたします。


【Ansible】
Q Ansibleに対応しているOSバージョンは?
A 公式ではPythonのバージョンしか謡っていないのでOSバージョンは特に縛りはないと思います。個人的な実績としてはコントロールサーバ(Ansibleをインストールするサーバ)はAnsible2.0でRHEL6.7とRHEL7.3で動作することは確認しました。なお、Windows版は今のところありません。ターゲットサーバ(設定変更する側)はもっと敷居が低いのでRHEL6~7およびCentOSなどのLinuxとWindowsServerが動作します。SSHPythonやWinRM・PowerShellのバージョンさえ合っていれば。その辺は下記URLをご参照ください(英語ですが。。)
http://docs.ansible.com/ansible/latest/intro_installation.html#control-machine-requirements
http://docs.ansible.com/ansible/latest/intro_installation.html#managed-node-requirements


Q WindowsのModuleの対応が遅れている理由は?
A そもそもAnsible自体がWindowsに対応しておらず正式に対応したのは2016年頃になります。なのでそこからModuleを作り始めた、というのが理由になるかと思います。あとはWindows自体あまり自動化に向けて作られていない(GUI操作とか)のでそのあたりも理由になります。


Q AnsibleでSSH接続する際、鍵認証などしてセキュリティは問題ないか?
A 問題あります。このあたりは色々といわれていて、懸念すべき点です。鍵認証が嫌な場合はAnsible実行時にパスワードを直打ちする方法もありますが、自動化に向けては懸念があるので、やはり鍵認証がよいと思われます。その場合は普段Ansibleサーバは落として置く、などの考慮が必要かと。ちなみにprojectドアではAnsibleはDockerコンテナに入れて、通常は停止させておく、という考慮をしています。


Q Playbookをcronなどに仕込む場合にはシェルを使うべきか
A 好みにもよると思いますが、単純な定期動作であればAnsibleのコマンドをそのままcronに登録しておくのも可能と思います。そこに引数を渡して動的に動かしたい場合にはシェルが向いていると思います。


A Ansibleは有償?
Q Ansibleの単純な機能は無償で提供されています。他に有償のAnsibleTowerというGUI操作できるものがあります。が昨年の中頃、単純機能にもサポートがついたAnsibleEngineという有償版が発表され、逆にAnsibleTowerの無償版もリリースされました。


Q Ansible、Chef、Puppetに使い分けはあるのか?
A すいません、こちらは当時はちゃんと説明できていませんでした。新規で取り入れる場合にはエージェントレスのAnsibleがおすすめですが、すでにシステムにChefやPuppetが組み込まれて稼働している場合には無理に取り入れる必要はないと思います。


Q Playbookを条件付きで動かす場合にはJP1などを使うべきか?
A 基本はJP1などのジョブ管理ソフトが必要になると思います。シェルとcronなどでも可能だと思いますが作りこみが必要です。


Q Ansibleでネットワーク機器などの設定も可能か?
A Redhat社ではすべてのインフラ機器をAnsibleで管理したいそうなのでゆくゆくはそうなると思います。昨年中頃、Ansible有償版が発表された際に、ネットワークの機能も追加されたようです。


Q Ansibleで管理するサーバ情報はIPになるか?
A インベントリファイルにIPかホスト名を書きます。Hostsなどで名前解決されている場合はホスト名のみで動作します。インベントリファイル内でグルーピングなども可能です。


【Docker】
Q コンテナ内でのカーネルはどうなっているのか?
A コンテナはホストOSのカーネルを共有しています。なのでホストOSのカーネルに依存します。


Q Dockerのイメージファイルで対応できるOSのバージョンは?
A Linuxであれば過去バージョンは全て対応できる(はず)現状DockerHUBにRHEL6~7やCentOSのイメージが上がっているのでそれらは対応しています。


Q ホストOSからコンテナ内のプロセスはどう見えるか?
A ホストOSからコンテナで起動しているプロセスはそのまま見えます。


Q プロジェクトドアではどの辺にDockerを使ったか
A AnsibleをDockerのコンテナの中に入れました。理由はリリース時にコンテナごとリリース出来るからです。また、コンテナにすることにより使用時以外はコンテナを停止させてセキュリティ面も考慮してDockerを使いました。


Q Dockerに癖があるという話だが具体的には?
A 特にDockerコンテナについては1コンテナ1プロセスという考え方があり、(DockerHubにイメージが上がってるものは簡単ですが)通常のアプリを動かす際はハードルが上がります。機能別にコンテナを分けたとしてもコンテナ同士は共有メモリなども切り分けられており、今までのような通信もできなくなるためアプリの構成を見直す必要があります。また、明確な保守も受けられないと思いますので本番環境で使うにはそれなりのリスクを負う必要があります。


Q Dockerを商用利用している企業はあるか?
A こちらをご参照ください。事例から考えるDockerの本番利用に必要なこと | Think IT(シンクイット)


Q Tomcatのwarファイルなどはコンテナに引き継げるのか?
A イメージファイル内に取り込まれますので、コンテナに引き継げます。一旦構築したサーバからイメージファイルを作成し、そのOSイメージをコンテナにすることができます。


質問が漏れてるよ!って方は是非ご連絡を。ビールおごります。
以上です。お疲れ様でした。