链接任务取决于内容

时间:2019-02-12 12:27:38

标签: regex ansible

我有3个任务。

第一个任务检查文件是否包含<ip> <hostname>模式

如果找不到字符串,第二个任务会添加一行。

第三个任务可以纠正该行是否有问题。

这3个任务可以独立很好地运行,但是我想以某种方式将它们一起运行。

我有以下剧本用作/ etc / hosts模型。

---
- name: check hosts playbook
  hosts: centos

  tasks:

  - name: check whether a line in the form of '<ip> <hostname>' exists
    lineinfile:
      path: /var/tmp/hosts
      regexp: '^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\s\w+'
      state: absent
    check_mode: true
    register: line_exists

  - name: append_host_file 
    lineinfile:
      path: /var/tmp/hosts
      insertafter: '^(127\.0\.0\.1|)(?:\d{1,3}\.){3}\d{1,3}'
      line: '{{ ansible_default_ipv4.address }} {{ansible_hostname }}'
      backup: yes
    when: not line_exists.changed

  - name: correct_hosts_file
    lineinfile:
     path: /var/tmp/hosts
     regexp: '^(?!{{ ansible_default_ipv4.address }}\s{{ ansible_hostname }})(?:\d{1,3}\.){3}\d{1,3}\s\w+'
     line: '{{ ansible_default_ipv4.address }} {{ansible_hostname }}'
    when: line_exists.changed

我遇到的问题是,当行正确时,正确的任务正在运行..因此,我需要使用其他某种标准来防止文件中的行正确时运行它...如果该行在该文件是错误的,因为它替换了它,所以可以工作。

1 个答案:

答案 0 :(得分:0)

这是lineinfile的常见问题,它看起来并不实用。

我的建议:将文件内容加载到变量(- command: cat /etc/hosts)中,对其进行注册(register: old_hosts),然后遍历模板中该变量的每一行。

- name: get hosts
  command: cat /etc/hosts
  register: old_hosts
- name: write hosts
  template:
  src: hosts.j2
  dest: /etc/hosts

hosts.j2:

{% for line in old_hosts.stdout_lines %}
{% if line (....) %}
  ... 
{% endif %}
{% endfor %}