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