【发布时间】:2015-08-20 19:40:40
【问题描述】:
如何让 Ansible 用我的文件更改更新第 9 行之后的所有行,而保留前面的行?
我正在使用 Ansible 使我的服务器上的文件保持统一。我已经整理了一个方便的文件,我可以将其部署到服务器上以快速设置我的设置和配置。该文件被多个用户使用,每个用户在文件中都有自己独特的信息。
目前,我将我的文件副本分发给所有人。然后我使用 lineinfile 任务将我的信息替换为用户特定的信息。然而,这意味着我不仅要在文件中而且还要在我的剧本中维护用户特定信息,这已经引起了一些麻烦。
此外,如果有办法不覆盖用户特定信息,那么我可以创建一个 bash 函数,允许我指定要更新的用户。
这是我目前的剧本:
---
- hosts: dmz
vars:
curUser: "{{ ansible_ssh_user }}"
allUsers:
- { name: johnDoe, gecos: "John D, XXXX S Sad Ln" }
- { name: janeFrank, gecos: "Jane F, XXXX W Happy Dr" }
tasks:
## =============== Updates the user's /foo/bar/user/FILE with the /foo/bar/FILE
- name: distribute_File
sudo: yes
template: src=/home/{{ curUser }}/FILE dest=/home/{{ item.name }}/FILE owner={{ item.name }} backup=yes
with_items: allUsers
ignore_errors: true
## ===================================== Update user specific information
- name: updateName
sudo: yes
lineinfile: dest=/home/{{ item.name }}/FILE regexp="^username=" line="username={{ item.name }}"
with_items: allUsers
- name: updateGecos
sudo: yes
lineinfile: dest=/home/{{ item.name }}/FILE regexp="^usergecos=" line="usergecos=\"{{ item.gecos }}\""
with_items: allUsers
【问题讨论】:
-
你能在这个文件中有标记(cmets)吗?然后应该可以用
lineinfile写出你的基本模板。我还没有尝试过,但是 Galaxy 上有一个blockinfile模块:galaxy.ansible.com/list#/roles/1475 - 如果你写多行,它会加快你的游戏速度。 -
您能否向我们提供更多关于您实际想要实现的目标的信息?该文件是什么,您希望它成为什么的示例是什么?可能有更简单的方法。
-
@udondan 是的,我可以将 cmets 放入任一文件中。尽管 blockinfile 看起来像是在搜索字符串并替换它。我实际上正在寻找相反的功能。我想找到一个字符串并在更改其他所有内容时保留它。
-
@AntonisChristofides 这是一个帐户设置文件,其中包含用于快速准确地创建帐户的大量脚本和信息。每个用户都有各种独特的帐户信息,需要在更新期间保留这些信息。该文件的其余部分是通用的,适用于所有用户。这有助于解释这种情况吗?
-
所以前 9 行包含用户特定的配置,而其余行总是包含相同的信息?最好将此文件分成两部分 - 前 9 行是一个用户特定的配置文件,其余的将是所有人通用的文件。这就像将程序与其配置分开一样。
标签: templates yaml ansible ansible-playbook line-numbers