Need help about Ansible block syntax

64 views
Skip to first unread message

JiElPe-Fr38

unread,
Jan 31, 2018, 10:29:00 AM1/31/18
to Ansible Project
Dear all,

I am quite new to Ansible and try to "make a tour"...
I am using ansible 2.4.2.0 with cygwin64 on Win7.


I am currently make a personal training and find that I could use a block to "enclose" (ok, perhaps wrong term) a couple of task that have some common "properties" (like become_user: root ...).
The idea is to change this :

---
- name: Update Red Hat machine
  yum:
    update_cache: yes
    name: '*'
    state: latest
  when: ansible_pkg_mgr == 'yum'
  become: true
  become_user: root
  ignore_errors: yes
  notify: "restart {{ ansible_os_family }} host"

- name: Install RedHat tools
  yum:
    name: "{{ item }}"
    state: present
  with_items: "{{ toolList }}"
  when: ansible_pkg_mgr == 'yum'
  become: true
  become_user: root
  ignore_errors: yes
  notify: "restart {{ ansible_os_family }} host"



into a block based syntax so that I can factorize the become / notify and when statement.
II have made several trials without any success.
Playing the file below :
---
-block:
  - name: Update Red Hat machine
    yum:
      update_cache: yes
      name: '*'
      state: latest

  - name: Install RedHat tools
    yum:
      name: "{{ item }}"
      state: present
      with_items: "{{ toolList }}"

  when: ansible_pkg_mgr == 'yum'
  become: true
  become_user: root
  ignore_errors: yes
  notify: "restart {{ ansible_os_family }} host"

I get this error :
fatal: [ci-server]: FAILED! => {"reason": "Syntax Error while loading YAML.\n\n\nThe error appears to have been in '/home/jeanlupi/centos_test/myKnowledge/devOps/playbook/roles/devTools/tasks/RedHat.yml': line 16, column 3, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n  when: ansible_pkg_mgr == 'yum'\n  ^ here\n\nexception type: <class 'yaml.parser.ParserError'>\nexception: while parsing a block collection\n  in \"<unicode string>\", line 3, column 3:\n      - name: Update Red Hat machine\n      ^\nexpected <block end>, but found '?'\n  in \"<unicode string>\", line 16, column 3:\n      when: ansible_pkg_mgr == 'yum'\n      ^"}



If someone could help I would be very glad !

Thanks !
JiElPe

ZillaYT

unread,
Jan 31, 2018, 11:48:58 AM1/31/18
to Ansible Project
block does not support ALL the features of a simple task so this may be your issue. For example, it may not support notify, but you'll need to look at this.

Malcolm Hussain-Gambles

unread,
Jan 31, 2018, 5:29:47 PM1/31/18
to Ansible Project
Notify should go after each of the tasks.
You could set a fact in the block then check that and notify afterwards though

JiElPe-Fr38

unread,
Feb 1, 2018, 5:32:36 AM2/1/18
to Ansible Project
Thanks all for your help.
I have been really bored with the block... but I finally succeed. The ansible / yaml syntax is not always straightforward to understand (or I lack some skills).

I went back to the ansible block documentation, and make a trial replacing my main.yml file with the example on the page, i.e.  :
cat roles/devTools/tasks/main.yml
tasks
:
 
- name: Install Apache
    block
:
     
- yum: name={{ item }} state=installed
        with_items
:
         
- httpd
         
- memcached
     
- template: src=templates/src.j2 dest=/etc/foo.conf
     
- service: name=bar state=started enabled=True
   
when: ansible_distribution == 'CentOS'
    become
: true
    become_user
: root

And I still get an error saying that the role must contain a list of task :
ERROR! The tasks/main.yml file for role 'devTools' must contain a list of tasks

The error appears to have been in '/home/jeanlupi/centos_test/myKnowledge/devOps/playbook/roles/devTools/tasks/main.yml': line 1, column 1, but may
be elsewhere
in the file depending on the exact syntax problem.

The offending line appears to be:



tasks
:
^ here

Ok... I removed "tasks" (don't clearly understand why it must not be there...) and the problem disappeared.
After several other syntax errors (probably not totally sticked to block), I succeeded with :

cat roles/devTools/tasks/RedHat.yml
 
- name: Update Red Hat machine
    block
:
     
- yum: update_cache=yes name="*" state=latest
        notify
: "restart {{ ansible_os_family }} host"
     
- yum: name="{{item}}" state=present
        with_items
: "{{ toolList }}"
        notify: "restart {{ ansible_os_family }} host"
   
when: ansible_pkg_mgr == 'yum'
    become
: true
    become_user
: root



As mentioned in the answers, notify must not be set at block level, but after each enclosed task.

Thanks for your help.
Have a nice day.
JiElPe

Brian Coca

unread,
Feb 19, 2018, 4:20:02 PM2/19/18
to Ansible Project
'tasks' is a property of a play, it should ONLY appear at the play level





--
----------
Brian Coca
Reply all
Reply to author
Forward
0 new messages