As rookie

ルーキーインフラエンジニアがインフラのこと以外も結構書いてしまうブログ

反省点を踏まえた結果(非技術)

こんにちは

Mo-ikutsuneruto Calender 1日目の記事です。

すら書くことのできないクズ野郎ということが判明しました

mokicks.hatenablog.com

見てる人は少ないだろうが、それでも謝罪します。

すいませんでした。

書かなかったことにびびって自分のブログのURLにすらアクセスできませんでした。

これからは開き直って、ちょうど良い頻度でブログを更新します。

manのセクションとmanファイル(11日坊主)

  • この記事はsolo_advent_calender 2016年12月11日のものです。

こんにちは ショート advent calender11日目です。

manで気になったことがあったので調べた結果です。

普段コマンドのことで分からなかったことがあったらman 使ったら良いっていう認識でサーバー触ってます。

ではそのmanのファイルはどこにいるのでしょう

どうやら$MANPATH にmanファイルが置かれているディレクトリがありそう。

echo $MANPATH

謎の空白が帰ってきた。これはちょっとわからない。 一度置いといて

manの設定は/etc/man.config 書いてあります。 そこに

MANPATH /usr/share/man

という記述が!とりあえず移動

cd /usrshare/man

このディレクトリの中にenkoja がありました。

私の環境では日本語でmanが表示されているので

cd ja
ls
man1  man2  man3  man4  man5  man6  man7  man8  man9

さらにディレクトリが9個もある。。。

どれをみれば設定ファイルがあるんだ?何の数字?

結論からいうとこの数字はセクションの数字です。

セクションとは、ドキュメントの内容の分類だそうです。

セクションの数字の対応表

Linuxコマンド集 - 【 man 】 オンライン・マニュアルを参照する:ITpro

このページで記されてますので参考にします。

そしてmanコマンドで

コマンドのセクションは何番と何番があるのかというのは

man -f <コマンド>

で確認することができます。たとえば

$ man -f passwd

passwd               (1)  - update user's authentication tokens
passwd               (5)  - password file

というふうに表示されます。

そして

$ cd man5

$ ls | grep passwd
passwd.5.gz

やはりmanの5番目のディレクトリにpasswd関係のファイルがありました。

ですが、gzip形式で圧縮されているようです。

これを展開して中身を見たい気持ちはありますが、今日はここまで。

PS. manの6番目のセクションはゲーム らしいのですが、man6 に格納されている.gzファイル名でmanを実行するとゲームの説明がみれることに気づきました。 ここも深くみていきたいものです。

Linuxのバッククォート(10日坊主)

  • この記事はsolo_advent_calender 2016年12月10日のものです。

こんにちは ショート advent calender10日目です。

本来は土曜日にあげるはずだったやつです。

mokicks.hatenablog.com

これの続きで、 シングルクォート、ダブルクォートときたらバッククォートですよね

コマンドをバッククォート`` で囲むとコマンドの実行結果が展開される。コマンドの標準出力を変数に代入したりできます

$ today=`date`

$ echo date #バッククォートで囲まないとただの文字列だと認識する
date

$ echo $today
2016年 12月 10日 土曜日 23:42:15 JST

$ hoge=neko

$ echo '$hoge' is "$hoge"
$hoge is neko

$ pure=`echo '$hoge' is "$hoge"` # 変数pureに` $hoge is neko` を代入

$ $pure
-bash: $hoge: コマンドが見つかりません #$pureには`$hoge is neko` が入っているので$hogeがコマンドとして入力される

$ echo $pure
hoge is neko
$ $pure

の部分で$hogeコマンドを実行しようとして、失敗しているが、

$ $hoge

を実行すると -bash: neko: コマンドが見つかりません

となります。普通に$hogeを呼び出すと変数hogeに入っているnekoが実行されるのに、なぜ$hoge コマンドを実行しようとしたのか。

echo でシングルクォートで囲って出力したものは、見かけ上では分からないが文字列ということになってそう

$ '$hoge'
-bash: $hoge: コマンドが見つかりません

という結果になる。変数の$hoge は知っているが、文字列の$hogeは知らないという感じですね。

