ansible:检查某些文件中是否有几行,如果没有则添加它们

ansible: check whether few lines are in some file and add them if not

更新问题:

我正在尝试使用 ansible 验证某些函数是否出现在 .basrch 文件中。

我试过 lineinfile 模块:

  vars:
    bashrc:
      - name: my_func
        lines:
        - "my_func() {"
        - "echo name=username\n}"
  tasks:
    - name: add my_func() to .bashrc
      lineinfile: "dest=~/.bashrc regexp=\"{{ item.1 }}\" line=\"{{ item.1 }}\""
      with_subelements:
      - bashrc
      - lines

但问题是每次我 运行 玩这个游戏时,它都会附加这些行:

...
my_func() {
echo name=username
}
my_func() {
echo name=username
}
EOF

如果这些行已经存在,我不想追加它们

Ansible 有一个专门用于此目的的模块,它被称为... lineinfile.

您将在此处找到文档:Ansible - lineinfile

对于多行 replace 模块是另一种选择:Ansible - replace

$ cat myfile
this is my file
aaa
bb
c
foo bar baz
---

任务:

- hosts: all
  tasks:
    - name: replace something
      replace:
        dest=/home/vagrant/myfile
        regexp="^aaa\nbb\nc"
        replace="replaced some text"

剧本运行之后:

$ cat myfile 
this is my file
replaced some text
foo bar baz
---

我从来没有用过这个,但你可能想试试 blockinfilehttps://github.com/yaegashi/ansible-role-blockinfile

编辑:

这很好用:

- hosts: all
  sudo: false
  tasks:
    - name: ensure my_func
      lineinfile:
        dest="~/.bashrc"
        line="my_func() { echo name=username; }"
        state=present

sudo: false 部分非常重要。如果您使用 sudo 执行任务,波浪号 (~) 会扩展到 sudo_user(root)主目录,否则它会扩展到您通过 SSH 登录的用户 (remote_user)

如果您必须为多个用户执行此操作,请尝试以下操作:

- hosts: all
  sudo: true
  tasks:
    - name: ensure my_func
      lineinfile:
        dest="/home/{{ item }}/.bashrc"
        line="my_func() { echo name=username; }"
        state=present
        owner={{ item }}
        mode=0644
      with_items:
        - user1
        - user2