フラミナル

考え方や調べたことを書き殴ります。IT技術系記事多め

IAP越しのAnsible SSHを高速に実行できるようにする

f:id:lirlia:20211001231554p:plain

IAP越しのSSHを行ってAnsibleを操作する場合、ネットを調べると以下の二つが存在するようです。

  1. wrapper shellを使用する
  2. iap-tunnelコマンドをProxyCommandとして追加してSSHをする

最初1を使っていたのですがあまりにも遅すぎてストレスが溜まっていたので2を検討しました。2を設定するにあたり自分の環境ではうまく動作しなかったのでサンプル込みでここに載せておきます。

改善結果としては以下の通り。(自分が動かしているroleでは)

22min33sec → 37sec  はやすぎる・・・。

肝はこのブログの内容を参考にしております。大変助かりました!!!

tech.griphone.co.jp

設定した内容

構造

├── ansible.cfg
├── group_vars
│  └── all.yaml
├── inventory
│  └── gcp.yaml
└── playbook.yaml

ansible.cfg

[defaults]
inventory      = inventory

[inventory]
enable_plugins= gcp_compute

[ssh_connection]
# 高速化のため
pipelining= True

# ControlPersistent を使用しSSHコネクションの使い回しを実施
# StrictHostKey / UserKnownHostsFileを使ってインスタンス再作成時のKnownHostsエラーを無視
control_path = ~/.ssh/controlmaster-%%r@%%h
ssh_args = -o ControlPersist=15m -o ControlMaster=auto -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null

# SFTPだとIAP proxycommandがうまく動かないのでSCPにする
scp_if_ssh = True

private_key_file = ~/.ssh/google_compute_engine
  • private_key_file はなんかいつの間にかローカルにあったのを使いました。(gcloud auth login するとつくられるのかも?)

group_vars/all.yaml

ansible_ssh_common_args: "-o ProxyCommand='gcloud compute start-iap-tunnel %h %p --listen-on-stdin --zone {{ vars.zone }} --project {{ vars.project }}'"

GCEにアクセスする時の一部の変数を規定するのでansible.cfgではなくこっちに書いています。 zone やprojectはinventoryでホストを持ってくると勝手に値が入るので宣言の必要はありません。

inventory/gcp.yaml

plugin: gcp_compute
projects:
  - xxxxx
filters:
  - labels.ansible = "true"
auth_kind: application
groups:
  gce_instance: yes
hostnames:
  # List host by name instead of the default public ip
  - name

これはGCEに ansible=true というラベルが存在するときのみ実行するというものです。

playbook.yaml

- name: initialize
  hosts: all
  become: True
  roles:
    - xxx

これはただのplaybookなのでご自身のをお使いください。