Creating missing file for blockinfile edit

915 views
Skip to first unread message

Daniel Delin

unread,
Oct 19, 2016, 11:08:23 AM10/19/16
to Ansible Project
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



Kai Stian Olstad

unread,
Oct 19, 2016, 1:17:51 PM10/19/16
to ansible...@googlegroups.com
On 19. okt. 2016 12:33, Daniel Delin wrote:
> 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

--
Kai Stian Olstad

Daniel Delin

unread,
Oct 20, 2016, 1:00:46 PM10/20/16
to Ansible Project
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.
Reply all
Reply to author
Forward
0 new messages