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
---
我从来没有用过这个,但你可能想试试 blockinfile
:https://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
更新问题:
我正在尝试使用 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
---
我从来没有用过这个,但你可能想试试 blockinfile
:https://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