【问题标题】:ansible when how to check is text exist当如何检查文本是否存在时,ansible
【发布时间】:2022-10-20 21:03:06
【问题描述】:

如何将此代码写入 ansible(yaml) 格式?

grep -i "^\s*PermitRootLogin\s* no\s*" /etc/ssh/sshd_config
if [ $? -eq "0" ]
then
 echo "[ PASSED ] - Ensure SSH root login is disabled" 
else
  echo "[ FAILED ] - Ensure SSH root login is disabled"
fi

这就是我有的,我不知道什么时候写

- name: Check permitRootLogin
  hosts: web
  tasks:
    - lineinfile:
        path: /etc/ssh/sshd_config
        state: absent
        regexp: '^\s*PermitRootLogin\s* yes\s*'
      check_mode: yes
      register: permit

    - name: Ensure SSH root
      debug: 
        msg: 
         - "[ PASSED ] - Ensure SSH root login is disabled"
      when: $regexp == 'PermitRootLogin yes'

【问题讨论】:

  • 与您的问题无关:只想提一下,由于正则表达式中的错误,您发布的代码无论如何都不起作用。
  • 你能指出错误吗
  • 您是在告诉 grep 使用简单的正则表达式,但 \s 只是一个要按字面匹配的 2 个字符的字符串。例如,如果你使用-P,你会告诉grep 使用PCRE 而不是简单的,\s 将被解释为空白。顺便说一句,正则表达式末尾的星号是多余的,而 \s* 会总是最后匹配。因此,您可以简单地删除它。最后\s* 相当于PCRE中的\s+,所以你的正则表达式可以简化为^\s*PermitRootLogin\s+no
  • 顺便说一句,如果您只对 grep 的成功感兴趣,并且不需要查看整个匹配的行,那么使用 -q 也是有意义的。

标签: bash shell ansible yaml


【解决方案1】:

Ansible 通常用于创建所需的状态。但是您可以像您已经尝试过的那样使用check_mode: yes,而不是实际写回更改,而只是模拟它。但是,为此,您必须编写一个功能齐全的任务。

- lineinfile:
    path: /etc/ssh/sshd_config
    state: present
    line: "\g<1>yes"
    regexp: '^#?(PermitRootLogins+)'
    backrefs: yes
  check_mode: yes
  register: permit_root_login_result

- debug:
    msg: "[ PASSED ] - Ensure SSH root login is disabled"
  when: permit_root_login_result is not changed

在这种情况下,您模拟将行 PermitRootLogin 更改为值 yes。如果发生此更改,则该选项之前未设置为yes

如果您想在PASSEDFAILED 之间切换输出,您的debug 任务可能如下所示:

- debug:
    msg: "[ {{ permit_root_login_result is changed | ternary('FAILED', 'PASSED') }} ] - Ensure SSH root login is disabled"

【讨论】:

    【解决方案2】:

    您始终可以通过打印出寄存器的输出来进行调试:

    - name: Print result
      debug:
        msg: "{{ permit }}"
    

    Ansible 中的每个模块都有不同的输出。
    当您获得输出/取决于您的用例时,您可以选择在您的条件下使用哪个属性:

    TASK [Print pass/fail result] *************************************************************
    ok: [localhost] => {
        "msg": {
            "backup": "",
            "changed": false,
            "diff": [
                {
                    "after": "",
                    "after_header": "/etc/ssh/sshd_config (content)",
                    "before": "",
                    "before_header": "/etc/ssh/sshd_config (content)"
                },
                {
                    "after_header": "/etc/ssh/sshd_config (file attributes)",
                    "before_header": "/etc/ssh/sshd_config (file attributes)"
                }
            ],
            "failed": false,
            "found": 0,
            "msg": ""
        }
    }
    

    在您的情况下,您想知道是否找到了 PermitRootLogin yes 行。
    所以你可以使用输出中的属性found

    - name: Ensure SSH root login is disabled
      debug: 
        msg: 
         - "[ PASSED ] - Ensure SSH root login is disabled"
      when: permit.found == 0
    
    - name: Ensure SSH root login is enabled
      debug: 
        msg: 
         - "[ PASSED ] - Ensure SSH root login is enabled"
      when: permit.found != 0
    

    【讨论】:

    • 我不明白这一行“当你得到输出时,你可以选择使用什么作为条件:”
    • @usertest5522 Ansible 中的每个模块都有不同的输出。对于 lineinfile 模块,它取决于是否找到了搜索的行。与其他答案一样,使用了 changed 属性。其他模块甚至可以在输出中有许多属性,可以在条件中使用。
    猜你喜欢
    • 1970-01-01
    • 2019-01-19
    • 2019-11-29
    • 2019-09-28
    • 2016-01-02
    • 2017-04-16
    • 2015-07-31
    • 1970-01-01
    相关资源
    最近更新 更多