如果我们改变SSH端口,如何有一个幂等的Ansible剧本?

时间:2016-01-31 01:24:08

标签: ssh ansible

我的手册需要更改ssh端口并更新防火墙规则。 (不幸的是,我不能直接使用所需的自定义端口获得"新服务器。)

管理变更during the execution is easy

但我不知道如何拥有幂等剧本。

  • 必须在默认端口(22)上启动第一次运行。
  • 必须在自定义端口上启动下一次运行。

可以完成solution,但会遇到性能问题。

Ansible 2.0 +还有其他可能吗?

1 个答案:

答案 0 :(得分:1)

你可以通过几种方式实现这一点。

最简单的方法可能是简单地将SSH端口配置分成单独的Playbook /角色,将SSH端口指定为22,但是您的库存通常会将SSH端口定义为自定义端口。

ssh_port.yml

- hosts: all
  vars:
    ansible_ssh_port: 22
  tasks:
   - name: change the default ssh port
     lineinfile ...
     notify: restart ssh

  handlers:
     - name: restart ssh
       service: 
         name : sshd
         state: restarted

然后你只能在创建机器时运行这个剧本,然后一次又一次地重新运行你的主剧本,回避这一步的幂等性。

或者,正如评论中指出的Mikko Ohtamaa,您可以在更改端口时修改您的库存文件。这意味着您可以在端到端地运行整个事件,因为下一次运行将连接非默认SSH端口,然后简单地(毫无意义地)检查SSH端口是否仍然设置为所需的端口。您可以使用"magic variable" inventory_file获取广告资源文件。一个粗略的例子可能如下所示:

- name: change the default ssh port
  lineinfile ...
  notify: restart ssh

- name: change ssh port used by ansible
  set_fact:
    ansible_ssh_port: {{ custom_ssh_port }}

- name: change ssh port in inventory
  lineinfile:
    dest: inventory_file
    insert_after: '[all:vars]'
    line: 'ansible_ssh_port="{{ custom_ssh_port }}"'

只需确保您在广告资源文件中有all O(n),这意味着针对此广告资源的任何Playbook的所有未来版本都将连接到您自定义内容中包含的所有主机SSH端口。

如果您使用源代码管理,那么您还需要一个local_action任务将更改推送回您的遥控器。