Ansible:当条目不存在时附加到配置行

问题描述 投票:0回答:1

我正在尝试自动化配置条目修改。我的 AIX 服务器有一个文件 login.cfg,并且有一行配置了可用的 shell。是这样的:

usw:
        shells = /bin/sh,/bin/bsh,/bin/csh,/bin/ksh,/bin/tsh,/bin/ksh93,/usr/bin/sh,/usr/bin/bsh,/usr/bin/csh,/usr/bin/ksh,/usr/bin/tsh,/usr/bin/ksh93,/usr/bin/rksh,/usr/bin/rksh93,/usr/sbin/uucp/uucico,/usr/sbin/snappd,/usr/sbin/sliplogin

        maxlogins = 32767
        logintimeout = 60

我的目标是将 ,/usr/bin/bash 附加到 shells 行的末尾(当它尚不存在时)。由于某种原因,主机之间的 shell 顺序并不统一。

我尝试实现此修改就像下面的代码片段 - 出于测试目的,我只是在本地编辑 login.cfg 。它有两个步骤:首先测试 bash 是否已经存在,然后编辑该行(如果不存在)。

---
- name: test adding /bin/bash to the end of the line IF NOT THERE
  hosts: localhost
  tasks:
  - name: Check if bash is already there
    shell: "grep -E 'shells = .*/usr/bin/bash' {{ playbook_dir }}/login.cfg"
    ignore_errors: yes
    register: result
  - name: add entry if not there
    lineinfile:
      backrefs: yes
      line: '\g<list>,/usr/bin/bash'
      path: "{{ playbook_dir }}/login.cfg"
      regexp: "(?P<list> +shells =.*)"
    when: result.rc != 0

我的问题是是否有一种方法可以避免使用 shell: 模块进行测试。还有更多 Ansible 风格的方法可以做到这一点吗?

regex ansible
1个回答
0
投票

一种快速且廉价的方法可能如下:

首先,有必要收集有关远程节点的事实。即使这不是最好的方法,也可以通过一个最小的例子来完成

---
- hosts: localhost
  become: false
  gather_facts: false

  vars:

    FACT: "shells"
    SEARCH_STRING: "/usr/bin/bash"
    SEARCH_FILE: "login.cfg"

  tasks:

  # grep string from Remote File

  - name: Gathering Custom Facts
    shell:
      cmd: "grep {{ FACT }} {{ SEARCH_FILE }} | tr -d ' ' | cut -d '=' -f 2"
    register: shells
    # Since this is a reporting, gathering facts task
    # it needs to deliver a result in any case
    failed_when: shells.rc != 0 and shells.rc != 1
    check_mode: false
    changed_when: false

  - name: Show available remote shells
    debug:
      msg: "{{ shells.stdout }}"
    when: ansible_check_mode

产生

的输出
TASK [Show available remote shells] *********************************************************************************************************************************
ok: [localhost] =>
  msg: /bin/sh,/bin/bsh,/bin/csh,/bin/ksh,/bin/tsh,/bin/ksh93,/usr/bin/sh,/usr/bin/bsh,/usr/bin/csh,/usr/bin/ksh,/usr/bin/tsh,/usr/bin/ksh93,/usr/bin/rksh,/usr/bin/rksh93,/usr/sbin/uucp/uucico,/usr/sbin/snappd,/usr/sbin/sliplogin

更好的方法如下所示:如何使用 Ansible 在远程文件中搜索字符串? 或者直接使用 自定义事实

其次,如果尚未包含条目,则追加条目

  - name: Append entry if it is not contained already
    lineinfile:
      path: "{{ SEARCH_FILE }}"
      regexp: ".*{{ FACT }} =.*"
      line: "        shells = {{ shells.stdout }},{{ SEARCH_STRING }}"
    when: not shells.stdout is search(SEARCH_STRING)
© www.soinside.com 2019 - 2024. All rights reserved.