我正在尝试自动化配置条目修改。我的 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 风格的方法可以做到这一点吗?
一种快速且廉价的方法可能如下:
首先,有必要收集有关远程节点的事实。即使这不是最好的方法,也可以通过一个最小的例子来完成
---
- 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)