grasys blog

Ansible 初心者が直面した壁とは?実際に試してわかった苦戦ポイント

はじめまして、grasys の中村です。
今回は私が途中参入で Ansible を触った際に躓いたことについてブログを執筆させていただきます。

執筆者のスキルとしては、
・Ansible 初見
・プログラミングを書いていたので、プログラムは読める(親子や変数などを追って読める)
レベルとなります。

同じようなレベルで初見の Ansible に触れた方の助けになれば幸いです。

Ansible playbook コマンド復習

私がよく使っていたオプションについて
“`

-C : check モード=つまりデバックモードで試しに実行したい時に実行
 ※実際に実行するわけではないので、FW や実態のインストールなどは実行しない

-i : ファイルを指定する(playbook や hosts を指定する)

-D : diff。差分を表示

-l : host 名を指定。(後述の hosts を指定)

“`

Ansible の構造よくわからん

まず、Ansible が読めませんでした。
何をどう読んで取っ掛かればいいのか?ということです。

最初に基本構造を書きます。

Ansible は主に 4 つのファイルで構成されています。

1. Ansible-playbook

  – roles で設定されているファイル実行用(roles フォルダ配下記載)
  – roles と host に関係します

playbook/ansible-playbook.yml
######################
- name: "shell script"
  hosts: "base"  # hosts に今後記載する内容
  remote_user: "ansible" # 実行ユーザ(基本 Ansible)
  become: yes #上記指定のユーザ以外でも実行の必要がある場合(基本 yes でいいです)
    - { role: "shellscript" } # 今回はシェル配置したいと仮定します
- name: "linux base"
  hosts: "base"
  remote_user: ansible
  become: yes
    - { role: "os-config"}

2.hosts

  – playbook の hosts記載の内容との親子関係を記載
  – -l オプション で指定した際に何を実行するのか?が記載されているファイル(ルーティングのようなもの)

inventory/hosts
###############
[base] ←playbook の hosts
linux_gcp
linux_azure
linuz_aws
windows_gcp
windows_Azure
windows_aws

[linux_gcp]
ligcp1
ligcp2

[linux_azure]
liazu1
liazu2

上記の場合、例えば

ansible-playbook -D -i inventory/hosts -i playbook/ansible-playbook.yml -l base

と実行すると
ligcp1,ligcp2,liazu1,liazu2 の 4 サーバに設定が流れます。

もし絞りたい場合は、

base > linux_gcp > ligcp1

と絞ればいいわけです。

3. vars

  – roles の変数を埋め込めます
  – ファイル名は hosts記載の名前の yml ファイル!
  – hosts,roles に関係

inventory/group/linux_gcp.yml
#############
shell_script:
  - name: "daily"
  - name: "weekly"

hosts に埋め込むことで、個々のファイルなどを指定したり内容を書き換えたりできます。

4.roles

  – 設定ファイルや動作の本体
  – ここに作成したり、打ちたいコマンドを書いてあります
  – playbook の roles記載しないと読まれないので注意
  ※こちらは task など複数あるので割愛

となります。

役割としては、

・Ansible-playbook にどの role を実行するのか記載し、
・hosts で playbook の何を実行するのか?のルートが記載してあり、
・vars で差分を書き、
・roles でファイルや設定値、実行内容の雛形を描きます。

そのため、特に手を加えるのは roles と vars なので、以降は私が単純に引っかかったことについて述べて終わりたいと思います。

単純なファイル配置ができない

Ansible は OS に対して共通の設定反映を実行したいので、同じファイル(シェルなど)をおきたいケースがあると思います。

しかし、そのまま置いてもエラーが発生します。

その時に使用するのが {% raw %}{% endraw %} なのですが、コマンドで行頭や行末に追加する

cat 置きたいファイル | sed -i '1i{%- raw- %}' -i '$a{%- endraw- %}' > 置きたいファイル

のようなコマンドを実行すると

{%- raw- %}

#!/bin/bash

{%- endraw-%}

(空行)

#!/bin/bash

(空行)

となります。

そのため、少々不恰好ですが

{%- raw- %}#!/bin/bash{%- endraw-%}

のように記載しないといけません。(1 敗)

超簡単なことなので、こういう単純なことが意外と調べても出てきませんでした…

変数への仕込み方

ここまできてさあ変数を仕込もうと思ったのに、

roles記載の変数(folder.group,folder.permission)などに文字列を仕込みたいと思ったのに、

folder:
  name: "grasys"
  permission: 777

とすればいいと思ったのに上手く反映されない…

結構単純なんですが、これは Ansible の読み込み方の問題なんですね…

上記でいうと

linux_gcp.yml に書いたせいで、ligcp.yml の内容を上書きしてしまったということです。

プログラムは、基本上から順番に読むので、

base < linux_gcp < ligcp

と順位をつけて最後に読む内容で上書きしてしまいます。

また、同じ変数があった場合、より下に記載した変数で上書きしてしまうのでこちらも注意が必要です。

folder:
  name: "grasys1"
  permission: 777

folder:
  name: "grasys2"
  permission: 777

上記の場合だと、folder 変数は grasys2 しか作成しません。
ちなみに複数入れたい場合は、roles に loop_var: folder ってすると良いです。

folder:
  - name: "grasys1"
    permission: 777
  - name: "grasys2"
    permission: 777

おわり

今回は簡単にですが、Ansible について書いてみました。

基本的なことですが、意外とミスをしやすいかな?と思うことについて書いてみました。

あなたの参考になったら幸いです。ではノシ


採用情報
お問い合わせ