InventoryFileに同名のホストを複数行書いてはいけない

Ansibleにおいて表題の通り。

■ 環境

  • Ansible 2.5.3
  • Vagrant 2.0.3
  • macOS High Sierra

■ きっかけ

開発やテスト用にVagrantを使用しているのだが、何度も作成したり削除したりを繰り返しているうちに、InventoryFileがごちゃ混ぜになってしまった。複数のVMを使用していることもあり、Ansibleのplaybookを試す際にグループを変えて試したり…と。

その中である時下記のようなエラーが。

$ ansible group1 -m ping
host01 | UNREACHABLE! => {
    "changed": false,
    "msg": "Failed to connect to the host via ssh: Warning: Permanently added '[127.0.0.1]:2222' (RSA) to the list of known hosts.\r\nvagrant@127.0.0.1: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).\r\n",
    "unreachable": true
}
$

接続ができない!?

InventoryFileを確認してみると該当行は特に問題はなさそう。`vagrant ssh host01`でもログインが可能である。

よくよくメッセージを読んでみると、今回起動したVMのPortが違う気がする。改めてInventoryFileを確認してみると別のグループに同名で記載されてしまっていた。

$ cat hosts
  :
[group1]
host01 ansible_ssh_host=127.0.0.1 ansible_ssh_port=2201
  :
[group3]
host01 ansible_ssh_host=127.0.0.1 ansible_ssh_port=2222
  :

どうやら下に記載されていた設定で上書きされていたようである。複数行あった記載を1行のみに編集したところ問題なく使用できた。

以上。

set -o noclobber

表題のビルトインコマンドについて。

■ 環境

  • bash
  • macOS High Sierra

■ set -o noclobber

リダイレクト(>)を使って標準出力をファイルに出力させることは多々あるのだが、誤ってファイルを上書きしてしまうケアレスミスが発生することがたまにある。だいたいは履歴のコマンドを再実行する際にやってしまう。

これを防ぐために表題を”.bashrc“に記載することにした。

set -o noclobber

もしくは下記でもOKなようである。

set -C

こうすることで、リダイレクト先のファイルが既に存在する場合には下記のようにエラーとなる。

$ ls
test
$
$ echo "test" > test
-bash: test: cannot overwrite existing file
$

>>“の追記でのリダイレクトの場合には問題なく書き込める。

ちなみに`man`には下記のような記載になっている。

Redirecting Output
  :
       If  the  redirection  operator is >, and the noclobber option to the set builtin has been enabled, the redirection
       will fail if the file whose name results from the expansion of word exists and is a regular file.   If  the  redi-
       rection  operator  is  >|, or the redirection operator is > and the noclobber option to the set builtin command is
       not enabled, the redirection is attempted even if the file named by word exists.
  :

以上。

VagrantのSSH config

表題の件について。何の気なしに`vagrant ssh-config`を実行してみて、普段使用している自身のものと何が違うかを見てみた。

■ 環境

  • Vagrant 2.0.3
  • macOS High Sierra

■ vagrant ssh-config

$ vagrant ssh-config
Host default
  HostName 127.0.0.1
  User vagrant
  Port 2200
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile /Users/withsin/path/to/VM/.vagrant/machines/default/virtualbox/private_key
  IdentitiesOnly yes
  LogLevel FATAL

$

気になるところとしては下記くらいであろうか。

  • UserKnownHostsFile /dev/null
  • PasswordAuthentication no
  • IdentitiesOnly yes
  • LogLevel FATAL

■ UserKnownHostsFile

AWSでインスタンスを再構築した際にこれが邪魔になることもあるが…社外に繋ぐ時はあってくれても問題ない。頻度は少ないのでこれといって問題にしていない。

■ PasswordAuthentication

クライアント側ではこれは記載していないな。サーバに準ずる、という感じでいる。

■ IdentitiesOnly

これは指定するとどういう動きになるのだろう?defaultは”no“であるようだが…。”IdentityFile“での接続を必須とするかどうかはサーバに準ずると思っているのだが…。とりあえず無くても問題ないだろう。

■ LogLevel

これも特に指定しなくて良い気がする。問題に感じることは今までに無い。

特に目新しいものはなかった。

以上。

Private IP Range 確認

表題の通り。スクリプト内で取得したIPが、PublicIPなのかPrivateIPなのかを判別させたい。人間が目で見れば判別はすぐにできるのだがスクリプト内で判定させるのはどうしたら良いのだろう?と。

■ 環境

  • macOS High Sierra
  • Amazon Linux

■ ipcalc

先日の`ipcalc`で何かしら取得できないかと思ったのだが、特にこれと言った表記やオプションは無かった。

$ ipcalc -c 192.168.33.10
$

■ dig

逆引きさせて何も返らないんじゃないかと思いやってみた。

$ dig -x 192.168.33.10

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.62.rc1.57.amzn1 <<>> -x 192.168.33.10
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 54828
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0

;; QUESTION SECTION:
;10.33.168.192.in-addr.arpa.    IN    PTR

;; AUTHORITY SECTION:
168.192.in-addr.arpa.    60    IN    SOA    localhost. nobody.invalid. 1 3600 1200 604800 10800

;; Query time: 1 msec
;; SERVER: 10.1.0.2#53(10.1.0.2)
;; WHEN: Fri May 18 15:17:09 2018
;; MSG SIZE  rcvd: 103

$

AUTHORITY SECTION“の結果が使えそうである。ここが”localhost.“であるとPrivateIPであるっぽい。表記を少なくして再度試す。

$ dig +noall +authority -x 10.0.1.10
10.in-addr.arpa.    60    IN    SOA    localhost. nobody.invalid. 1 3600 1200 604800 10800
$

良さげな感じである。

以上。

■ 関連

ipcalc

複数のListenPortを指定

LinuxのSSHにおいて表題の通り。知らなかったのでメモしておく。

■ 環境

  • CentOS 6.9

■ sshd_config

sshdのListenしているPortを変更するというのはよくあるが、この値を複数指定することができるということを知らなかった。`man`で確認すると下記のように記載されている。

 Port    Specifies the port number that sshd(8) listens on.  
         The default is 22.  Multiple options of this type are
         permitted.  See also ListenAddress.

複数指定が可能なようである。試しに実行してみた。

$ cat /etc/ssh/sshd_config
  :
Port 22
Port 12222
  :

デフォルト状態でのListenPortの状態と設定反映後の状態は下記の通り。

$ ss -nlt
  :
LISTEN      0      128                  :::22       :::*
LISTEN      0      128                   *:22        *:*
  :
$
$ sudo service sshd reload
Reloading sshd:                                 [  OK  ]
$
$ ss -nlt
  :
LISTEN      0      128                  :::22       :::*
LISTEN      0      128                   *:22        *:*
  :
LISTEN      0      128                  :::12222    :::*
LISTEN      0      128                   *:12222     *:*
  :

複数指定することのメリットはなんであろう。HoneyPotとして残しておく?移行中?まぁ指定することもあるかもしれないと思ってメモである。

以上。