Contents
運用環境で踏み台を経由して作業をしている現場は結構あると思います。(エンタープライズなんて特に)
しかも、踏み台の踏み台とか複雑にネストしているような環境も現場によってはあるのではないでしょうか。
そこで、ここではAnsible Towerを使ったSSHの多段接続方法について書いてみようと思います。
ドキュメント
環境
項目 | バージョン |
---|---|
Ansible Tower | 3.5.1 |
RHEL | 7.6 |
検証環境
target01
へアクセスするには fumidai01
を経由してアクセスします。
target02
へは fumidai01
と fumidai02
を経由してアクセスします。
ここでは、sshを中継するユーザーは awx
を使用します。
準備
SSHの鍵を作成
SSHの秘密鍵と公開鍵を作成します。
1 2 3 4 5 6 7 8 9 10 11 |
[root@at01 ~]# ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /root/.ssh/id_rsa. Your public key has been saved in /root/.ssh/id_rsa.pub. The key fingerprint is: SHA256:JZCcqc+/wmfH/WpOrGzdgYa1tG+2Fxk7D09Qo65f43Q root@at01 The key's randomart image is: |
公開鍵のコピー
作成した公開鍵(id_rsa.pub
)を fumidai01
と fumidai02
のawxユーザーのホームディレクトリの .ssh
へ保存します。
fumidai01とfumidai02にawxユーザーが存在しない場合は作成してください。
1 2 3 4 5 6 |
[awx@fumidai01 ~]$ mkdir .ssh [awx@fumidai01 ~]$ chmod 700 .ssh [awx@fumidai01 ~]$ vi .ssh/authorized_keys (公開鍵をコピー) [awx@fumidai01 ~]$ chmod 600 .ssh/authorized_keys |
次に target01
と target02
のrootユーザーのホームディレクトリの .ssh
へ保存します。
1 2 3 4 5 6 |
[root@target01 ~]# mkdir .ssh [root@target01 ~]# chmod 700 .ssh [root@target01 ~]# vi .ssh/authorized_keys (公開鍵をコピー) [root@target01 ~]# chmod 600 .ssh/authorized_keys |
Playbook
ここでは、接続先のホスト名を表示するだけの簡単なPlaybookを使います。
1 2 3 4 |
[root@at01 ~]# cd /var/lib/awx/projects/ [root@at01 projects]# mkdir example [root@at01 projects]# vi example/main.yml |
1 2 3 4 5 6 |
--- - name: example hosts: all tasks: - debug: msg="{{ ansible_facts.hostname }}" |
Ansible Tower認証情報
Ansible Towerに登録した認証ユーザーに作成したSSH 秘密鍵を登録してください。
ここでは、rootを使って target01
target02
へアクセスするためrootユーザーに秘密鍵を登録しています。
Ansible Towerテンプレート
テンプレートの設定は以下のようにしています。
実行
変数定義の場合
それでは、まず target01
にアクセスしてみます。
target01
のインベントリー設定は以下のようになっています。
変数
1 2 3 4 |
--- ansible_host: 10.32.254.3 ansible_ssh_common_args: -o ProxyCommand="ssh -W %h:%p -q awx@192.168.0.80 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null |
StrictHostKeyChecking=no
を指定している理由は踏み台を経由するときに fingerprint
チェックの表示をされないようにするためです。
UserKnownHostsFile
で known_hosts
が作成されないようにしています。
結果は以下のようになります。
問題なくホスト名が表示されていることが確認できます。
一つの踏み台は問題なく接続できました。
次は2つの踏み台を経由してみましょう。
target02
のインベントリー設定は以下のようになっています。
変数
1 2 3 4 |
--- ansible_host: 172.31.254.2 ansible_ssh_common_args: -o ProxyCommand="ssh -W %h:%p -o ProxyCommand=\"ssh -W %%h:%%p -q awx@192.168.0.80 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null\" -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -q awx@10.32.254.2" -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null |
ProxyCommand
をネストする形で記述します。
結果は以下のようになります。
SSHの設定ファイルの場合
awxユーザーにsshのconfigを作ることでも多段接続ができます。
例えば、今回の場合だと以下のファイルを作成します。
1 2 3 |
[root@at01 ~]# su - awx -bash-4.2$ vi .ssh/config |
configは以下の通りです。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Host * StrictHostKeyChecking=no UserKnownHostsFile=/dev/null Host 10.32.254.3 ProxyCommand ssh -W %h:%p -q 192.168.0.80 Host 10.32.254.2 ProxyCommand ssh -W %h:%p -q 192.168.0.80 Host 172.31.* ProxyCommand ssh -W %h:%p -q 10.32.254.2 |
パーミッションを変更します。
1 2 |
-bash-4.2$ chmod 600 .ssh/config |
これを有効にするにはAnsible Towerの 設定
-> ジョブ
で ジョブの分離の有効化
を オフ
にする必要があります。
最後に
いくつも踏み台があったとしてもこれで操作対象ホストへアクセスできるようになりますね 🙂
柔軟性を持たせるなら host_vars
or group_vars
で、踏み台が複数ある場合の可読性を考慮したり固定化したい場合はawxの config
で設定する感じですね。
以上、Ansible Towerを使ったSSH多段接続方法でした。
それでは、みんなでハッピーオートメーション!