実際にデータがどのように認識されているのかを調べる方法を調べよう

Linuxのシングルクォートとダブルクォート(?日坊主)

  • この記事はsolo_advent_calender 2016年12月9日のものです。

こんにちは ショート advent calender9日目です。

金曜日に書き忘れ、土曜日にまとめて書こうと思っていると、土曜日も気づいたら終わっている。そんなことありますよね。

はい。

シングルクォート'' の場合は単純に文字列として出力する。 ダブルクォートは"" の場合は変数展開してくれる。です

$ hoge=neko # 変数hogeに文字列nekoを入れる

$ echo hoge 
hoge

$ echo $hoge # 変数を表示するには先頭に$をつける
neko

$ echo '$hoge' # $hogeを文字列として表示
$hoge

$ echo "$hoge" #変数を展開して表示
neko

$ echo "I love $hoge" # 文字列に変数を埋め込む
I love neko

$ echo '$hoge' is "$hoge" # 
$hoge is neko

色んなshell(8日坊主)

  • この記事はsolo_advent_calender 2016年12月8日のものです。

こんにちは ショート advent calender8日目です。

shellには様々な種類があるそうです。

僕は普段bashを使っています。bashは多くのlinuxディストリビューションで標準のshellとなっているようです。

普段bashを使っていますといいましたが、bashbashとして意識したことがありませんでした。ITに触れ出した時からbashでした。エンジニアとして生まれた時からbashだったんです。

東京で生まれた赤子が東京で過ごしていて、東京で過ごしている認識がないようなものです。ちょっと前に神奈川や千葉を知ったのです。そして今神奈川と千葉の事を調べようとしているのです。

大阪で生まれた赤子が大・・・

ということで、色々なshellについてしらべました。

まず列挙すると

色々なshell

*shell名 *コマンド
Bourneシェル sh
Bourne Again shell bash
Cシェル csh
tcsh tcsh
Kornシェル ksh
Zシェル zsh

それぞれの特徴(ソフトタッチ)

  • sh

初代シェルはBourneシェル ことshUNIXの標準的なシェルです。

shの改良版。Linuxディストリビューションの標準的なシェル

C言語に似たスクリプトが利用できるシェル

cshの改良版。特にユーザーインターフェイスの部分を中心に拡張されたシェル

コマンド行をWYSIWYG風の方法で編集することができる。などshの完全上位互換

kshbashtcshの機能を取り入れたもの

と簡単にまとめるとこんな感じ(Wiki Pediaより抜粋)

見る感じkshbashtcshの機能を取りれたzshってのが一番すごそう!

bashからzshに移行する日は来るのだろうか。メリットを理解して良さそうならzshを普段使いしていこうとおもいます!

bashが難波でtcshが鶴橋でksh天王寺

遊べる、飲める、買い物できるで

zshが梅田みたいな感じっぽいですね。路線図的にもJRでもいける、御堂筋線でもいける。

僕はこれから梅田に活動拠点を変えようとしている若者の気持ちです。

ansibleで多重ループ subelements編 (7日坊主)

  • この記事はsolo_advent_calender 2016年12月7日のものです。

こんにちは ショート advent calender7日目です。

今回は6日目で軽くふれていたansibleのloop構文with_subelements を使っていきます。

mokicks.hatenablog.com

公式サイト Loops — Ansible Documentation

まずはvarsファイルを用意します。

# group_vars/all
yum_list
  - state: present
    package:
      - vim
      - unzip
  - state: latest
    package:
      - nginx
      - bind-utils

以前の記事とは違い一つのディクショナリを用意するだけで大丈夫そうです。 JSONだと

