Ansible:在 sshd_config 中添加用户

Omi*_*uin 6 sshd ansible

一名新员工加入,我需要允许他访问测试服务器。通常我使用模板并根据环境类型将此模板上传到服务器上。但这次我想使用不同的方法:我只想在且仅当用户不可用时才在sshd_config末尾添加此新用户。AllowUsers

尝试过lineinfile模块但到目前为止没有成功。

Vla*_*tka 5

使用过滤器community.general.jc解析/etc/ssh/sshd_config

声明变量

  sshd_conf: "{{ sshd_out.stdout|community.general.jc('sshd_conf') }}"
Run Code Online (Sandbox Code Playgroud)

并读取文件

    - command: cat /etc/ssh/sshd_config
      register: sshd_out
Run Code Online (Sandbox Code Playgroud)

获取已配置的AllowUsers列表

  sshd_allow_users: "{{ sshd_conf.allowusers|d('')|split }}"
Run Code Online (Sandbox Code Playgroud)

您还可以使用其他模块来读取文件(slurp、fetch,...)。要使用过滤器,您必须在控制器上安装jc 。如果您不能或不想安装它,请自行解析配置。使用命令

    - command: sshd -T
      register: sshd_out
Run Code Online (Sandbox Code Playgroud)

并声明变量

  sshd_allow_users: "{{ sshd_out.stdout_lines|
                        select('match', 'allowusers')|
                        map('split')|map('last') }}"
Run Code Online (Sandbox Code Playgroud)

声明要添加的用户列表并连接列表

  sshd_allow_users_add: [alice, bob]
  sshd_conf_update:
    AllowUsers: "{{ (sshd_allow_users + sshd_allow_users_add)|flatten|unique|sort }}"
Run Code Online (Sandbox Code Playgroud)

例如,给定文件

shell> grep AllowUsers /etc/ssh/sshd_config
AllowUsers cloe
Run Code Online (Sandbox Code Playgroud)

更新它

    - lineinfile:
        path: /etc/ssh/sshd_config
        firstmatch: true
        regexp: '^\s*{{ item.key }}\s+(.*)$'
        line: "{{ item.key }} {{ item.value|join(' ') }}"
        validate: sshd -t -f %s
      loop: "{{ sshd_conf_update|dict2items }}"
Run Code Online (Sandbox Code Playgroud)

给出--chech --diff模式

TASK [lineinfile] ********************************************************************
--- before: /etc/ssh/sshd_config (content)
+++ after: /etc/ssh/sshd_config (content)
@@ -127,4 +127,4 @@
 #  AllowTcpForwarding no
 #  PermitTTY no
 #  ForceCommand cvs server
-AllowUsers cloe
+AllowUsers alice bob cloe

changed: [localhost] => (item={'key': 'AllowUsers', 'value': ['alice', 'bob', 'cloe']})
Run Code Online (Sandbox Code Playgroud)

用于测试的完整剧本示例

- hosts: all
  become: true

  vars:

    sshd_allow_users_add: [alice, bob]
    sshd_conf_update:
      AllowUsers: "{{ (sshd_allow_users + sshd_allow_users_add)|flatten|unique|sort }}"

    sshd_conf: "{{ sshd_out.stdout|community.general.jc('sshd_conf') }}"
    sshd_allow_users: "{{ sshd_conf.allowusers|d('')|split }}"

  tasks:

    - command: cat /etc/ssh/sshd_config
      register: sshd_out
      check_mode: false
      changed_when: false

    - debug:
        msg: |
          sshd_conf:
           {{ sshd_conf|to_yaml|indent(2) }}
          sshd_allow_users_add: {{ sshd_allow_users_add }}
          sshd_conf_update:
            {{ sshd_conf_update|to_yaml|indent(2) }}
      when: debug|d(false)|bool
 
    - lineinfile:
        path: /etc/ssh/sshd_config
        firstmatch: true
        regexp: '^\s*{{ item.key }}\s+(.*)$'
        line: "{{ item.key }} {{ item.value|join(' ') }}"
        validate: sshd -t -f %s
      loop: "{{ sshd_conf_update|dict2items }}"
Run Code Online (Sandbox Code Playgroud)

问:没有名为“split”的过滤器

答:过滤器拆分自 2.11 起可用。如果此过滤器不可用,请在第一种情况下使用split()方法

  sshd_allow_users: "{{ (sshd_conf.allowusers|d('')).split() }}"
Run Code Online (Sandbox Code Playgroud)

并在第二种情况下使用过滤器regex_replace

  sshd_allow_users: "{{ sshd_out.stdout_lines|
                        select('match', 'allowusers')|
                        map('regex_replace', '^(.*) (.*)$', '\\2') }}"
Run Code Online (Sandbox Code Playgroud)