Creating missing file for blockinfile edit

Hi,

New to Ansible, evaluating it for replacing Cfengine.
One feature we use frequently is the replacement of a block of text within a file, and the Ansible blockinfile module looks to be just that.

However I run in to problems adding a block of text to a file if it does not already exist. I have tried with this code:

  • name: Add mappings to /tmp/hosts
    blockinfile:
    dest: /tmp/hosts
    state: present
    create: yes
    block: |
    destination logserver1 { tcp(“xx.xx.xx.xx” port(514)); };
    destination logserver2 { tcp(“xx.xx.x.x” port(514)); };
    log { source(src); destination(logserver1); };
    log { source(src); destination(logserver2); };
    log { source(src); destination(logserver3); };
    destination logserver3 { tcp(“x.x.xx.xxx” port(5000)); };
    marker: "# {mark} ANSIBLE HOSTS BLOCK "

When I run this it bails out because of the create: yes line, if I comment that out it runs through, but of course does not create the file, and therefore fails the blockedit. If I create an empty file manually it works as intended. According to the docs, both state and create are supported by the blockinfile module.

Ansible version is 2.1.2.0

Help appreciated


I tested you code on my 2.1.2 and it works.

$ ls /tmp/hosts
ls: cannot access '/tmp/hosts': No such file or directory

$ ansible-playbook test.yml

PLAY [localhost] ******************************************************

TASK [Add mappings to /tmp/hosts] *************************************
changed: [localhost]

PLAY RECAP ************************************************************
localhost : ok=1 changed=1 unreachable=0 failed=0

$ ls /tmp/hosts
/tmp/hosts

Thanks, think I found my rookie mistake, I have used the --check flag liberally when testing the playbooks, but that of course causes problems in this case since it does not create the file because of that, and then the rest of the playbook fails.