IAP越しのSSHを行ってAnsibleを操作する場合、ネットを調べると以下の二つが存在するようです。
最初1を使っていたのですがあまりにも遅すぎてストレスが溜まっていたので2を検討しました。2を設定するにあたり自分の環境ではうまく動作しなかったのでサンプル込みでここに載せておきます。
改善結果としては以下の通り。(自分が動かしているroleでは)
22min33sec → 37sec はやすぎる・・・。
肝はこのブログの内容を参考にしております。大変助かりました!!!
設定した内容
構造
├── 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なのでご自身のをお使いください。