{ yum_list: [ { state: present, package: [ vim, unzip ] }, { state: latest, package: [ nginx, bind-utils ] } }

こういう感じです。

yumモジュールで vimunzip はstateをpresentで実行しnginxbind-utils はstateをlatestで実行するようになる予定です。

それに対応したtaskがこちら

# tasks/main.yml
---
- name: install by yum
  yum: name={{ item.1 }} state={{ item.0.state }}
  with_subelements:
    - "{{ yum_list }}"
    - package

with_subelements は与えられたリストを順に展開し,ネストされたリストのキーを判定しその値を使います。

展開して取り出した値を扱いたい場合は {{ item.0 }} {{ item.1 }} のように与えた順に指定します。

流れを書くと

まず

  - state: present
    package:
      - vim
      - unzip

で一回目のloopでこの値を渡します。

次に、 {{ item.1 }}でpackageの中身であるvimunzip を順に取り出します。

{{ item.0.state }} でstateのpresentが取り出されれます。

上記のpackageのループが終わると

  - state: latest
    package:
      - nginx
      - bind-utils

の値を渡します。

実行結果は以下のようになりました

TASK [loop_test : install by yum] **********************************************
ok: [vagrant] => (item=({u'state': u'present'}, u'vim'))
ok: [vagrant] => (item=({u'state': u'present'}, u'unzip'))
ok: [vagrant] => (item=({u'state': u'latest'}, u'nginx'))
ok: [vagrant] => (item=({u'state': u'latest'}, u'bind-utils'))

ネストされているものでループしたいときはこのようにwith_subelements を使うのが良いでしょう

以上

ansibleで多重ループ(6日坊主)

  • この記事はsolo_advent_calender 2016年12月6日のものです。

こんにちは ショート advent calender6日目です。

ansibleで多重ループについて書きます!

ansibleでのループの構文はwith_items を使います。それはご存知ですか?

# task
- name: install by yum
  yum: name={{ item }} 
  with_items:
    - vim
    - unzip

というふうにwith_itemsでリストを与えてその中身(item)でタスクを実行することができます。

この場合だとvimunzipyumでinstallするということですね。

また、あらかじめgroup_varsなどにリストを用意しておいて

# group_vars/all
yum_list:
  - vim
  - unzip
# task
- name: install by yum
  yum: name={{ item }} 
  with_items: "{{ yum_list }}"

というふうにすれば、上のものと同じことができます.

多重ループをするにはどうすれば良いでしょう?

どうやらloop-controlとういものがあるようです。 Loops — Ansible Documentation

通常with_itemsでリストから値を取り出したときリストの中身はitem という変数に格納されて扱われます。

ですがこのloop-controlというものを使うとitem の名前を変えることができるのです。

サンプルでは

- include: inner.yml
  with_items:
    - 1
    - 2
    - 3
  loop_control:
    loop_var: outer_item

# inner.yml
- debug: msg="outer item={{ outer_item }} inner item={{ item }}"
  with_items:
    - a
    - b
    - c

というふうになっています。inner.ymlをインクルードするのをwith_items でループさして、その中身はouter_item という変数に入るというtaskになっています。公式の説明では

2.0では、with_loopsとtask includesを使用することができます(ただし、プレイブックは含まれません)。 これにより、一連のタスクをワンショットでループする機能が追加されます。 不可能なデフォルトでは、各ループのループ変数項目が設定され、これらのネストループは「外側」ループのitemの値を上書きします。 2.1の時点で、loop_controlオプションを使用して、ループに使用する変数の名前を指定できます。(google翻訳のコピペ)

includeするのはtaskのincludeだけのようです。

  loop_control:
    loop_var: outer_item #outer_itemというループ用の変数を定義

で変数名を定義します。

上のyumの例でいくと(yumのときこんなことするはずないが)

# group_vars/all
yum_list:
  - vim
  - unzip
  - nginx
  - mysql

yum_state:
  - present
  - latest
# main.yml
- name: install by yum
  include: inner.yml
  with_items: "{{ yum_state }}"
  loop_control:
    loop_var: outer_item
# inner.yml
- name: install by yum
  yum: name={{ item }} state={{ outer_item }}
  with_items: "{{ yum_list }}"
  

stateがpresetとlatestで両方インストールするという わけのわからないtaskになってしまったが複数のループを使用するときはこういうふうな書き方になりそうです。

また

yum_list
  - statet: present
    package:
      - vim
      - unzip
  - statet: latest
    package:
      - vim
      - unzip

というvarsをつくったならwith_subelementsというloopを使えば子要素でloopできるそう。この記事は明日書く予定です