まず、ansible.cfg の中身を見てみました
[defaults]
inventory = ./hosts
remote_user = ec2-user
log_path = ./log/ansible.log
[ssh_connection]
control_path = %(directory)s/%%h-%%r
ssh_args = -o ControlPersist=15m -o ForwardAgent=yes -F ./ssh_config -q
上の方は分かるけど[ssh_connection] の部分、分からん...
私の知らなかったのは、
SSHのセッションを束ねるControlMasterという機能のことだそうです
CONTROLMasterはデフォルトでONとのこと(auto)
https://docs.ansible.com/ansible/latest/reference_appendices/config.html?highlight=controlmaster#ansible-ssh-args
control_pathはセッションで使うソケットのパスだそうです
https://docs.ansible.com/ansible/latest/reference_appendices/config.html?highlight=control_path#envvar-ANSIBLE_SSH_CONTROL_PATH
ちなみにControl_Pathは108文字を超えるとエラーになるらしいです
気をつけましょう
https://qiita.com/hakobera/items/70c3e690fef303ed49be
ControlPersist使うと、sshのセッションを一定期間のみ使い回せるらしく、
一回接続を切っても15分間はそのセッションで繋げるようです
これを指定しないと、Ctrl-Cを押したらセッションが全部切れるらしい
これを指定しておくと、最初のセッションを切っても他のセッションを継続できるようです
いいやつらしい
まとめると、
hostsを見て繋ぎ、ec2-userでやり、実行ログはローカルの/log/ansible.logに出します
%(directory)s/%%h-%%r
(どこかのディレクトリ/hostname-regionname)
にソケット作ります
15分セッション維持し、多段接続は許可し、./ssh_configで名前解決します
hostsは普通だったので割愛して、
次に、ssh_configの中身を見てみました
Host *
User ec2-user
StrictHostKeyChecking no
Host EC2*
ProxyCommand ssh -F ./ssh_config -W %h:%p Bastion
Host Bastion
HostName xxx.xxx.xxx.xxx
# ---------------------------------- #
Host EC2_01
HostName 192.168.1.1
この設定では全てのサーバーにec2-userで入り、StrictHostKeyChecking noで入り
EC2で始まるホストにはBastion経由し多段sshします
%hはEC2で始まるホスト名、%pは無指定なのでデフォルトの 22ポートで接続します
Bastion経由で、ローカルポートはよしなにしてくれます
力尽きた...
試しにコマンドだけ打つなら下記でも可能(playbook要らない)
参考
http://tdoc.info/blog/2014/01/22/ansible_adhoc_commands.html
ansible all -a "free"
こんな感じで返ってくる
EC2_01 | SUCCESS | rc=0 >>
total used free shared buff/cache available
Mem: 15791384 1843264 8877620 786812 5070500 12765836
Swap: 0 0 0
EC2_02 | SUCCESS | rc=0 >>
total used free shared buff/cache available
Mem: 15791384 1530268 9255292 795000 5005824 13071720
Swap: 0 0 0