MY Scribbling...

AWS Community Hero Masanori YAMAGUCHI の 雑なメモ

ファイル/シンボリックリンクのフルパスを表示する

ファイルのフルパスを取得する

readlink -f <フルパスを取得したいファイル名>

例:

$ pwd
/home/ec2-user
$ ls
amazon-ssm-agent.rpm  tmp
$ readlink -f amazon-ssm-agent.rpm
/home/ec2-user/amazon-ssm-agent.rpm
$ ln amazon-ssm-agent.rpm amazon-ssm-agent.rpm.lnk
$ ls -li
total 11492
 436736 -rw-rw-r-- 2 ec2-user ec2-user 5881471 Mar 29 03:33 amazon-ssm-agent.rpm
 436736 -rw-rw-r-- 2 ec2-user ec2-user 5881471 Mar 29 03:33 amazon-ssm-agent.rpm.lnk
1966084 drwxrwxr-x 2 ec2-user ec2-user    4096 Apr 28 09:59 tmp
$ readlink -f amazon-ssm-agent.rpm.lnk
/home/ec2-user/amazon-ssm-agent.rpm.lnk

注意点: ファイルが存在しない場合に実行すると、存在しないファイルのフルパスを返してしまうので注意が必要です

$ ls
amazon-ssm-agent.rpm  amazon-ssm-agent.rpm.lnk  tmp
$ readlink -f amazon-ssm-agent.rpm.test
/home/ec2-user/amazon-ssm-agent.rpm.test
$ ls
amazon-ssm-agent.rpm  amazon-ssm-agent.rpm.lnk  tmp

シンボリックリンクリンク元を取得する

フルパス取得の場合と同じです。

readlink -f <フルパスを取得したいファイル名>

例:

$ ln -s amazon-ssm-agent.rpm /home/ec2-user/amazon-ssm-agent.rpm.slink
$ ls
amazon-ssm-agent.rpm  amazon-ssm-agent.rpm.slink  tmp
$ readlink -f amazon-ssm-agent.rpm.slink
/home/ec2-user/amazon-ssm-agent.rpm

補足

所属会社のブログで投稿した内容です ファイル/シンボリックリンクのフルパスを表示する - ForgeVision Engineer Blog

OpenStack で Snapshot(image) の状態をMackerelで監視するスクリプト

久しぶりにRuby書いた。力技感がすごい。
そしてMackerelは本当に便利。使うほどに好きになる。

#!/usr/bin/env ruby
# -*- coding: utf-8 -*-
​
require 'httpclient'
require 'json'
​
class Nova
  def keystone
    auth_request_json = '{
      "auth" : { "tenantName" : "テナント名",
      "passwordCredentials" : { "username" : "ユーザ名", "password" : "いつもの" }
      }
    }'
​
    keystone_client = HTTPClient.new
    keystone_endpoint_uri = 'http://OpenStackのURL:35357/v2.0/tokens'
    keystone_response = keystone_client.post_content(keystone_endpoint_uri, auth_request_json, 'Content-Type' => 'application/json' )
    keystone_response_hashed = JSON.parse(keystone_response)
​
    keystone_response_endpoint_parsed = keystone_response_hashed['access']['serviceCatalog'][0]['endpoints'][0]
    @nova_endpoint_uri = keystone_response_endpoint_parsed.values[0]
​
    @keystone_auth_token = keystone_response_hashed['access']['token']['id']
  end
​
  def nova_images
    keystone
​
    nova_images_client = HTTPClient.new(default_header: {"X-Auth-Token" => @keystone_auth_token })
​
    nova_images_endpoint_uri = @nova_endpoint_uri + "/images/detail"
    nova_images_response = nova_images_client.get_content(nova_images_endpoint_uri, "q" => "status" )
    nova_images_response_hasged = JSON.parse(nova_images_response)
​
    return  nova_images_response_hasged
  end
end
​
i = 0
image_init = Nova.new
image_parsed = image_init.nova_images["images"]
image_status = "none"
​
while image_parsed.size > i do
  if image_parsed[i]["status"] != "ACTIVE"
    image_status = image_parsed[i]["name"] + " is " + image_parsed[i]["status"]
    p image_status
  end
  i += 1
end
​
p "snapshots are all active." if image_status == "none"
​
exit (image_status != "none" ? 2 : image_status == "none" ? 0 : 1)

あとは、mackerel-agent.confでカスタムスクリプトを追加してスクリプトを実行すればOK。
snapshot(image)がACTIVE以外のものがあった場合、リスト化してMackerelに表示される。
notification_interval=30、max_check_attempts=3あたりがおすすめ。

ansibleでvars_promptを使う場合

その後、更新。

ansibleではじめてvars_promptを使ったけどクソはまったのでメモ。

vars_promptは playbookトップディレクトリの xxx.yml 書く この時、注意しないといけないのは、vars_promptはroles配下で更に1行上にhostsを定義してあげる必要がある。 公式のドキュメントを読む限りだとそのような規約はないっぽいのだけれど・・・。

一応、色々試行した結果、下記のやり方だと通ったので、とりあえずこれでいく。

task/xxx.ymlの書き方が悪かっただけだった・・・。 テストでtags=testとしていたのが原因だったようだ。

---
---
- hosts: webservers
  roles:
    - common
    - web
    - app

#- hosts: webservers
  vars_prompt:
    - name: "stdin_print"
      prompt: "Please enter your password"
      private: yes
      default: "none"
#  roles:
#    - app

アップデートがあれば追記する。