月: 2018年7月

  • AnsibleError: template error while templating string

    AnsibleError: template error while templating string

    はじめに

    AnsibleのTemplateモジュールはファイルの中身に変数を入れたいときなどにとても便利。
    なお、Templateモジュールの使い方については、あだちんさんのブログが非常にわかりやすい。

    Ansible’s Template module is very useful when you want to put variables in the contents of a file.
    About how to use Template module, His blog is very easy to understand.

    https://blog.adachin.me/archives/5526  

    問題 problem

    AnsibleでTemplateの転送に失敗する

    Template transfer fails with Ansible

    TASK [setup-hosts/development/web : Add Template user-setting files] ********
    failed: [dev-web] (item={u'owner': u'cron', u'path': u'home/cron/script/backupcp.sh', u'group': u'cron', u'mode': u'755'}) => {"changed": false, "item": {"group": "cron", "mode": "755", "owner": "cron", "path": "home/cron/script/backupcp.sh"}, "msg": "AnsibleError: template error while templating string: Missing end of comment tag. String: ` '<<<<<'\n"}
    

    特定の文字列がファイル内に存在しているとAnsibleに失敗するようだ

    Ansible seems to fail if a specific string exists in the file

    対処 deal

    処理の最初、最後をそれぞれ、“` {% raw %} “` 、“` {% endraw %} “` で挟む。以下のようなイメージ

    Insert “` {% raw%}  “` and “` {% endraw%} “` at the beginning and end of processing. The following image

    {% raw %}
    #!/bin/sh
    
    echo "done"
    {% endraw %}
    

     

  • Docker: E: Unable to locate package

    Docker: E: Unable to locate package

    はじめに

    サクッと環境を構築するのに、最初にapt-get updateを省略してしまったがために、ハマってしまった。今後同じ過ちを繰り返さない為にまとめ。

    実施したDockerfile

    実にシンプル。

    ubuntuを持ってきて、wgetとnodejsとnpmでも入れて動かそうと思った。いろんなサンプルファイルではしっかりとapt-get updateの記載があったが、あえて外した。そして結果的に時間を要した。

    実施したDockerfileはこちら

    #利用するUbuntuのイメージ
    FROM ubuntu:16.04
    
    # wgetをインストール
    RUN apt-get install -y wget 
    RUN apt-get install -y nodejs 
    RUN apt-get install -y npm

    docker buildコマンド

    $ docker build -t ubuntuuuu .
    Sending build context to Docker daemon   4.57GB
    Step 1/4 : FROM ubuntu:16.04
     ---> 7aa3602ab41e
    Step 2/4 : RUN apt-get install -y wget
     ---> Running in 30312e88bc87
    Reading package lists...
    Building dependency tree...
    Reading state information...
    E: Unable to locate package wget
    The command '/bin/sh -c apt-get install -y wget' returned a non-zero code: 100
    $ 

    E: Unable to locate package

    まずネットワーク周りを疑ったが、異常はなさそうだった。

    対処

    諸々installする処理の前にapt-get updateを入れたのみ。

    #利用するUbuntuのイメージ
    FROM ubuntu:16.04
    
    # wgetをインストール
    RUN apt-get update # 追加
    RUN apt-get install -y wget 
    RUN apt-get install -y nodejs 
    RUN apt-get install -y npm

    build結果

    $ docker build -t ubuntuuuu .
    Sending build context to Docker daemon   4.57GB
    Step 1/5 : FROM ubuntu:16.04
     ---> 7aa3602ab41e
    Step 2/5 : RUN apt-get update
     ---> Running in f929ef07a958
    Get:1 http://security.ubuntu.com/ubuntu xenial-security InRelease [107 kB]
    Get:2 http://archive.ubuntu.com/ubuntu xenial InRelease [247 kB]
    
    (略)
    
    Removing intermediate container fc51f9cd4a4f
     ---> 3e9f68c18e10
    Successfully built 3e9f68c18e10
    Successfully tagged ubuntuuuu:latest
    $ 

     

    無事Successfullyになった。

    なぜapt-get updateが無いと失敗するのか

    憶測に過ぎないが、おそらくコンテナ版ubuntuを使わせる上で、必ず最新版のパッケージでないと使わせないというubuntu側(?)の意向のように感じる

    所感

    昨年発売され賑わっているAirPods ProだがAmazonでも販売を開始するようになり、Amazonでは今はポイントもつくようになっているようだ。自分は仕事しながら音楽聞かないが、ノイズキャンセルは気になる。

  • vixie-cronはAmazon Linuxでは利用できない

    vixie-cronはAmazon Linuxでは利用できない

    はじめに

    vixie-cronは、crontabで環境変数を設定可 (PATH、SHELL、HOME等)。それに加え、
    crontabファイルの冒頭に

    MAILTO=""

    加えるだけで、全てのメール通知を止めることができる便利なツール

    Amazon linuxでは

    しかし、Amazon linuxではvixie-cronはcronieに置き換わっている。
    https://aws.amazon.com/jp/amazon-linux-ami/2011.02-release-notes/#Obsoleted_Packages:

    anacron and vixie-cron are obsoleted by cronie

    cronieはvixie-cron同様、Cron deamonとして動くようだ

    cronie-1.4.4-2.4.amzn1 – Cron daemon for executing programs at set times

    yum infoの情報は以下の通り

    $ yum info cronie
    読み込んだプラグイン:priorities, update-motd, upgrade-helper
    14 packages excluded due to repository priority protections
    インストール済みパッケージ
    名前 : cronie
    アーキテクチャー : x86_64
    バージョン : 1.4.4
    リリース : 15.8.amzn1
    容量 : 174 k
    リポジトリー : installed
    要約 : Cron daemon for executing programs at set times
    URL : https://fedorahosted.org/cronie
    ライセンス : MIT and BSD and ISC and GPLv2
    説明 : Cronie contains the standard UNIX daemon crond that runs specified programs at
    : scheduled times and related tools. It is a fork of the original vixie-cron and
    : has security and configuration enhancements like the ability to use pam and
    : SELinux.

    yum info にあるようにvixie-cronからforkされているようなので、基本的にはvixie-cronをcronieに置き換えるだけで済みそう。

  • gitで間違えたブランチに書き込んだ際の対処

    gitで間違えたブランチに書き込んだ際の対処

     

    gitで間違えたブランチに書き込んだ

    一度退避させた後、ブランチを切り替えて、退避した変更を引き継ぐというやり方。しょっちゅう使っているコマンドの一つ

    今回はmasterブランチに書き込んだとする

    変更点を退避する

    git stashコマンドを使うと、変更点のみ退避することが可能

    $ git stash
    Saved working directory and index state WIP on master: 1169a810 Merge branch 'route53_20180724_120035' into 'master'
    $ 

     

    この時点でgit statusを実行すると変更点がなくなる。
    書き込んだmasterブランチはクリアーになる

    $ git status
    On branch master
    Your branch is up-to-date with 'origin/master'.
    
    nothing to commit, working tree clean
    $

    新ブランチを作成

    本来作業したかったブランチを作成する
    今回はCloudWatchAlarmというブランチとする
    ここではcheckout -bオプションで作成と同時にgit branchを行う

    $ git checkout -b CloudWatchAlarm
    Switched to a new branch 'CloudWatchAlarm'
    $ 

    当然この時点ではgit statusを実施しても変更はない

    $ git status
    On branch CloudWatchAlarm
    nothing to commit, working tree clean
    $

    ブランチは存在している

    $ git branch
    * CloudWatchAlarm
      master
    $ 

    新ブランチに変更点を取り入れる

    git stash popコマンドで新ブランチに変更点を取り入れる

    $ git stash pop
    On branch CloudWatchAlarm
    Changes not staged for commit:
      (use "git add <file>..." to update what will be committed)
      (use "git checkout -- <file>..." to discard changes in working directory)
    
        modified:   CloudWatchAlarm.sh
    
    no changes added to commit (use "git add" and/or "git commit -a")
    Dropped refs/stash@{0} (d081148067aad39eb60500c5fbb2a32a4c6c2566)
    $ 
    

    まとめ

    # 一時退避
    git stash
    
    # チェックアウト 
    git checkout xxx
    
    # 直前のgit stashを取り出す
    git stash pop

     

  • パスワードやAPI keyをコンソールから入力を、より安全にする

    パスワードやAPI keyをコンソールから入力を、より安全にする

    パスワードやAPI keyを入力する度、神経を尖らせている

    今までは

    HISTCONTROL=ignorespace

    を定義し、

     export __pass=xxxxxxxx

    のように、頭にスペースを付けることで、hitoryコマンドでパスワードが表示されないよう工夫をしていた

    Qiitaを見ててreadコマンドをうまく使うやり方を知った。

    Linux 作業手順書からべた書きパスワードをなくすシンプルなアイディア
    https://qiita.com/ktooi/items/ba156bb1848c31f04949

    $ read -sp "Please input your password: " __pass; echo
    ※ パスワード は XXX を参照して入力してください。
    $ curl -u "user:${__pass}" http://example.com

    シンプル!

    前途した HISTCONTROL を使う方法はキーなどを環境変数に設定するのに使い、
    readはパスワードに使うのが綺麗な使い分けかも。

  • denied: requested access to the resource is denied

    denied: requested access to the resource is denied

    docker hubのようなレジストリサービスを使った際、

    # docker push [remote repository]:[tag] 
    The push refers to a repository [xxxxx ]
    0b42c4d54897: Preparing 
    9cc8bf7662b6: Preparing 
    0b9ee6a3e512: Preparing 
    129b697f70e9: Preparing 
    denied: requested access to the resource is denied
    

    というエラーが表示された。

    これは単純な問題で、リポジトリやタグの指定が誤った際に表示される

     

    # レジストリサービスにログインする
    docker login
    
    # commitする(コンテナからimage化)
    docker commit [image名] [remote repository]:[tag]
    例: docker commit container git.example.com/infra/admin:20180717
    
    # リモートリポジトリへpush
    docker push [remote repository]:[tag]
    例: docker push git.example.com/infra/admin:20180717
    

     

    よくある間違いがプロジェクト名の誤り。docker imagesコマンドで名前が合っているか確認し、修正することでエラーは解消される。

  • docker loginは鍵認証できなそう

    docker loginは鍵認証できなそう

    はじめに

    ログインするには大きく二つ

    • パスワード認証
    • 鍵認証

    が定番だと思うが、残念ながらdocker hubなどレジストリへ登録するのに鍵認証は使えなさそうだ

    公式ドキュメント

    https://docs.docker.com/engine/reference/commandline/login/

    Name, shorthand Description
    --password , -p Password
    --password-stdin Take the password from stdin
    --username , -u Username

    パスワードを聞かれないようにするためには

    公式ドキュメントにあるように、テキストファイルに書き、標準出力で読み込ませるしかなさそう。

    $ cat ~/my_password.txt | docker login --username foo --password-stdin

    平文でパスワードを書くのは抵抗あるが、パーミッションを絞って、うまく調整するしかなさそう。痒い所に手が届かないのが残念。

     
  • CloudWatchにログが送れずDISKが枯渇

    CloudWatchにログが送れずDISKが枯渇

    はじめに

    AWSで稼働しているAmazonLinuxのdiskサイズが枯渇した

    原因

    何かが肥大化しているのが通例なので、duコマンドで調べていったら

    /var/log/awslogs.log

    が数ギガ使っていたということにたどり着いた

    もちろんログローテートはしているが、数ギガ使っているというのは明らかに異常

    何がawslogs.logに書き込んでいるか。

    Linuxにある各種ログファイルを

    CloudWatchMonitoringScripts
    http://aws-cloudwatch.s3.amazonaws.com/downloads/CloudWatchMonitoringScripts-1.2.1.zip

    を用いてCloudWatchに送っているが、このスクリプトが送信した情報は

    /var/log/awslogs.log

    に書かれる。これが肥大化していた

    どのようなエラー内容か

    /var/log/awslogs.log

    tailで見ると、以下のようなログが出力されていた。

    ClientError: An error occurred (AccessDeniedException) when calling the PutLogEvents operation: User: arn:aws:iam::****:user/**** is not authorized to perform: logs:PutLogEvents on resource: arn:aws:logs:ap-northeast-1:****:log-group:/var/log/cron/cron:log-stream:ALL

    AccessDeniedException

    をみて、awsコマンドの設定周りが怪しいとあたりがついた

    awsconfigについて

    前途した通り、LinuxサーバはCloudWatchMonitoringScriptsを用いてログを送付しているが、

    設定ファイルは/etc/配下に格納している。

    それぞれ、awsコマンドを使う上での環境設定ファイルと、監視対象のログを記載したファイル

    [plugins]
    cwlogs = cwlogs
    
    [default]
    region = ap-northeast-1
    aws_access_key_id=***
    aws_secret_access_key=***

     

    [general]
    state_file = value
    logging_config_file = value
    use_gzip_http_content_encoding = false
    
    [/var/log/maillog/maillog]
    datetime_format = %b %d %H:%M:%S
    file = /var/log/maillog/maillog
    buffer_duration = 5000
    log_stream_name = ALL
    initial_position = start_of_file
    log_group_name = /var/log/maillog/maillog

     

    設定自体は問題なさそう。

    原因

    /etc/awslogsが最初に呼ばれるわけではない。

    起動ユーザーの.awsディレクトリ配下が先に呼ばれる。

    そのため、.awsディレクトリが存在していると、

    ログが送れないなどの事象が発生する。

    [default]

    中身は[default]しか書かれていなかったが、設定ファイルが存在していた。

    これが存在していたことにより、/etc/awslogsディレクトリが読み込まれず、Cloudwatchに送付できていなかったようだ。

    対処

    空の.awsディレクトリを削除し、awslogsを再起動

    正常にcloudWatchにログが送付され、DISKの肥大化も解消した

    参考情報

    本記事のみならず、AWSについて体系的に学ぶことができるのでおすすめ。

  • SQLで累積和を計算する

    SQLで累積和を計算する

    はじめに

    最近SQLをガリガリ書くことも少なくなってきたので、
    redashを使ってこんな情報を集計したいなーと思っても、どうやって書けばいいか頭を悩ませることがある。

    単純な合計の場合、sum関数を使えば簡単に表示できるが、累積和を表示しようとした際、工夫が必要だった。

    元データ

    MySQLが公開している、世界の都市や人口についてまとまっているサンプルデータを利用。

    https://qiita.com/S-T/items/923cf689ee5f44525457

    やりたいこと

    合算し累計を算出したい

    元データ

    SELECT NAME,
           Population
           
    FROM city
    WHERE countryCode = 'JPN'
      AND ID IN (1532,
                 1533,
                 1534);
    

    累積和を計算

    SET @cumulativeSum=0;
    
    SELECT NAME,
           Population, 
           @cumulativeSum:=@cumulativeSum+Population AS Population_Sum
           
    FROM city
    WHERE countryCode = 'JPN'
      AND ID IN (1532,
                 1533,
                 1534);

    追加したところは
    SET @cumulativeSum=0;と
    @cumulativeSum:=@cumulativeSum+計算したいカラム名をいれただけ。


    最初このやり方にたどり着くまでに
    SQLでcase文書いて、sumして。。という書き方をしたが、かなりシンプルにおさえることができた。

    注意事項

    残念ながら、ユーザ定義変数 はあくまでもSQLの実行・評価前に定義するための変数で、Select内で更新することを想定していない為、値の保証はしていないようだ

    https://dev.mysql.com/doc/refman/5.6/ja/user-variables.html

    SELECT などのほかのステートメントでは、予想した結果が得られることもありますが、これは保証されません。次のステートメントでは、MySQL が最初に @a を評価し、続いて 2 番目の割り当てを行います。

    複数のクエリを試してみたが、動かない場合もあった。

    SET @gokei=0;
    
    SELECT counseling_date AS date,
           sum(member_status_id = 0 AND ordinal_attendance = 1) AS free_counseling_1,
           @gokei:=@gokei+sum(member_status_id = 0 AND ordinal_attendance = 1) as gokei
           
    FROM counseling
    WHERE counseling_date BETWEEN '2018-06-01' AND '2018-06-30'
    group by date

    これは工夫が必要なので、case文を使うなど工夫するしかなさそうだ。

    解決策ご存知の方はご教示ください

     

  • 世界最高の子育てを読んだ

    世界最高の子育てを読んだ

    世界最高の子育て

    「世界最高の子育て」という子育ての本を読んだ。
    4歳の子供を持つ身として、どのように今後教育していくべきか、何かヒントになれば。という考えで読んだ。

    (さらに…)