Yeah so vars_prompt is local to a specific play (remember here you can have 
multiple plays in a playbook).

I'm wondering if you could, or would want to pass the prompted values to 
your jenkinsfetch role though?

I use set_fact to set facts which aren't just true for the current host in 
some cases.

Interested to hear what others do though.

Jon

On Wednesday, May 20, 2015 at 1:41:00 PM UTC+1, Mike Herron wrote:
>
> I've been using Ansible for a few years, mostly for server provisioning 
> and configuration management. I think it's a fantastic tool. For a new 
> project, I've also begun to attempt to use Ansible as a web application 
> deployment tool where I would have previously used ant. However, there are 
> a couple of snags that have me questioning whether the Ansible model is the 
> best fit for this type of task.
>
> For example, the first thing I want to is download the deployment artefact 
> from Jenkins. This is only available internally, so my plan was to download 
> locally and then upload to the production servers. I quickly realised that 
> this was totally different to anything I'd done before as I was trying to 
> perform a task that wasn't really associated with any remote hosts. After a 
> bit of searching, I found this:
>
> - hosts: 127.0.0.1
>   connection: local
>
> Which works perfectly well, and could have been designed for exactly this 
> type of task, but it feels a bit like trying to fit a round peg in to a 
> square hole. I understand that since all modules assume that they are 
> executing within the context of a host, there is really no other way it 
> could be, but it got me thinking if Ansible is a good place to write these 
> type of non-host specific, pre-deployment steps?
>
> The next challenge then was to have the play book prompt the user for the 
> job and build to deploy. var_prompt seemed perfect for this, so I ended up 
> with a playbook like so:
>
> - hosts: 127.0.0.1
>   connection: local
>   vars_prompt:
>    jenkins_job: "Job Name"
>    jenkins_build: "Build Number"
>   roles:
>    - jenkinsfetch
>    
> - hosts: dashboards
>   roles:
>    - { role: uploadapp, app_name: 'dashboard' }
>
> Which seemed to work well until I tried to reference jenkins_job and 
> jenkins_build from within the uploadapp role and couldn't:
>
> TASK: [uploadapp | upload build tar] 
> ***************************************
> fatal: [local.dev] => One or more undefined variables: 'jenkins_job' is 
> undefined
>
> FATAL: all hosts have already failed -- aborting
>
> I spent a bit of time trying to figure out how to make these variables 
> visible across the plays but couldn't. I tried set_fact, which didn't work 
> as it's host specific. I tried to include both roles within the same play 
> but couldn't (obviously as I don't want to run uploadapp on 127.0.0.1) and 
> finally just resolved to put the variables as part of a global var file 
> rather than prompt for them. I can workaround this works, but it feels to 
> me like I'm trying to make Ansible do something it really doesn't want to.
>
> The variable problem also came up when I wanted to abbreviate some paths 
> within my jenkinsfetch role:
>
> ---
> - name: create builds dir
>   file: >
>    path=/tmp/builds/{{jenkins_job}}
>    state=directory
>    
> - name: fetch build from jenkins
>   get_url: >
>   
>  
> url={{jenkins_url}}/job/{{jenkins_job}}/{{jenkins_build}}/artifact/build/output/{{jenkins_job}}_{{jenkins_build}}.tar.gz
>    dest=/tmp/builds/{{jenkins_job}}
>
> So rather than reference /tmp/builds/{{jenkins_job}} twice, I wanted to 
> redefine a new variable, something along the lines of:
>
> ---
> - name: set build dir
>   var: >
>    name=build_dir 
>    value=/tmp/builds/{{jenkins_job}}
> - name: create builds dir
>   file: >
>    path=/tmp/builds/{{jenkins_job}}
>    state=directory
>
> In this case, set_fact may happen to work, but I'm not setting a fact 
> about a host, I'm just wanting to define a new variable (and have that 
> visible across the rest of the plays).
>
> So I will carry on, but given these small snags, I'm curious if anyone 
> else has had the same experience - that when trying to implement a set of 
> deployment steps in Ansible, it sometimes feels like trying to force the 
> tool to do something it wasn't designed for?  
>
> Thanks
>

-- 
You received this message because you are subscribed to the Google Groups 
"Ansible Project" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/ansible-project/7b304455-9880-4945-bff0-dea86d3ff122%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to