From 3f58947c0507e118995e4cbec23febd075a9c757 Mon Sep 17 00:00:00 2001
From: chouseknecht
Provide a host pattern to further constrain the list of hosts that will be managed or affected by the playbook. Multiple patterns can be separated by ; : or ,
For more information and examples see the Selecting Targets section under Inventory and Patterns in the Ansible documentation.
', -dataTitle:"Limit",dataPlacement:"left"},verbosity:{label:"Verbosity",type:"select",ngOptions:"v.label for v in verbosity_options","default":0,addRequired:!0,editRequired:!0,column:2,awPopOver:"Control the level of output ansible will produce as the playbook executes.
",dataTitle:"Verbosity",dataPlacement:"left"},extra_vars:{label:"Extra Variables",type:"textarea",rows:6,"class":"span12",addRequired:!1,editRequired:!1,awPopOver:'Pass extra command line variables to the playbook. This is the -e or --extra-vars command line parameter for ansible-playbook. Provide key=value pairs or JSON.
Click here to view documentation and examples.
', +dataTitle:"Limit",dataPlacement:"left"},verbosity:{label:"Verbosity",type:"select",ngOptions:"v.label for v in verbosity_options","default":0,addRequired:!0,editRequired:!0,column:2,awPopOver:"Control the level of output ansible will produce as the playbook executes.
",dataTitle:"Verbosity",dataPlacement:"left"},variables:{label:"Extra Variables",type:"textarea",rows:6,"class":"span12",addRequired:!1,editRequired:!1,awPopOver:'Pass extra command line variables to the playbook. This is the -e or --extra-vars command line parameter for ansible-playbook. Provide key=value pairs or JSON.
Click here to view documentation and examples.
', column:2},allow_callbacks:{label:"Allow Callbacks",type:"checkbox",addRequired:!1,editRequird:!1,trueValue:"true",falseValue:"false",ngChange:"toggleCallback('host_config_key')","class":"span12",column:2,awPopOver:'Create a callback URL a host can use to contact the AWX server and request a configuration update using the job template. The URL will look like the following:
\nhttp://your.server.com:999/api/v1/job_templates/1/callback/
The request from the host must be a POST. Here is an example using curl:
\ncurl --data "host_config_key=5a8ec154832b780b9bdef1061764ae5a" http://your.server.com:999/api/v1/job_templates/1/callback/
\nNote the requesting host must be defined in your inventory. If ansible fails to locate the host either by name or IP address in one of your defined inventories, the request will be denied.
Successful requests will result in an entry on the Jobs tab, where the results and history can be viewed.
', detailPlacement:"left",dataContainer:"#jobs",dataTitle:"Callback URL"},callback_url:{label:"Callback URL",type:"text",addRequired:!1,editRequired:!1,readonly:!0,column:2,required:!1,"class":"span12",awPopOver:'Using this URL a host can contact the AWX server and request a configuration update using the job template. The request from the host must be a POST. Here is an example using curl:
\ncurl --data "host_config_key=5a8ec154832b780b9bdef1061764ae5a" http://your.server.com:999/api/v1/job_templates/1/callback/
\nNote the requesting host must be defined in your inventory. If ansible fails to locate the host either by name or IP address in one of your defined inventories, the request will be denied.
Successful requests will result in an entry on the Jobs tab, where the results and history can be viewed.
', detailPlacement:"left",dataContainer:"#jobs",dataTitle:"Callback URL"},host_config_key:{label:"Host Config Key",type:"text",ngShow:"allow_callbacks",genMD5:!0,column:2,awPopOver:'When contacting the AWX server using the callback URL, the calling host must authenticate by including this key in the POST data of the request. Here\'s an example using curl:
\ncurl --data "host_config_key=5a8ec154832b780b9bdef1061764ae5a" http://your.server.com:999/api/v1/job_templates/1/callback/
\n', @@ -206,11 +207,11 @@ d,c){h.queue.push({result:"success",data:a,status:b});h.$emit("callFinished")}). a).checked=!0,-1==h.selected.indexOf(a)&&h.selected.push(a))};h.createGroup=function(){$("#form-modal").modal("hide");v({inventory_id:l,group_id:k})}}}]).factory("GroupsAdd",["$rootScope","$location","$log","$routeParams","Rest","Alert","GroupForm","GenerateForm","Prompt","ProcessErrors","GetBasePath","RefreshTree","ParseTypeChange",function(k,m,h,g,c,p,f,e,l,a,d,b,y){return function(l){var g=l.inventory_id;l=void 0!==l.group_id?l.group_id:null;var h=null!==l?d("groups")+l+"/children/":d("inventory")+ g+"/groups/",k=e.inject(f,{mode:"add",modal:!0,related:!1});k.formModalActionLabel="Save";k.formModalHeader="Create Group";k.formModalCancelShow=!0;k.parseType="yaml";y(k);$("#form-modal .btn-none").removeClass("btn-none").addClass("btn-success");e.reset();k.$$phase||k.$digest();k.formModalAction=function(){try{var d="json"==k.parseType?JSON.parse(k.variables):jsyaml.load(k.variables);if("object"!==typeof d)throw"failed to return an object!";var e={},l;for(l in f.fields)"variables"!=l&&(e[l]=k[l]); g&&(e.inventory=g);c.setUrl(h);c.post(e).success(function(e,l,n,g){k.variables?(c.setUrl(e.related.variable_data),c.put(d).success(function(a,d,c,e){$("#form-modal").modal("hide");b({scope:k})}).error(function(b,d,c,e){a(k,b,d,f,{hdr:"Error!",msg:"Failed to add group varaibles. PUT returned status: "+d})})):($("#form-modal").modal("hide"),b({scope:k}))}).error(function(b,d,c,e){a(k,b,d,f,{hdr:"Error!",msg:"Failed to add new group. POST returned status: "+d})})}catch(m){p("Error","Error parsing group variables. Parser returned: "+ -m)}};k.formReset=function(){e.reset()}}}]).factory("GroupsEdit",["$rootScope","$location","$log","$routeParams","Rest","Alert","GroupForm","GenerateForm","Prompt","ProcessErrors","GetBasePath","RefreshTree","ParseTypeChange",function(k,m,h,g,c,p,f,e,l,a,d,b,y){return function(l){var h=l.group_id,k=g.id,m=d("groups")+h+"/",t=e.inject(f,{mode:"edit",modal:!0,related:!1});e.reset();var r={},n={};t.formModalActionLabel="Save";t.formModalHeader="Edit Group";t.formModalCancelShow=!0;t.parseType="yaml"; +m)}};k.formReset=function(){e.reset()}}}]).factory("GroupsEdit",["$rootScope","$location","$log","$routeParams","Rest","Alert","GroupForm","GenerateForm","Prompt","ProcessErrors","GetBasePath","RefreshTree","ParseTypeChange",function(k,m,h,g,c,p,f,e,l,a,d,b,y){return function(l){var h=l.group_id,k=g.id,m=d("groups")+h+"/",t=e.inject(f,{mode:"edit",modal:!0,related:!1});e.reset();var s={},n={};t.formModalActionLabel="Save";t.formModalHeader="Edit Group";t.formModalCancelShow=!0;t.parseType="yaml"; y(t);$("#form-modal .btn-none").removeClass("btn-none").addClass("btn-success");t.groupLoadedRemove&&t.groupLoadedRemove();t.groupLoadedRemove=t.$on("groupLoaded",function(){for(var b in n)t.search(n[b].iterator);t.variable_url?(c.setUrl(t.variable_url),c.get().success(function(a,b,d,c){$.isEmptyObject(a)?t.variables="---":t.variables=jsyaml.safeDump(a)}).error(function(b,d,c,e){t.variables=null;a(t,b,d,f,{hdr:"Error!",msg:"Failed to retrieve group variables. GET returned status: "+d})})):t.variables= -"---";r.variables=t.variables});c.setUrl(m);c.get().success(function(a,b,d,c){for(var e in f.fields)a[e]&&(t[e]=a[e],r[e]=t[e]);b=a.related;for(var l in f.related)b[l]&&(n[l]={url:b[l],iterator:f.related[l].iterator});t.variable_url=a.related.variable_data;t.$emit("groupLoaded")}).error(function(b,d,c,e){a(t,b,d,f,{hdr:"Error!",msg:"Failed to retrieve group: "+id+". GET status: "+d})});t.$$phase||t.$digest();t.formModalAction=function(){try{var e="json"==t.parseType?JSON.parse(t.variables):jsyaml.load(t.variables); +"---";s.variables=t.variables});c.setUrl(m);c.get().success(function(a,b,d,c){for(var e in f.fields)a[e]&&(t[e]=a[e],s[e]=t[e]);b=a.related;for(var l in f.related)b[l]&&(n[l]={url:b[l],iterator:f.related[l].iterator});t.variable_url=a.related.variable_data;t.$emit("groupLoaded")}).error(function(b,d,c,e){a(t,b,d,f,{hdr:"Error!",msg:"Failed to retrieve group: "+id+". GET status: "+d})});t.$$phase||t.$digest();t.formModalAction=function(){try{var e="json"==t.parseType?JSON.parse(t.variables):jsyaml.load(t.variables); if("object"!==typeof e)throw"failed to return an object!";var l={},n;for(n in f.fields)l[n]=t[n];l.inventory=k;c.setUrl(m);c.put(l).success(function(l,n,g,h){t.variables?(c.setUrl(d("groups")+l.id+"/variable_data/"),c.put(e).success(function(a,d,c,e){$("#form-modal").modal("hide");b({scope:t})}).error(function(b,d,c,e){a(t,b,d,f,{hdr:"Error!",msg:"Failed to update group varaibles. PUT returned status: "+d})})):($("#form-modal").modal("hide"),b({scope:t}))}).error(function(b,d,c,e){a(t,b,d,f,{hdr:"Error!", -msg:"Failed to update group: "+h+". PUT status: "+d})})}catch(g){p("Error","Error parsing group variables. Parser returned: "+g)}};t.formReset=function(){e.reset();for(var a in r)t[a]=r[a];t.parseType="yaml"}}}]).factory("GroupsDelete",["$rootScope","$location","$log","$routeParams","Rest","Alert","GroupForm","GenerateForm","Prompt","ProcessErrors","GetBasePath",function(k,m,h,g,c,p,f,e,l,a,d){return function(b){var e=b.scope,f=b.group_id;b=b.inventory_id;var l=$('#tree-view li[group_id="'+f+'"]'), +msg:"Failed to update group: "+h+". PUT status: "+d})})}catch(g){p("Error","Error parsing group variables. Parser returned: "+g)}};t.formReset=function(){e.reset();for(var a in s)t[a]=s[a];t.parseType="yaml"}}}]).factory("GroupsDelete",["$rootScope","$location","$log","$routeParams","Rest","Alert","GroupForm","GenerateForm","Prompt","ProcessErrors","GetBasePath",function(k,m,h,g,c,p,f,e,l,a,d){return function(b){var e=b.scope,f=b.group_id;b=b.inventory_id;var l=$('#tree-view li[group_id="'+f+'"]'), g="LI"==l.parent().last().prop("tagName")?l.parent().last():l.parent().parent().last(),h;h="group"==g.attr("type")?d("base")+"groups/"+g.attr("group_id")+"/children/":d("inventory")+b+"/groups/";$("#prompt-header").text("Delete Group");$("#prompt-body").text("Are you sure you want to remove group "+$(l).attr("name")+" from "+$(g).attr("name")+"?");$("#prompt-action-btn").addClass("btn-danger");e.promptAction=function(){c.setUrl(h);c.post({id:f,disassociate:1}).success(function(a,b,d,c){$("#prompt-modal").modal("hide"); $("#tree-view").jstree("delete_node",l)}).error(function(b,d,c,f){$("#prompt-modal").modal("hide");RefreshTree({scope:e});a(e,b,d,null,{hdr:"Error!",msg:"Call to "+h+" failed. DELETE returned status: "+d})})};$("#prompt-modal").modal({backdrop:"static",keyboard:!0,show:!0})}}]);angular.module("HostsHelper","RestServices Utilities ListGenerator HostListDefinition SearchHelper PaginateHelper ListGenerator AuthService HostsHelper InventoryHelper RelatedSearchHelper RelatedPaginateHelper InventoryFormDefinition".split(" ")).factory("HostsList",["$rootScope","$location","$log","$routeParams","Rest","Alert","HostList","GenerateList","Prompt","SearchInit","PaginateInit","ProcessErrors","GetBasePath","HostsAdd","HostsReload",function(k,m,h,g,c,p,f,e,l,a,d,b,y,v,A){return function(b){var l= b.inventory_id,g=b.group_id;f.iterator="subhost";f.name="subhosts";var h=y("inventory")+l+"/hosts/",n=e.inject(f,{id:"form-modal-body",mode:"select",breadCrumbs:!1,selectButton:!1});n.formModalActionLabel="Select";n.formModalHeader="Select Hosts";n.formModalCancelShow=!0;n.removeHostsReload&&n.removeHostsReload();n.removeHostsReload=n.$on("hostsReload",function(){A(b)});$(".popover").remove();$("#form-modal .btn-none").removeClass("btn-none").addClass("btn-success");$("#form-modal").modal({backdrop:"static", @@ -220,11 +221,11 @@ data:a,status:b});n.$emit("callFinished")}).error(function(a,b,d,c){n.queue.push a).checked=!0,-1==n.selected.indexOf(a)&&n.selected.push(a))};n.createHost=function(){$("#form-modal").modal("hide");v({scope:b.scope,inventory_id:l,group_id:g})}}}]).factory("HostsAdd",["$rootScope","$location","$log","$routeParams","Rest","Alert","HostForm","GenerateForm","Prompt","ProcessErrors","GetBasePath","HostsReload","ParseTypeChange",function(k,m,h,g,c,p,f,e,l,a,d,b,y){return function(l){var g=l.inventory_id,h=void 0!==l.group_id?l.group_id:null,k=d("groups")+h+"/hosts/",m=e.inject(f,{mode:"add", modal:!0,related:!1});m.formModalActionLabel="Save";m.formModalHeader="Create Host";m.formModalCancelShow=!0;m.parseType="yaml";y(m);m.removeHostsReload&&m.removeHostsReload();m.removeHostsReload=m.$on("hostsReload",function(){b(l)});$("#form-modal .btn-none").removeClass("btn-none").addClass("btn-success");e.reset();m.$$phase||m.$digest();m.formModalAction=function(){try{var b="json"==m.parseType?JSON.parse(m.variables):jsyaml.load(m.variables);if("object"!==typeof b)throw"failed to return an object!"; var d={},e;for(e in f.fields)"variables"!=e&&(d[e]=m[e]);d.inventory=g;c.setUrl(k);c.post(d).success(function(d,e,l,g){m.variables?(c.setUrl(d.related.variable_data),c.put(b).success(function(a,b,d,c){$("#form-modal").modal("hide")}).error(function(b,d,c,e){a(m,b,d,f,{hdr:"Error!",msg:"Failed to add host varaibles. PUT returned status: "+d})})):($("#form-modal").modal("hide"),m.$emit("hostsReload"))}).error(function(b,d,c,e){a(m,b,d,f,{hdr:"Error!",msg:"Failed to add new host. POST returned status: "+ -d})})}catch(l){p("Error","Error parsing host variables. Parser returned: "+l)}};m.formReset=function(){e.reset()}}}]).factory("HostsEdit",["$rootScope","$location","$log","$routeParams","Rest","Alert","HostForm","GenerateForm","Prompt","ProcessErrors","GetBasePath","HostsReload","ParseTypeChange",function(k,m,h,g,c,p,f,e,l,a,d,b,y){return function(l){var g=l.host_id,h=l.inventory_id,k=d("hosts")+g+"/",m=e.inject(f,{mode:"edit",modal:!0,related:!1});e.reset();var r={};m.formModalActionLabel="Save"; +d})})}catch(l){p("Error","Error parsing host variables. Parser returned: "+l)}};m.formReset=function(){e.reset()}}}]).factory("HostsEdit",["$rootScope","$location","$log","$routeParams","Rest","Alert","HostForm","GenerateForm","Prompt","ProcessErrors","GetBasePath","HostsReload","ParseTypeChange",function(k,m,h,g,c,p,f,e,l,a,d,b,y){return function(l){var g=l.host_id,h=l.inventory_id,k=d("hosts")+g+"/",m=e.inject(f,{mode:"edit",modal:!0,related:!1});e.reset();var s={};m.formModalActionLabel="Save"; m.formModalHeader="Edit Host";m.formModalCancelShow=!0;m.parseType="yaml";y(m);m.removeHostsReload&&m.removeHostsReload();m.removeHostsReload=m.$on("hostsReload",function(){b(l)});$("#form-modal .btn-none").removeClass("btn-none").addClass("btn-success");m.hostLoadedRemove&&m.hostLoadedRemove();m.hostLoadedRemove=m.$on("hostLoaded",function(){m.variable_url?(c.setUrl(m.variable_url),c.get().success(function(a,b,d,c){$.isEmptyObject(a)?m.variables="---":m.variables=jsyaml.safeDump(a)}).error(function(b, -d,c,e){m.variables=null;a(m,b,d,f,{hdr:"Error!",msg:"Failed to retrieve host variables. GET returned status: "+d})})):m.variables="---";r.variables=m.variables});c.setUrl(k);c.get().success(function(a,b,d,c){for(var e in f.fields)a[e]&&(m[e]=a[e],r[e]=m[e]);for(var l in f.related);m.variable_url=a.related.variable_data;m.$emit("hostLoaded")}).error(function(b,d,c,e){a(m,b,d,f,{hdr:"Error!",msg:"Failed to retrieve host: "+id+". GET returned status: "+d})});m.$$phase||m.$digest();m.formModalAction= +d,c,e){m.variables=null;a(m,b,d,f,{hdr:"Error!",msg:"Failed to retrieve host variables. GET returned status: "+d})})):m.variables="---";s.variables=m.variables});c.setUrl(k);c.get().success(function(a,b,d,c){for(var e in f.fields)a[e]&&(m[e]=a[e],s[e]=m[e]);for(var l in f.related);m.variable_url=a.related.variable_data;m.$emit("hostLoaded")}).error(function(b,d,c,e){a(m,b,d,f,{hdr:"Error!",msg:"Failed to retrieve host: "+id+". GET returned status: "+d})});m.$$phase||m.$digest();m.formModalAction= function(){try{var b="json"==m.parseType?JSON.parse(m.variables):jsyaml.load(m.variables);if("object"!==typeof b)throw"failed to return an object!";var e={},l;for(l in f.fields)e[l]=m[l];e.inventory=h;c.setUrl(k);c.put(e).success(function(e,l,g,h){m.variables?(c.setUrl(d("hosts")+e.id+"/variable_data/"),c.put(b).success(function(a,b,d,c){$("#form-modal").modal("hide");m.$emit("hostsReload")}).error(function(b,d,c,e){a(m,b,d,f,{hdr:"Error!",msg:"Failed to update host varaibles. PUT returned status: "+ -d})})):($("#form-modal").modal("hide"),m.$emit("hostsReload"))}).error(function(b,d,c,e){a(m,b,d,f,{hdr:"Error!",msg:"Failed to update host: "+g+". PUT returned status: "+d})})}catch(y){p("Error","Error parsing host variables. Parser returned: "+y)}};m.formReset=function(){e.reset();for(var a in r)m[a]=r[a];m.parseType="yaml"}}}]).factory("HostsDelete",["$rootScope","$location","$log","$routeParams","Rest","Alert","Prompt","ProcessErrors","GetBasePath","HostsReload",function(k,m,h,g,c,p,f,e,l,a){return function(d){var b= +d})})):($("#form-modal").modal("hide"),m.$emit("hostsReload"))}).error(function(b,d,c,e){a(m,b,d,f,{hdr:"Error!",msg:"Failed to update host: "+g+". PUT returned status: "+d})})}catch(y){p("Error","Error parsing host variables. Parser returned: "+y)}};m.formReset=function(){e.reset();for(var a in s)m[a]=s[a];m.parseType="yaml"}}}]).factory("HostsDelete",["$rootScope","$location","$log","$routeParams","Rest","Alert","Prompt","ProcessErrors","GetBasePath","HostsReload",function(k,m,h,g,c,p,f,e,l,a){return function(d){var b= d.scope,f=d.inventory_id,g=d.host_id,h=d.host_name,k=null!==b.group_id?l("groups")+b.group_id+"/hosts/":l("inventory")+f+"/hosts/";null!==b.group_id?($("#prompt-header").text("Remove Host from Group"),$("#prompt-body").text("Are you sure you want to remove host "+h+" from the group?")):($("#prompt-header").text("Delete Host"),$("#prompt-body").text("Are you sure you want to permenantly remove host "+h+"?"));$("#prompt-action-btn").addClass("btn-danger");b.promptAction=function(){b.removeHostsReload&& b.removeHostsReload();b.removeHostsReload=b.$on("hostsReload",function(){a(d)});c.setUrl(k);c.post({id:g,disassociate:1}).success(function(a,d,c,e){$("#prompt-modal").modal("hide");b.$emit("hostsReload")}).error(function(a,d,c,l){$("#prompt-modal").modal("hide");b.$emit("hostsReload");e(b,a,d,null,{hdr:"Error!",msg:"Call to "+k+" failed. DELETE returned status: "+d})})};$("#prompt-modal").modal({backdrop:"static",keyboard:!0,show:!0})}}]).factory("HostsReload",["RelatedSearchInit","RelatedPaginateInit", "InventoryForm","GetBasePath",function(k,m,h,g){return function(c){scope=c.scope;var p={hosts:{url:null!==scope.group_id?g("groups")+scope.group_id+"/hosts/":g("inventory")+c.inventory_id+"/hosts/",iterator:"host"}};k({scope:c.scope,form:h,relatedSets:p});m({scope:c.scope,relatedSets:p});c.scope.search("host");c.scope.$$phase||c.scope.$digest()}}]);angular.module("InventoryHelper","RestServices Utilities OrganizationListDefinition SearchHelper PaginateHelper ListGenerator AuthService InventoryHelper RelatedSearchHelper RelatedPaginateHelper InventoryFormDefinition".split(" ")).factory("LoadTreeData",["Alert","Rest","Authorization","$http",function(k,m,h,g){return function(c){var g=c.scope,f=c.inventory,e=f.related.root_groups,l=f.related.hosts,a=f.name,d=f.url,b=f.id,h=f.description,v=0,A=[];g.HostLoadedRemove&&g.HostLoadedRemove();g.HostLoadedRemove= diff --git a/awx/ui/static/js/controllers/Jobs.js b/awx/ui/static/js/controllers/Jobs.js index 1ffa6b7023..92337615b5 100644 --- a/awx/ui/static/js/controllers/Jobs.js +++ b/awx/ui/static/js/controllers/Jobs.js @@ -165,6 +165,7 @@ function JobsEdit ($scope, $rootScope, $compile, $location, $log, $routeParams, var id = $routeParams.id; var relatedSets = {}; + scope.parseType = 'yaml'; scope.statusSearchSpin = false; function getPlaybooks(project) { @@ -228,6 +229,7 @@ function JobsEdit ($scope, $rootScope, $compile, $location, $log, $routeParams, }); scope['callback_url'] = data.related['callback']; $('input[type="checkbox"]').attr('disabled','disabled'); + $('input[type="radio"]').attr('disabled','disabled'); $('#host_config_key-gen-btn').attr('disabled','disabled'); }) .error( function(data, status, headers, config) { @@ -254,7 +256,7 @@ function JobsEdit ($scope, $rootScope, $compile, $location, $log, $routeParams, LoadBreadCrumbs({ path: '/job_templates/' + id, title: data.name }); for (var fld in form.fields) { - if (data[fld] !== null && data[fld] !== undefined) { + if (fld != 'variables' && data[fld] !== null && data[fld] !== undefined) { if (form.fields[fld].type == 'select') { if (scope[fld + '_options'] && scope[fld + '_options'].length > 0) { for (var i=0; i < scope[fld + '_options'].length; i++) { @@ -272,6 +274,17 @@ function JobsEdit ($scope, $rootScope, $compile, $location, $log, $routeParams, } master[fld] = scope[fld]; } + if (fld == 'variables') { + // Parse extra_vars, converting to YAML. + if ($.isEmptyObject(data.extra_vars) || data.extra_vars == "\{\}" || data.extra_vars == "null") { + scope.variables = "---"; + } + else { + var json_obj = JSON.parse(data.extra_vars); + scope.variables = jsyaml.safeDump(json_obj); + } + master.variables = scope.variables; + } if (form.fields[fld].type == 'lookup' && data.summary_fields[form.fields[fld].sourceModel]) { scope[form.fields[fld].sourceModel + '_' + form.fields[fld].sourceField] = data.summary_fields[form.fields[fld].sourceModel][form.fields[fld].sourceField]; diff --git a/awx/ui/static/js/forms/Jobs.js b/awx/ui/static/js/forms/Jobs.js index 4bcdd8ffce..7c090ebcf3 100644 --- a/awx/ui/static/js/forms/Jobs.js +++ b/awx/ui/static/js/forms/Jobs.js @@ -127,7 +127,7 @@ angular.module('JobFormDefinition', []) dataTitle: 'Verbosity', dataPlacement: 'left' }, - extra_vars: { + variables: { label: 'Extra Variables', type: 'textarea', rows: 6,