Using Bastion(jump host) in Ansible

方法一:直接写入inventory的方式

核心参数: ansible_ssh_common_args options

more ansible_*_args

Ansible 利用了 OpenSSH 的ProxyCommand来实现跳过Bastion(proxy/ jump)的功能。

优点是全都写入一个文件,逻辑清晰。下面对应的inventory文件:

# file: tmp2_hosts
[gatewayd]
foo ansible_host=10.47.1.249 ansible_ssh_common_args=' -o ProxyCommand="ssh -W %h:%p 54.183.22.215"'

如果有多个vm,每一个都要照着上面 ansible_ssh_common_args 的配置写一遍,这就不够简洁了。

改造一下,用分组的方式

# file: tmp_hosts
[jump]
54.183.22.215

[gatewayd]
foo ansible_host=10.47.1.249

[gatewayd:vars]
ansible_ssh_common_args=' -o ProxyCommand="ssh -W %h:%p 54.183.22.215"'

[all:vars]
ansible_ssh_private_key_file='aws-staging-private.pem'


上面的例子定义了一个组gatewayd,再定义了这个组的变量 [gatewayd:vars],告诉它要通过proxy去连接。

对应的yml文件,实现简单的ping 功能。

# file: tmp.yml
---
- hosts: gatewayd
  remote_user: ubuntu
  gather_facts: yes
  tasks:
     - name: test ping
       ping:

执行效果:

$ ansible-playbook -i tmp_hosts tmp.yml
PLAY [gatewayd] ******************************************************************************************
TASK [Gathering Facts] ***********************************************************************************
ok: [foo]
TASK [test ping] *****************************************************************************************
ok: [foo]
PLAY RECAP ***********************************************************************************************
foo                        : ok=2    changed=0    unreachable=0    failed=0

方法二:灵活性更强的配置方式

这是官方FAQ的例子。

定义一个组都要通过proxy 连接(相当于把上面例子中的 [gatewayd:vars] 部分单独拿出来)

# file: group_vars/gatewayed.yml
ansible_ssh_common_args: ' -o ProxyCommand="ssh -i group_vars/eea_rsa -W %h:%p -q redhat@40.83.74.108"'

定义这个组里有哪些机器

# file: hosts
[gatewayed]
foo ansible_host=192.168.3.5
small-test-01

测试效果

$ ansible -i hosts gatewayed -m ping
small-test-01 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
foo | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

方法三:解耦的方式

方法二的缺点是:当我们有很多组的时候,我们要确保每个组都要归属于gatewayed,例如:

# inventory file: host1
[gatewayed:children]
ambari-nodes
ambari-server
....

[ambari-nodes]
roy-vm-hdp-01
roy-vm-hdp-02
..

# inventory file: host2
[gatewayed:children]
kafka-broker
postgresl-server

[kafka-broker]
kafka-01
kafka-02
...

上述文件 [gatewayed:children] 出现多次,每个组都要配置它。当inventory文件很多,并且由不同的人来维护时,成本就高了。

下面的解耦方法涉及到两个文件:ansible.cfg 和 ssh.cfg (第二个文件名字可以换,它由前一个文件定义)

ansible.cfg:

[ssh_connection]
ssh_args = -C -F ./ssh.cfg

I prefer to place ansible.cfg in the current directory with my playbooks, inventory, roles, and host/group variables.

ssh.cfg:

# All hosts
Host *
  # Security
  ForwardAgent no
  # Connect through bastion hosts
  ProxyCommand ssh -W %h:%p royjump.eastasia.cloudapp.azure.com

# Bastion hosts
Host royjump
  HostName royjump.eastasia.cloudapp.azure.com
  ProxyCommand none
  # Connection multiplexing
  ControlMaster auto
  ControlPersist 2m
  ControlPath ~/.ssh/ansible-%r@%h:%p

[注意] 跳板机 要配置为可以DNS解析的全域名, 如 royjump.eastasia.cloudapp.azure.com,如果不能解析,改自己的/etc/hosts文件来解决。这个问题卡了我很长时间。

# inventory file: myhosts
[bastion]
royjump

[backend]
roy-internal

Inventory 文件中没有出现关于跳板机怎么配置的问题,把这个问题隐藏了,用户只需要关注最原始的inventory应该怎么写。

验证

test.yml

- hosts: bastion
  tasks:
   - ping:

- hosts: backend
  tasks:
   - ping:

run playbook to connect these 2 machines.

$ ansible-playbook -i myhosts test.yml

PLAY [bastion] *****************************************************************

TASK [Gathering Facts] *********************************************************
ok: [royjump]

TASK [ping] ********************************************************************
ok: [royjump]

PLAY [backend] *****************************************************************

TASK [Gathering Facts] *********************************************************
ok: [roy-internal]

TASK [ping] ********************************************************************
ok: [roy-internal]

PLAY RECAP *********************************************************************
roy-internal               : ok=2    changed=0    unreachable=0    failed=0
royjump                    : ok=2    changed=0    unreachable=0    failed=0

参考文档:1 2


2018.11.22 更新: “方法三”不是官方推荐的方法,在CentOS测试通过,但效率很慢,对于简单测试,耗时是“方法二”的4倍。在Mac OS测试时,发现“方法三”有bug,不一定能测通。

方法四:在命令行中写入参数

参数:--ssh-common-args
e.g.

ansible-playbook  --ssh-common-args='-o ProxyCommand="ssh  -W %h:%p -q ec2-user@1.2.3.4"' site.yml

优点:不用关心配置文件关于bastion部分。
缺点:这么长的参数记不住,适合生成脚本再运行。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,607评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,239评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,960评论 0 355
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,750评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,764评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,604评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,347评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,253评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,702评论 1 315
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,893评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,015评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,734评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,352评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,934评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,052评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,216评论 3 371
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,969评论 2 355

推荐阅读更多精彩内容

  • 1)安装2)常用模块3)inventory4)playbook(role\tag\template)5) yaml...
    秦记阅读 4,172评论 2 5
  • 一、inventory介绍 前面我们介绍过ansible的hosts文件是存放被管理主机的,被管理主机比较少的情况...
    GoGooGooo阅读 8,054评论 1 14
  • 一、简介 在Linux自动化运维中,常见的自动化运维工具可分为需要安装终端的puppet、func和不需要安装终端...
    小尛酒窝阅读 2,729评论 0 6
  • 1 介绍 ansible是一种自动化运维工具,基于paramiko开发的,并且基于模块化工作,Ansible是一种...
    drfung阅读 72,441评论 2 36
  • 安装ansible 1.yum安装:RHEL(Centos)7版本: 2.Apt(Ubuntu)安装方式: 3.h...
    爱吃土豆的程序猿阅读 11,142评论 0 12