Puppet Boltを使用して、CentOSからSolarisのコマンドを実行する際に権限エラーで詰まったので、メモ

こんにちは、tanzoです。

今回は、CentOS上でSolarisの情報を取得したい思い、試しにPuppet Boltを使ってみました！！
ほとんどLinuxの知識が皆無だったこともあり、すごい苦戦したため、備忘録として残しておきます。

ちなみに、CentOS、Solaris、VirtualBox等の環境は準備されている前提での説明になりますので、その点はご了承ください。

#環境
* Windows 10
* CentOS Stream release 8 (Virtual box上に構築)
* Oracle Solaris 11.4 (Virtual box上に構築)
* Virtual box (バージョン：6.1.14)
* teraterm (バージョン：4.105)

#Puppet Boltインストール(Windows上に)
 インストールはhttps://yum.puppetlabs.com/puppet/el/8/x86_64/
のサイトから、__puppet-bolt-3.4.0-1.el8.x86_64.rpm__を選択して任意のディレクトリにダウンロードしておきます。
(自分の現環境では、yumが使えなかったので、ファイルをダウンロードする方法を採用しています)

#CentOS起動とscpによるファイル転送
* CentOSはteratermから起動しておきます。(teratermは窓の杜などでインストールしておいてください）
起動したら、ログインして、以下図のように、「SSH SCP...」のボタンを押下します。
![スクリーンショット (25).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1327328/76a6070a-c516-2e7d-f9cd-7806c182dd63.png)

* 次に以下の図のように、「…」ボタンを押下して、先ほどダウンロードしたrpmファイルを選択し、右側の「Send」ボタンを押下します。
＊その際に「To」の入力欄に関しては入力しなくても大丈夫です。(入力しない場合は、ホームディレクトリがデフォルトで選択されます）※点線より下の項目も入力しなくて大丈夫です。

![スクリーンショット (26).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1327328/cf57469b-db23-34e0-47fd-77b1a33d1c06.png)


* そしてrpmファイルがしっかり転送されたか確認するために、CentOS上で以下のコマンドを入力します。
出力結果に先ほど転送したrpmファイルがあれば、OKです。

`コマンド`

```
[yuta@localhost ~]$ ls puppet*
puppet-bolt-3.4.0-1.el8.x86_64.rpm
```


#Puppet Boltインストール(CentOS上に)
rpmファイルがCentOS上にあることが確認できたため、以下のコマンドを入力して、インストールしていきます。

`コマンド`

```
[yuta@localhost ~]$ rpm -ivh puppet-bolt-3.4.0-1.el8.x86_64.rpm
```
インストールに成功したら、次に鍵の設定を行っていきます。

#SSH鍵認証の手順
ここからは、CentOSとSolarisの二つを同時に操作していきますので、teratermからファイル →「新しい接続」でSolarisにもログインをしておきます。(もし、Solarisにログインした際に、ホームディレクトリが無いというエラーが出ていた場合、sudoになって、作成しておいてください)

ちなみに自分は、/export/home/ユーザ名 というホームディレクトリが無いというエラーが出ていたので作りました笑　←　無かったら絶対作ってください！(ディレクトリは 【# mkdir ディレクトリ名】で作成できます)

* 今回はCentOSからSolarisの情報を取得するため、CentOSがクライアント、Solarisがサーバ側になります。

はじめにCentOS上で以下のコマンドを入力して、サーバへログイン認証する鍵を作成します。(.sshフォルダは勝手に作ってくれます）

```
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/yuta/.ssh/id_rsa): ← Enterキーを押します
Created directory '/home/yuta/.ssh'. ← ~/.ssh がない場合、ディレクトリを作成してくれます
Enter passphrase (empty for no passphrase): ← パスフレーズを入力します(入力しなくてもOK)
Enter same passphrase again: ← もう一度パスフレーズを入力します(入力しなくてもOK ↑入力してない場合)
Your identification has been saved in /home/yuta/.ssh/id_rsa.
Your public key has been saved in /home/yuta/.ssh/id_rsa.pub.
```

 * では、実際に公開鍵、秘密鍵が作られたかどうか、以下のコマンドで確認します。(以下、currentディレクトリがbinですが、lsでpath通してるので問題ないです)
 
`コマンド`

```
[yuta@localhost bin]$ ls /home/yuta/.ssh
id_rsa  id_rsa.pub  known_hosts
```

* 上記、鍵ファイルの確認が取れましたので、次にSolaris（サーバ側）上に公開鍵(id_rsa.pubファイル)の転送を行います。以下のコマンドでエラーが出なければ、OKです。(ちなみに自分は、scp: ./id_rsa.pub: Permission deniedのようなエラーが出て、降参したので別の方法でやりました笑)

```
[yuta@localhost ~]$ scp /home/yuta/.ssh/id_rsa.pub ログイン先のユーザ名@ログイン先のホスト名かIP:
```


#CentOSからSolarisにファイル転送(scp以外)
scpコマンドでファイル転送が出来なかった場合、無理やりですがSolaris上で以下の手順を行ってください！

①ホームディレクトリにいる状態でsudo(以下のコマンド参照)

`コマンド`

```
-bash-4.4$ pwd
/export/home/ユーザ名 ←　Solarisにログインした際にいる階層(実質ログインして、何も考えずにsudoすればよい)
-bash-4.4$ sudo -s
Password:
root@solaris:/export/home/ユーザ名#
```

②CentOS上のid_rsa.pubファイルの内容を記載するファイルを作成して、CentOS上のid_rsa.pubファイル内を全てコピーして貼り付ける(以下コマンド参照)

`コマンド`

```
root@solaris:/export/home/ユーザ名# touch id_rsa.pub
root@solaris:/export/home/ユーザ名# ls
id_rsa.pub
root@solaris:/export/home/ユーザ名# vim id_rsa.pub
~ここにCentOS上のid_rsa.pubファイル内を全てを張り付ける
~
~
~
~
~
~
以下省略
```

③.sshファイルを作成し、authorized_keysファイルにid_rsa.pubファイルの内容を反映させる（以下コマンド参照)


`コマンド`

```
root@solaris:/export/home/ユーザ名# mkdir .ssh
root@solaris:/export/home/ユーザ名# cat id_rsa.pub >> authorized_keys →　authorized_keysに反映
root@solaris:/export/home/ユーザ名# find / -name authorized_keys
/export/home/ユーザ名/.ssh/authorized_keys  →　こうなっていればOK
root@solaris:/export/home/ユーザ名# cat /export/home/ユーザ名/.ssh/authorized_keys　→　これを入力して公開鍵の内容が出力されればOK
```

#実際にboltコマンドを試してみる
ここまで来たら、boltコマンドが使える状態になったと思うのでCentOS上で以下コマンドを入力する

`code`

```
[yuta@localhost ~]$ find / -name bolt
省略
/usr/local/bin/bolt　→　このbinフォルダの階層に移動する
省略
[yuta@localhost ~]$ cd /usr/local/bin/
[root@localhost bin]$ ./bolt command run "echo hoge" --targets ユーザ名@IP
省略
Started on ユーザ名@IP
Finished on ユーザ名@IP
  hoge   →　この表示がされていたらOK
Successful on 1 target: ユーザ名@IP
Ran on 1 target in 1.44 sec
```

#最後に（主に躓いたこと)
* サーバ側に鍵を配置する時は、配置するディレクトリは 「ホームディレクトリ/.ssh/authorized_keys」になるようにする　→　これをしてなかったから、権限エラーになり、終わりの見えない戦いが始まった感じがしていた笑
* 知識がないため、注意する事か分からないが、サーバ側のパーミッションの設定で、___.sshはdrwxr-xr-x___、__authorized_keysは-rw-r--r--__にしたら、うまくboltコマンドが使えた
* boltコマンドを実行する時は、sudoしていない状態でやったほうが良いと思う。（めんどくさそうなエラーが出るため)
* boltコマンドで対象サーバから情報を取得する前に、一度SSH接続でクライアントからサーバ側にログインしておくとよい。


#参考URL
https://qiita.com/gotohiro55/items/36a22516de2b381b3c6e
https://qiita.com/jinnai73/items/f1822f2e4d567847e215
https://qiita.com/shisama/items/5f4c4fa768642aad9e06
https://qiita.com/takuyanin/items/18590600d077df707923
https://puppet.com/docs/bolt/latest/running_bolt_commands.html