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

时间:2015-01-27 11:28:50

标签: ansible

更新问题:

我正在尝试使用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

如果已经存在

,我不希望这些行被追加

1 个答案:

答案 0 :(得分:3)

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(根)主目录,否则会扩展为您作为(remote_user

进行SSH连接的用户

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

- 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