一名新员工加入,我需要允许他访问测试服务器。通常我使用模板并根据环境类型将此模板上传到服务器上。但这次我想使用不同的方法:我只想在且仅当用户不可用时才在sshd_config
末尾添加此新用户。AllowUsers
尝试过lineinfile
模块但到目前为止没有成功。
使用过滤器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)
归档时间: |
|
查看次数: |
1636 次 |
最近记录: |