Ansible:如果不存在则插入行

时间:2015-03-16 11:05:36

标签: ansible ansible-playbook

我尝试使用ansible在属性文件中插入一行。 我想添加一些属性,如果它不存在,但如果文件中已经存在这样的属性,则不要替换它。

我添加到我的ansible角色

- name: add couchbase host to properties
  lineinfile: dest=/database.properties regexp="^couchbase.host"  line="couchbase.host=127.0.0.1"

但是,如果属性值已存在于文件中,则会将属性值替换回127.0.0.1。

我做错了什么?

10 个答案:

答案 0 :(得分:23)

lineinfile模块执行的操作:它确保文件中存在line中定义的行,并且regexp标识该行。因此,无论您的设置具有什么价值,它都会被您的新line覆盖。

如果您不想覆盖该行,首先需要测试内容,然后将该条件应用于lineinfile模块。没有用于测试文件内容的模块,因此您可能需要使用grep命令运行shell并检查.stdout内容。像这样(未经测试):

- name: Test for line
  shell: grep "^couchbase.host" /database.properties
  register: test_grep

然后将条件应用于lineinfile任务:

- name: add couchbase host to properties
  lineinfile:
    dest: /database.properties
    line: couchbase.host=127.0.0.1
  when: test_grep.stdout != ""

然后可以删除regexp,因为您已经确定该行不存在,因此它永远不会匹配。

但也许你正在做的事情要回到前面。文件中的那一行来自哪里?当您使用Ansible管理系统时,应该没有其他机制干扰相同的配置文件。也许你可以通过为你的角色添加default值来解决这个问题吗?

答案 1 :(得分:5)

这是我能够让它发挥作用的唯一方法。

- name: checking for host
  shell: cat /database.properties | grep couchbase.host | wc -l
  register: test_grep

- debug: msg="{{test_grep.stdout}}"

- name: adding license server
  lineinfile: dest=/database.properties line="couchbase.host=127.0.0.1"
  when: test_grep.stdout == "0"

答案 2 :(得分:5)

这可以通过简单地使用lineinfilecheck_mode来实现:

- name: Check if couchbase.host is already defined
  lineinfile:
    state: absent
    path: "/database.properties"
    regexp: "^couchbase.host="
  check_mode: true
  changed_when: false # This just makes things look prettier in the logs
  register: check

- name: Define couchbase.host if undefined
  lineinfile:
    state: present
    path: "/database.properties"
    line: "couchbase.host=127.0.0.1"
  when: check.found == 0

答案 3 :(得分:3)

很长一段时间"试验和错误"我来到这里:

- name: check existence of line in the target file
  command: grep -Fxq "ip addr add {{ item }}/32 dev lo label lo:{{ app | default('app') }}" /etc/rc.local
  changed_when: false
  failed_when: false
  register: ip_test
  with_items:
    - "{{ list_of_ips }}"

- name: add autostart command
  lineinfile: dest=/etc/rc.local 
              line="ip addr add {{ item.item }}/32 dev lo label lo:{{ app | default('app') }}"
              insertbefore="exit 0"
              state=present
  when: item.rc == 1
  with_items:
    - "{{ ip_test.results }}"

答案 4 :(得分:1)

与此处提出的想法相同:https://stackoverflow.com/a/40890850/7231194

步骤是:

  • 尝试更换该行。
  • 如果替换mod更改它,请恢复
  • 如果替换mod未更改,请添加行

实施例

# Vars
- name: Set parameters
  set_fact:
    ipAddress    : "127.0.0.1"
    lineSearched : "couchbase.host={{ ipAddress }}"
    lineModified : "couchbase.host={{ ipAddress }} hello"

# Tasks
- name: Try to replace the line
  replace:
    dest    : /dir/file
    replace : '{{ lineModified }} '
    regexp  : '{{ lineSearched }}$'
    backup  : yes
 register  : checkIfLineIsHere

# If the line not is here, I add it
- name: Add line
  lineinfile:
  state   : present
  dest    : /dir/file
  line    : '{{ lineSearched }}'
  regexp  : ''
  insertafter: EOF
when: checkIfLineIsHere.changed == false

# If the line is here, I still want this line in the file, Then restore it
- name: Restore the searched line.
  lineinfile:
    state   : present
    dest    : /dir/file
    line    : '{{ lineSearched }}'
    regexp  : '{{ lineModified }}$'
  when: checkIfLineIsHere.changed

答案 5 :(得分:0)

好的,这是我天真的解决方案......可能不是跨平台和原生的Ansible(我刚刚开始使用这个工具并且仍在学习它),但肯定更短:

- name: Update /path/to/some/file
  shell: grep -q 'regex' /path/to/some/file && echo exists || echo 'text-to-append' >> /path/to/some/file
  register: result
  changed_when: result.stdout.find('exists') == -1

答案 6 :(得分:0)

我们尝试了以下方法,效果很好。如果不存在,我们的方案需要在syslog文件中输入“ compress”。

- name: Checking compress entry present if not add entry   
  lineinfile:
    path: /etc/logrotate.d/syslog
    regexp: "    compress"
    state: present
    insertafter: "    missingok"
    line: "    compress"

答案 7 :(得分:0)

如果您使用 backrefs ,它似乎不起作用。

以下示例未添加行

- name: add hosts file entry
  lineinfile:
    path: "/etc/hosts"
    regexp: "foohost"
    line:  "10.10.10.10 foohost"
    state: present
    backrefs: yes

删除反向引用后,我将行添加到了文件中

- name: add hosts file entry
  lineinfile:
    path: "/etc/hosts"
    regexp: "foohost"
    line:  "10.10.10.10 foohost"
    state: present

答案 8 :(得分:0)

- name: add couchbase.host to properties, works like add or replace
  lineinfile:
    path: /database.properties
    regexp: '^couchbase.host=(?!(127.0.0.1))\b'
    line: 'couchbase.host=127.0.0.1'

此代码将替换^couchbase.host=*以外的任何行couchbase.host=127.0.0.1,或者如果不存在则添加新行

答案 9 :(得分:-1)

- name: add couchbase.host to properties, works like add or replace
  lineinfile: 
    state: present
    dest: /database.properties 
    regexp: '^couchbase.host'
    line: 'couchbase.host=127.0.0.1'