Ansible:sshd_configにユーザーを追加する

Ansible:sshd_configにユーザーを追加する

新しい従業員が参加し、テストサーバーへのアクセスを許可する必要があります。通常、私はテンプレートを使用し、環境の種類に応じてこのテンプレートをサーバーにアップロードします。しかし、今回は別のアプローチを使用したいと思います。ユーザーが利用できない場合にのみsshd_config新しいユーザーを追加したいと思います。AllowUsers

モジュールを試しましたが、lineinfileこれまで成功しませんでした。

ベストアンサー1

フィルタの使用コミュニティ、一般.jc分析する/etc/ssh/sshd_config

変数宣言

  sshd_conf: "{{ sshd_out.stdout|community.general.jc('sshd_conf') }}"

そしてファイルを読む

    - command: cat /etc/ssh/sshd_config
      register: sshd_out

構成済みリストのインポートユーザーを許可

  sshd_allow_users: "{{ sshd_conf.allowusers|d('')|split }}"

他のモジュールを使用してファイルを読み取ることもできます(slurp、fetchなど)。フィルタを使用するにはインストールする必要があります。提示コントローラから。インストールできない場合やインストールしたくない場合は、設定を自分で解決してください。コマンドの使用

    - command: sshd -T
      register: sshd_out

そして変数宣言

  sshd_allow_users: "{{ sshd_out.stdout_lines|
                        select('match', 'allowusers')|
                        map('split')|map('last') }}"

リストを追加して接続するユーザーのリストを宣言します。

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

たとえば、与えられたファイル

shell> grep AllowUsers /etc/ssh/sshd_config
AllowUsers cloe

更新

    - 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 }}"

譲歩--OK--違いモデル

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']})

テストのための完全なプレイブックの例

- 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 }}"

尋ねる:「分割」というフィルタはありません。

答え:フィルタ分ける2.11から利用可能です。このフィルタが利用できない場合は、この方法を使用してください。分かれる()最初のケース

  sshd_allow_users: "{{ (sshd_conf.allowusers|d('')).split() }}"

そしてフィルターを使う正規表現_交換2番目のケース

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

おすすめ記事