新しい従業員が参加し、テストサーバーへのアクセスを許可する必要があります。通常、私はテンプレートを使用し、環境の種類に応じてこのテンプレートをサーバーにアップロードします。しかし、今回は別のアプローチを使用したいと思います。ユーザーが利用できない場合にのみ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') }}"
答え2
正直そうな感じです。XYの問題- 問題に対する特定の解決策を実装する方法を尋ねましたが、その解決策は...せいぜい次善策です。
開梱してみましょう。テストサーバーに接続する権限を持つ新しい従業員がSSHを介して接続できることを確認したいので、ファイルにAllowUsers
リストを保持してこれを実行しようとしていますsshd_config
。これを行うと、Ansibleを使用して任意の設定ファイルを変更するのが難しくなり、lineinfile
問題が発生する可能性があるという問題に直面します。
この特定の方法をどれだけ好むかに応じて、いくつかの可能なオプションがあります。
1つは、Sotto Voceがすでに指摘したように、ファイルにユーザーを明示的に割り当てるのではなく、システムレベルのグループを作成し、そのユーザーをモジュールのansibleを介して一般的な方法でグループsshd_config
に追加し、次のようなものがあるかどうかを確認することですです。グループ。ssh_allowed
ansible.builtin.user
sshd_config
AllowGroup ssh_allowed
2つの最新バージョンのsshdがこのInclude
説明をサポートしています。あなたの場合は手動で確認する必要があるかもしれません。それからもっと簡単な解決策があります。
まず行を追加してください。
Include /etc/ssh/sshd_config.d/*.conf
基本sshd_config
構成ファイルの場合は、組み込みテンプレートから生成できるファイルを生成します。/etc/ssh/sshd_config.d/01-authusers.conf
これは、残りのサーバーレベルの sshd 構成とは完全に独立しているためです。
答え3
(もともとコメントでしたが答えに移しました)
AllowGroups
同様の操作を実行すると、ファイルの1行に静的グループリストを使用sshd_config
し、一般的なUnix / Linuxグループメンバーシップを介してアクセスを管理しました。グループメンバーシップを管理するためのAnsible(または他の構成管理スイート)のツールは、sshd_configファイルの中間を編集するよりもはるかに簡単です。ユーザー名と一致する基本グループを持つユーザーを作成する一般的な慣行によれば、次のことをAllowGroups
許可できます。個人ユーザーはもちろん、グループも同様です。
AllowGroups
/は、AllowUsers
ほとんどの人が期待していない方法で動作します。 / lineAllowGroups
にグループ/ユーザーがいる場合AllowUsers
回線ではグループ/ユーザーのみ許可SSH経由でログインしてください。 他のすべてのグループ/ユーザーは拒否されます。 IMOに名前を付けAllowOnlyTheseGroups
て、AllowOnlyTheseUsers
その仕組みをより正確に説明します。
AllowGroups
複数行またはファイルの行を構成しようとするときはAllowUsers
注意してくださいsshd_config
。これら2つのパラメータは、他のほとんどのSSH設定パラメータと似ています。つまり、構成ファイルに表示される最初のパラメーターが優先されます。 2回目、3回目などの発生は無視されます。に登場してもInclude
。