使用行号的Ansible更新文件

时间:2015-06-05 18:38:51

标签: templates yaml ansible ansible-playbook line-numbers

如何让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

1 个答案:

答案 0 :(得分:0)

所以我最终做的是: 首先通过花哨的shell和注册命令注册信息。

然后我用模板复制新文件。

最后,我使用lineinfile命令中的注册信息将特定行替换为注册信息。

它并不像我希望的那样优雅或简单,但它起作用。感谢Antonis和udondan的想法,他们帮助我思考整个问题。