我正在尝试编写一本干净地编辑/ etc / ssh / sshd_config的剧本,使其具有PasswordAuthentication no
和PermitRootLogin no
。
我可以想到一些有问题的方法。
首先,我可以使用lineinfile删除所有与PasswordAuthentication|PermitRootLogin
匹配的行,然后追加我想要的两个新行,但是i)这可能会在原子上失败并且ii)在末尾追加行可以将它们混合带有“匹配”块,通常可以显示在末尾。
我也可以使用lineinfile用^(# *)?PasswordAuthentication
用PasswordAuthentication no
替换所有匹配PasswordAuthentication no
的行,但是如果不存在匹配的行,则行不通。另外,如果有多条匹配的行,我将有重复的npm run dev
行。
我可以为整个文件使用模板,但这意味着我需要指定所有内容,包括HostKey,但我不想指定所有内容,并且希望保留其他选项的设置方式。
由于列出的问题,上述方法均不能令人满意。有没有一种干净的方法可以可靠地进行所需的更改,具有幂等性,并且如果系统中途失败,也不会使系统处于不良状态?
答案 0 :(得分:1)
我认为您可以使用U
并像这样使用lineinfile
和state=absent
:
state=present
对于- name: deactivate PermitRootLogin
lineinfile:
path: "/etc/ssh/sshd_config"
line: "PermitRootLogin no"
state: present
notify:
- restart sshd
- name: ensure PermitRootLogin is not activated
lineinfile:
path: "/etc/ssh/sshd_config"
line: "PermitRootLogin yes"
state: absent
notify:
- restart sshd
,同样适用。
答案 1 :(得分:1)
此解决方案仅需要一项任务,而无需其他文件:
- name: Configure sshd
lineinfile:
path: "/etc/ssh/sshd_config"
regex: "^(#)?{{item.key}}"
line: "{{item.key}} {{item.value}}"
state: present
loop:
- { key: "PermitRootLogin", value: "no" }
- { key: "PasswordAuthentication", value: "no" }
notify:
- restart sshd
答案 2 :(得分:0)
如果不是 template 选项,则应使用 lineinfile 。解决细节:
..追加我想要的两行,但是我)这可能会在非原子上失败...
如果未能完成,请修复并重复播放。
...如果有多行匹配,我将没有重复的PasswordAuthentication行。
验证配置,如果配置无法完成修复,然后重复播放。
validate: "{{ sshd_path }} -t -f %s"
以上方法都不令人满意...
这种期望是不现实的。这两个问题(任意故障,匹配行)都描述了模块不一定必须解决的错误状态。 lineinfile 完全符合目的。例如,请参见sshd.yml。
答案 3 :(得分:0)
我可以将每行匹配^(#*)?PasswordAuthentication替换为PasswordAuthentication no,也可以使用lineinfile,但是如果不存在匹配的行,则行不通。另外,如果有多条匹配的行,我将有重复的PasswordAuthentication行。
您只是没有获得/测试lineinfile
的工作方式,因为这正是您要寻找的解决方案。在您的特定情况下,如果没有反向引用,该模块将:
insertbefore
或insertafter
请参见以下示例:
具有多个匹配行的初始test.config
:
# PasswordAuthentication no
# PermitRootLogin no
somevalue no
# PasswordAuthentication no
# PermitRootLogin no
othervalue yes
# PasswordAuthentication no
# PermitRootLogin no
和test2.config
无匹配项
value none
othervalue no
yetanother yes
测试手册:
---
- name: Line in file test
hosts: localhost
gather_facts: false
tasks:
- name: test replace
lineinfile:
path: "{{ item }}"
regex: ^(# *)?PasswordAuthentication
line: PasswordAuthentication no
loop:
- /path/to/test.config
- /path/to/test2.config
运行剧本会在第一次运行时更改文件,并在随后的运行中报告正常(不再进行任何更改)。这是模块修改过的文件。
test.config
:
# PasswordAuthentication no
# PermitRootLogin no
somevalue no
# PasswordAuthentication no
# PermitRootLogin no
othervalue yes
PasswordAuthentication no
# PermitRootLogin no
和test2.config
value none
othervalue no
yetanother yes
PasswordAuthentication no