この投稿は、Ansibleを使用したマルチパス仮想マシンに関するものです
前提条件
マルチパス仮想マシンは、「マルチパス仮想マシンと秘密鍵を使用した認証」の記事の指示に従って作成する必要があります。秘密鍵を含むファイルが保存されている場所に注意してください。
2番目の前提条件はAnsibleです。 Ansibleのインストール方法の説明は、Ansibleの公式ドキュメントに記載されています。
準備
この記事の例の準備は次のとおりです。
- この記事の例のファイルを保持するディレクトリを作成します。
ディレクトリを「AnsibleMultipass」と呼びます。 - 「user_key」という名前の秘密鍵ファイルを新しいディレクトリにコピーします。
このキーファイルは、前の記事のマルチパスVMの作成の一部として作成されました。 - キーベースの認証を備えたマルチパスVMを起動します。
- キーベースの認証を使用してマルチパスVMのIPアドレスを検索します。
これは、たとえば、マルチパスリストを使用して実行できます。 ターミナルウィンドウのコマンド。私の場合、IPは192.168.64.20です。
Ansible Inventory
Ansibleインベントリは、インフラストラクチャ内の1つ以上のノードに接続する方法をAnsibleに通知します。したがって、この記事の例には、単一の仮想マシンのみで構成される非常に小さなインフラストラクチャが含まれています。
AnsibleMultipassディレクトリに、次の内容の「multipass-vm-inventory.yml」という名前のファイルを作成します。
all:
hosts:
multipassvm1:
ansible_connection: ssh
ansible_host: "192.168.64.20"
ansible_user: vmadmin
ansible_ssh_common_args: "-o StrictHostKeyChecking=no -o ControlMaster=no -o ControlPath=none"
ansible_ssh_private_key_file: user_key
注:
- このAnsibleインベントリファイルには、multipassvm1という1つのホストがあります。
- ホストへの接続の種類は、SSHであるansible_connection値によって指定されます。
- ホストのIPアドレス、または存在する場合はDNS名は、ansible_host値で指定されます。
- IPアドレスは、ローカルマルチパスVMのIPアドレスに置き換える必要があります。
- ansible_userの値vmadminは、ホストに接続するときに使用されるユーザーの名前です。
- この値(この例ではvmadmin)は、ssh-keygenコマンドでキーが生成されたときに使用されたユーザー名である必要があります。
- ansible_ssh_common_argsは、sftp、scp、およびsshコマンドに追加される共通の引数を指定します。
- StrictHostKeyChecking =noは、新しいキーが信頼できるかどうかのプロンプトをオフにします。代わりに、新しいキーはすべて、known_hostsファイルにサイレントに追加されます。
- ControlMasterとControlPathの設定は、エスケープされなかったスペースを含むデフォルトのControlPathが原因で発生したコンピューターの問題の回避策です。これらは他のコンピューターでは必要ない場合があり、省略できます。
- 最後に、ansible_ssh_private_key_file値は、ホストへの接続時に使用される秘密鍵ファイルの名前と、オプションで場所を指定します。
- ファイル名のみが指定されている場合、キーファイルの場所はインベントリファイルを基準にしています。絶対的な場所にすることができます。
Ansibleモジュール
Ansibleインベントリを配置すると、インベントリ内のホストに対してAnsibleモジュールを実行できるようになります。したがって、この記事では、いくつかの例のみを示します。ドキュメントには、利用可能なすべてのAnsibleモジュールのリストがあります。
Pingモジュール
Ansbileモジュールの1つはpingモジュールです。ドキュメントに記載されているように、pingモジュールはホストに接続し、使用可能なPythonインストールを検証しようとします。
AnsibleMultipassディレクトリにあるターミナルウィンドウで、次のコマンドを発行します。
ansible -i multipass-vm-inventory.yml multipassvm1 -m ping
上記のコマンドには、次のパラメータがあります。
- -i multipass-vm-inventory.yml
multipass-vm-inventory.ymlという名前のカスタムインベントリファイルを使用します - multipassvm1
モジュールを実行するホストの名前。使用するインベントリのホストである必要があります。 - -m ping
実行するモジュールの名前(この場合はping)を指定します。
結果の出力は次のようになります。
multipassvm1 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3"
},
"changed": false,
"ping": "pong"
}
ご覧のとおり、マルチパスVMとの接続が正常に確立され、Pythonインタープリターが検出されました。
したがって、マルチパスVMホストに対してpingモジュールを実行する際に問題が発生した場合は、Ansibleコマンドに-vvvを追加して、より詳細な出力を行います。
ansible -vvv -i multipass-vm-inventory.yml multipassvm1 -m ping
実行が成功すると、上記は次のような出力を生成します(一部の出力は省略されています):
ansible 2.10.3
...
Parsed /Users/ivan/AnsibleMultipass/multipass-vm-inventory.yml inventory source with yaml plugin
...
<192.168.64.20> ESTABLISH SSH CONNECTION FOR USER: vmadmin
<192.168.64.20> SSH: EXEC ssh -C -o ControlMaster=auto -o ControlPersist=60s -o 'IdentityFile="user_key"' -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o 'User="vmadmin"' -o ConnectTimeout=10 -o StrictHostKeyChecking=no -o ControlMaster=no -o ControlPath=none 192.168.64.20 '/bin/sh -c '"'"'( umask 77 && mkdir -p "` echo /home/vmadmin/.ansible/tmp `"&& mkdir "` echo /home/vmadmin/.ansible/tmp/ansible-tmp-1621106467.2205691-7451-138900743300503 `" && echo ansible-tmp-1621106467.2205691-7451-138900743300503="` echo /home/vmadmin/.ansible/tmp/ansible-tmp-1621106467.2205691-7451-138900743300503 `" ) && sleep 0'"'"''
<192.168.64.20> (0, b'ansible-tmp-1621106467.2205691-7451-138900743300503=/home/vmadmin/.ansible/tmp/ansible-tmp-1621106467.2205691-7451-138900743300503\n', b'')
<multipassvm1> Attempting python interpreter discovery
<192.168.64.20> ESTABLISH SSH CONNECTION FOR USER: vmadmin
<192.168.64.20> SSH: EXEC ssh -C -o ControlMaster=auto -o ControlPersist=60s -o 'IdentityFile="user_key"' -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o 'User="vmadmin"' -o ConnectTimeout=10 -o StrictHostKeyChecking=no -o ControlMaster=no -o ControlPath=none 192.168.64.20 '/bin/sh -c '"'"'echo PLATFORM; uname; echo FOUND; command -v '"'"'"'"'"'"'"'"'/usr/bin/python'"'"'"'"'"'"'"'"'; command -v '"'"'"'"'"'"'"'"'python3.7'"'"'"'"'"'"'"'"'; command -v '"'"'"'"'"'"'"'"'python3.6'"'"'"'"'"'"'"'"'; command -v '"'"'"'"'"'"'"'"'python3.5'"'"'"'"'"'"'"'"'; command -v '"'"'"'"'"'"'"'"'python2.7'"'"'"'"'"'"'"'"'; command -v '"'"'"'"'"'"'"'"'python2.6'"'"'"'"'"'"'"'"'; command -v '"'"'"'"'"'"'"'"'/usr/libexec/platform-python'"'"'"'"'"'"'"'"'; command -v '"'"'"'"'"'"'"'"'/usr/bin/python3'"'"'"'"'"'"'"'"'; command -v '"'"'"'"'"'"'"'"'python'"'"'"'"'"'"'"'"'; echo ENDFOUND && sleep 0'"'"''
<192.168.64.20> (0, b'PLATFORM\nLinux\nFOUND\n/usr/bin/python3\nENDFOUND\n', b'')
<192.168.64.20> ESTABLISH SSH CONNECTION FOR USER: vmadmin
<192.168.64.20> SSH: EXEC ssh -C -o ControlMaster=auto -o ControlPersist=60s -o 'IdentityFile="user_key"' -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o 'User="vmadmin"' -o ConnectTimeout=10 -o StrictHostKeyChecking=no -o ControlMaster=no -o ControlPath=none 192.168.64.20 '/bin/sh -c '"'"'/usr/bin/python3 && sleep 0'"'"''
<192.168.64.20> (0, b'{"platform_dist_result": [], "osrelease_content": "NAME=\\"Ubuntu\\"\\nVERSION=\\"20.04.2 LTS (Focal Fossa)\\"\\nID=ubuntu\\nID_LIKE=debian\\nPRETTY_NAME=\\"Ubuntu 20.04.2 LTS\\"\\nVERSION_ID=\\"20.04\\"\\nHOME_URL=\\"https://www.ubuntu.com/\\"\\nSUPPORT_URL=\\"https://help.ubuntu.com/\\"\\nBUG_REPORT_URL=\\"https://bugs.launchpad.net/ubuntu/\\"\\nPRIVACY_POLICY_URL=\\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\\"\\nVERSION_CODENAME=focal\\nUBUNTU_CODENAME=focal\\n"}\n', b'')
...
multipassvm1 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3"
},
"changed": false,
"invocation": {
"module_args": {
"data": "pong"
}
},
"ping": "pong"
}
META: ran handlers
インベントリ構成の読み取り、SSHを使用したホストへの接続、Pythonのインストールの確認、およびホストのオペレーティングシステムに関する情報の取得のプロセスの詳細を識別できます。
セットアップモジュール
この記事で試す2番目で最後のAnsibleモジュールは、ホストに関する情報を収集するセットアップモジュールです。マルチパスVMホストに関する情報を収集するには、ターミナルウィンドウで次のコマンドを発行します。
ansible -i multipass-vm-inventory.yml multipassvm1 -m setup
コンソールには多くの情報が出力されます。幸い、次の例のようにフィルターを適用することで、情報のサブセットを選択できます。
ansible -i multipass-vm-inventory.yml multipassvm1 -m setup -a "filter=ansible_env*"
上記はmultipassvm1に関する情報を収集し、ansible_envで始まるキーを持つ情報のみを保持します。私のシステムでは、出力は次のようになります:
multipassvm1 | SUCCESS => {
"ansible_facts": {
"ansible_env": {
"DBUS_SESSION_BUS_ADDRESS": "unix:path=/run/user/1000/bus",
"HOME": "/home/vmadmin",
"LANG": "C.UTF-8",
"LC_CTYPE": "C.UTF-8",
"LOGNAME": "vmadmin",
"MOTD_SHOWN": "pam",
"PATH": "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin",
"PWD": "/home/vmadmin",
"SHELL": "/bin/sh",
"SSH_CLIENT": "192.168.64.1 49301 22",
"SSH_CONNECTION": "192.168.64.1 49301 192.168.64.20 22",
"SSH_TTY": "/dev/pts/0",
"TERM": "xterm-256color",
"USER": "vmadmin",
"XDG_RUNTIME_DIR": "/run/user/1000",
"XDG_SESSION_CLASS": "user",
"XDG_SESSION_ID": "8",
"XDG_SESSION_TYPE": "tty"
},
"discovered_interpreter_python": "/usr/bin/python3"
},
"changed": false
}
上記は、マルチパスVMにログインするときにvmadminユーザーに設定される環境変数です。
マルチパスVMホストを含むAnsibleインベントリを作成できるため、この種の仮想マシンでAnsibleを使用できます。したがって、Ansibleプレイブックを作成して、マルチパス仮想マシンをセットアップおよび構成できます。これは、今後の記事で利用します。