Twigのforまとめ

Twigでループ処理を書きたいときに使う for は結構いろんな書き方ができるのでまとめとく。
とは言っても、ドキュメント見れば全部載ってるけども。

連続した値を扱いたいとき

https://twig.symfony.com/doc/2.x/tags/for.html#for

.. 演算子を使うと便利。

{% for i in 0..10 %}
    {{ i }},
{% endfor %}
{# 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, #}

{% for i in 'a'..'z' %}
    {{ i }},
{% endfor %}
{# a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, #}

{% for i in 'a'|upper..'z'|upper %}
    {{ i }},
{% endfor %}
{# A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, #}

ループ内で使える変数

https://twig.symfony.com/doc/2.x/tags/for.html#the-loop-variable

{% for i in '0'..'10' %}
    {{ loop.index }}
{% endfor %}
{# 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, #}

{% for i in '0'..'10' %}
    {{ loop.index0 }}
{% endfor %}
{# 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, #}

{% for i in '0'..'10' %}
    {{ loop.revindex }}
{% endfor %}
{# 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, #}

{% for i in '0'..'10' %}
    {{ loop.revindex0 }}
{% endfor %}
{# 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, #}
    
{# 最初の要素のときだけtrue #}
{% for i in '0'..'10' %}
    {{ loop.first }},
{% endfor %}
{# 1, , , , , , , , , , , #}

{# 最後の要素のときだけtrue #}
{% for i in '0'..'10' %}
    {{ loop.last }},
{% endfor %}
{# , , , , , , , , , , 1, #}

{# 配列の長さを返す #}
{% for i in '0'..'10' %}
    {{ loop.length }},
{% endfor %}
{# 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, #}

loop.parent はちょっとわかりづらい。
ループがネストしている場合に外側のループにアクセスできる。

{% for i in 0..3 %}
    {% for j in 'a'..'c' %}
        [{{ loop.parent.loop.index }}, {{ loop.index }}]<br>
    {% endfor %}
{% endfor %}
{#
[1, 1]
[1, 2]
[1, 3]
[2, 1]
[2, 2]
[2, 3]
[3, 1]
[3, 2]
[3, 3]
[4, 1]
[4, 2]
[4, 3]
#}

条件を指定してループをまわす

https://twig.symfony.com/doc/2.x/tags/for.html#adding-a-condition

if を使うことで条件を指定できる。

{% for i in 0..10 if i % 2 == 0 %}
    {{ i }},
{% endfor %}
{# 0, 2, 4, 6, 8, 10, #}

そのほかのおべんりなやつ

else を使うと空配列だったときの処理が書ける。

{% for i in [] %}
    {{ i }}
{% else %}
    empty!
{% endfor %}
{# empty! #}

キーを取得したいとき。
キーだけの取得もできるけど大抵は値とセットで欲しい。

{% for key in ['taro', 'ichiro', 'hanako']|keys %}
    {{ key }}
{% endfor %}
{# 0 1 2 #}

{% for key, value in ['taro', 'ichiro', 'hanako'] %}
    {{ key }}:{{ value }}
{% endfor %}
{# 0:taro 1:ichiro 2:hanako #}

slice とかと組み合わせたり。

{% for key, value in ['太郎', '次郎', '三郎', '四郎', '五郎']|slice(2, 4) %}
    {{ key }}:{{ value }}
{% endfor %}
{# 0:三郎 1:四郎 2:五郎 #}

ざっとまとめたけど色々できるな。。

ディスク使用量を確認するコマンド

ディスク容量のアラートが出たときに。

まず最初にやってみよう的な df -h

# df -h

さらにディレクトリ別に使用量を確認したいときは du

# du -h -s /* | sort -nr
# du -s /var/* | sort -nr

sort を使って使用量の降順で並べ替えてやるとわかりやすい。

そして指定したサイズよりも大きいファイルを見つけるときに find を使う。

# find /var/log -size +1024k -ls | sort -nr

Chef ClientだけでNginxをインストールして起動するまでの最小限の流れ

Chef DKのインストールはしない。
当然 chef generateknife cookbook create も使わない。

Chef ClientだけでNginxをインストールして起動までやる。

Chef Downloads

今回はAmazon Linux 2のEC2インスタンスを用意した。

まずはChef Clientのインストール。

$ sudo yum update -y
$ wget https://packages.chef.io/files/stable/chef/13.7.16/el/7/chef-13.7.16-1.el7.x86_64.rpm
$ sudo rpm -ivh chef-13.7.16-1.el7.x86_64.rpm
$ chef-client --version
$ rm chef-13.7.16-1.el7.x86_64.rpm

Chef Clientのインストールが終わったらRecipeを手動で作っていく。

先にディレクトリを準備。

$ mkdir chef-example-repository
$ cd chef-example-repository
$ mkdir -p cookbooks/nginx/recipes
$ mkdir roles

Roleの作成。

$ vim roles/web.json

こんな感じで記述。

{
  "run_list": [
    "recipe[nginx]"
  ]
}

Recipeの作成。

$ vim cookbooks/nginx/recipes/default.rb

Amazon Linux 2は最初の状態だとNginxがyumでインストールできない。

dev.classmethod.jp

なので、ここでは bash リソースを使って code に直接コマンドを書く。

bash 'install nginx' do
  code 'sudo amazon-linux-extras install nginx1.12'
  not_if { File.exists?("/usr/sbin/nginx") }
end

bash 'start nginx' do
  code <<-EOC
    sudo systemctl start nginx.service
    sudo systemctl enable nginx.service
  EOC
end

作成できたら --why-run で実行内容を確認して、問題なければ実行。

$ chef-client -z -j roles/web.json --why-run
$ chef-client -z -j roles/web.json

Nginxの起動を確認できればOK。

$ systemctl status nginx.service
$ systemctl is-enabled nginx.service