BINDのレコードでホスト名にアンダースコア(アンダーバー)は使えない

概要

Let's Encryptでdns01モードでチャレンジしようとしたところチャレンジ失敗どころかレコードが引けなくなってしまった。

_acme-challenge.example.com

こういったサブドメインを設定する必要がある。

_acme-challenge IN  TXT "xxxxxxxxxxxxxxxxxxx"

BINDのTXTレコード設定だとこうなる。

原因

原因も対策も参考サイト通りでした。感謝。

どうやらリソースレコードで_(アンダーバー)を使うと、named-checkzoneしたときにこういうエラーが出るらしい。(named.confで設定するcheck-namesのデフォルト値がfailになったBIND9.3.1以降で発生する模様)

参考元:https://infra.xyz/archives/228


対策

named.confで対象のゾーンの箇所を以下のように変更

zone "example.com" {
        type master;
        file "example.com.zone";
};

zone "example.com" {
        type master;
        file "example.com.zone";
        check-names ignore;
};


systemctlコマンド

自動起動確認
systemctl list-unit-files --type=service

or

systemctl -t service list-unit-files


起動スクリプトの設定表示
systemctl cat ntp.service


起動パラメータ設定表示
systemctl show ntp.service


起動パラメータを指定して個別表示
systemctl show ntp.service -p TimeoutStartUSec


起動スクリプト更新後反映
systemctl daemon-reload

or

systemctl reenable ntp.service


/etc/systemd/system.conf更新後反映
systemctl daemon-reexec

Testinfraでサーバーのテスト

概要

Python製のサーバーテストツールTestinfraを試してみました。
GitHub philpep/testinfra: Testinfra test your infrastructures

インストール

pip install testinfra


テストファイルを用意

test_docker.pyといったファイル名で用意します。

# Docker
def test_docker_engine_is_installed(Package):
    docker_engine = Package("docker-engine")
    assert docker_engine.is_installed
    assert docker_engine.version.startswith("1.13.1")

def test_docker_engine_running_and_enabled(Service):
    docker_engine = Service("docker")
    assert docker_engine.is_running
    assert docker_engine.is_enabled

# td-agent
def test_td_agent_is_installed(Package):
    td_agent = Package("td-agent")
    assert td_agent.is_installed

def test_td_agent_running_and_enabled(Service):
    td_agent = Service("td-agent")
    assert td_agent.is_running
    assert td_agent.is_enabled

関数名はtest_から始める必要があります。

実行

testinfra -v test_docker.py --connection=ssh --hosts=example.com

-vテスト結果を詳細に出すオプションです。

実行例

td-agentを自動起動設定していない状態で実行してみます。
td-agentを自動起動設定のテストだけ失敗するはずです。

plugins: testinfra-1.5.3
collected 4 items

test_docker.py::test_docker_engine_is_installed[ssh://example.com] PASSED
test_docker.py::test_docker_engine_running_and_enabled[ssh://example.com] PASSED
test_docker.py::test_td_agent_is_installed[ssh://example.com] PASSED
test_docker.py::test_td_agent_running_and_enabled[ssh://example.com] FAILED

===== FAILURES =====
_____ test_td_agent_running_and_enabled[ssh://example.com] _____

Service = <class 'testinfra.modules.base.SystemdService'>

    def test_td_agent_running_and_enabled(Service):
        td_agent = Service("td-agent")
        assert td_agent.is_running
>       assert td_agent.is_enabled
E       assert False
E        +  where False = <service td-agent>.is_enabled

test_docker.py:20: AssertionError
===== pytest-warning summary =====
WP1 None Module already imported so can not be re-written: testinfra
===== 1 failed, 3 passed, 1 pytest-warnings in 10.92 seconds =====

1個だけテストが失敗している様子が分かります。