ときどきAnsible日記

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

2019年のブログのネタ

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

あっという間に2018年も終わりですね。気が付けば大みそかにブログ書いてます。 最初はあったかいといわれていたのに、ここへきて寒波が訪れているとか。皆様風邪などひかれぬようにお気を付けください。

というわけで2018年最後のブログは2019年のブログで何を書くかをちょっと挙げていきたいかなと(何を書こうとしているか...のほうが正しいか、実際には自分に向けたメモです) まあ大みそかですし手短に(笑

  • Ansible Tower/AWX

まあ色々ありまして今年はAnsibleTowerとAWXを触る機会がありました。存在は知っていたのですがまあ色々と触ってわかったことがありますので、問題のないレベルでここに書いていきたいと思います。特にAnsibleとAnsibleTowerの関係は触ってみて初めて分かったところは多いですね...あと問題が無ければライセンスのことも書いていきたい...これはかなり大変だったので。あとはAWXですね。こちらも情報がほとんどない.....まあこれから触る人のわずかながらのご助力になればというところです。

  • Puppet Bolt

2018年の10月の突如現れたPuppetファミリーからの刺客。その内容はエージェントレスとかPythonベースとかかなりAnsibleと近いよう見えます。いや...Pythonベースなのかな...その辺もよくわからないぐらい情報がないので、ちょっと色々調べてここに書きたいと思います。PuppetだったらRubyだよな...

  • その他エージェントレスの自動化ツール

Itamaeとか何となくエージェントレスで自動化出来るものもちょっと確認しておきたいと思います。あと最近教えていただきましたOpenPIE。こちらも調べて書いていきたいですね。おそらく2019年はAnsibleに追従する次のツールが出てくると思いますのでそれらを拾っていければよいかと思います。

ベータ版が出てきたrhel8。やっとこさ7になれてきたというところなのに、もう8っすか...この職業の定めですね..このあたりのことも試してみてここに書きたいですね。

というわけで2018年のブログはこちらで終了です。1か月1回更新にも関わらず見ていただいた皆様誠にありがとうございます。2019年も細々とやってまいりますのでもしよろしければ引き続きよろしくお願いいたします。それではよいお年をお迎えください。お疲れ様でした。

Ansibleハンズオンやってみました

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

本日の勉強会は非常に盛り上がりました。参加者の皆様ありがとうございました。※詳細は下記をご参照くださいhttp://pj-doaa.hatenablog.com/entry/2018/10/31/203643

全くAnsibleどころかLinuxも触ってない方も参加頂いて、有難い限り。良い経験になればいいですが。 と、書いている今時点では実はまだ何も終わってません.....(勉強会直後にこの記事をアップするため事前に書いてます)

というわけで早速課題の回答をアップしていきたいと思います。 まずは最初の課題。

$ cat kadai1.yml
- hosts: localhost
  become: yes

  vars:
    user_name: ito1

  tasks:
    - name: ユーザ作成
      user:
        name: "{{ user_name }}"

うんまあ、これは非常に簡単ですね。とりあえずuserモジュールの使い方を知っていればすぐに答えられる問題です。個別のユーザ権限では動作できないのでbecomeが必須というところぐらいかと思います。あとは変数の表現の仕方ですね。これは仕様とはいいがたい気もしますが、なぜか変数が先頭に来るとダブルコーテーションが必要なんですよね....今回は徐々に足されていく感じにしていますので次の課題に行ってみましょう。2番目の課題の回答はこちらです。

$ cat kadai2.yml
- hosts: localhost
  become: yes

  vars:
    user_name: ito1

  tasks:
    - name: ユーザ作成
      user:
        name: "{{ user_name }}"
        password: "{{ user_name | password_hash('sha512') }}"

こちらは先ほど追加したユーザにパスワードを追加する部分です。こちらはやや難しくパスワードをハッシュ化しないと使えないというところがポイントかと思います。動作確認をしてみると実はログインできないという罠にはまってくれる人がいるとウヒヒとなるところですね。さりげなく本ブログを読んでいると簡単に解決できる作りにしています(AnsibleのModule:user - ときどきAnsible日記)新人ズはここまで来れれば合格かなぁ。続きまして三問目。

$ cat kadai3.yml
- hosts: localhost
  become: yes

  vars:
    user_name: ito1

  tasks:
    - name: ユーザ作成
      user:
        name: "{{ user_name }}"
        password: "{{ user_name | password_hash('sha512') }}"
      register: ret

    - name: 実行結果判断
      lineinfile:
        path: /home/ito/work/user_list
        line: "{{ user_name }}"
        create: yes
        state: present
      when: ret.changed == true

やっとこさPlaybookらしくなってきました。先ほどの実行結果を取得して変更されていればそのユーザをリストに出力する。というものです。ここではregisterとwhenの使い方を学んでいただきます。whenについてはしっかり説明(ここにも書いてますwhenで処理を分岐させる - ときどきAnsible日記)しましたが、registerについてはさらっと説明した(はず)なのでこの辺を覚えているかがポイントになります。あとはlineinfileですね。こちらも本ブログ(AnsibleのModule:lineinfile - ときどきAnsible日記)を読んでいたら簡単!(なはず)続いて4問目の答えはこちら。

$ cat kadai4.yml
- hosts: localhost
  become: yes

  vars:
    user_name: ito1

  tasks:
    - name: ユーザ作成
      user:
        name: "{{ user_name }}"
        password: "{{ user_name | password_hash('sha512') }}"
      register: ret

    - name: 実行結果判断
      lineinfile:
        path: /home/ito/work/user_list
        line: "{{ user_name }}"
        create: yes
        state: present
      when: ret.changed == true

    - name: ユーザリストチェック
      shell: grep "{{ user_name }}" /home/ito/work/user_list
      register: user_check
      failed_when: user_check.rc not in [0, 1]

    - name: ユーザ削除
      user:
        name: "{{ user_name }}"
        state: absent
      when: user_check.rc == 0

この問題はshellについての使い方ですが、他にもいろんなやり方があるので自分で考えた方法で処理してほしい感じです。あとはshellにした場合にはfailed_whenも使ってほしいですねぇ。。この辺まで来れる人が何人いるやら....インフラ経験者はここまでは来てほしいなぁ...最後に5問めの答えはこちら。

$ cat kadai5.yml
- hosts: localhost
  become: yes

  vars:
    loop_user: ito

  tasks:
    - name: 繰り返し実行
      include: kadai5-1.yml user_name={{ loop_user }}{{ item }}
      with_sequence: "start=1 end=10"
$ cat kadai5-1.yml
    - name: ユーザ作成
      user:
        name: "{{ user_name }}"
        password: "{{ user_name | password_hash('sha512') }}"
      register: ret

    - name: 実行結果判断
      lineinfile:
        path: /home/ito/work/user_list
        line: "{{ user_name }}"
        create: yes
        state: present
      when: ret.changed == true

    - name: ユーザリストチェック
      shell: grep "{{ user_name }}" /home/ito/work/user_list
      register: user_check
      failed_when: user_check.rc not in [0, 1]

    - name: ユーザ削除
      user:
        name: "{{ user_name }}"
        state: absent
      when: user_check.rc == 0

時間としては45分ぐらいしかないので全くの初心者からここまで来れたら優秀!最後の問題はincludeとwith_sequenceのあたりがポイントです。includeは外出ししたplaybookを読み込むことが出来て変数も渡せます。with_sequenceはwith_itemsのお仲間みたいなもんですが、連番を繰り返せるのでfor文のような使い方ができます。あとはwith_itemsがひとつの処理にしか使えないというのがこの問題の意地の悪いところです。そのためにわざわざincludeする必要があるという....

その後もしものためにエクストラの問題も用意しましたが、こちらについては私も作ってないので回答はありません!参加者で作れた人がいたらもらってここに貼りますw お疲れ様でした!