我使用“眼睛”作为主管,模板的更改必须运行如下:
eye load service.rb
eye restart service.rb
我想将此定义为所有应用的单一处理程序,并将其称为
eye reload appname
在处理程序中运行如下:
- name: reload eye service
command: eye load /path/{{ service }}.rb && eye restart {{ service }}
但是我找不到将变量传递给处理程序的方法。有可能吗?
答案 0 :(得分:0)
处理程序/ main.yml:
String query = "@cm\\:title:mytitle.doc";
searchService.query(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, SearchService.LANGUAGE_FTS, )
因此您可以默认设置变量 默认/ main.yml:
- name: restart my service
shell: eye load /path/{{ service }}.rb && eye restart {{ service }}
或者您可以通过命令行定义{{service}}:
service : "service"
http://docs.ansible.com/ansible/playbooks_variables.html
PS:http://docs.ansible.com/ansible/playbooks_intro.html#playbook-language-
ansible-playbook -i xxx path/to/playbook -e "service=service"
http://docs.ansible.com/ansible/playbooks_intro.html#handlers-running-operations-on-change
如果您想立即刷新所有处理程序命令,但在1.2及更高版本中,您可以:
example
---
- hosts: webservers
vars:
http_port: 80
max_clients: 200
remote_user: root
tasks:
- name: ensure apache is at the latest version
yum: name=httpd state=latest
- name: write the apache config file
template: src=/srv/httpd.j2 dest=/etc/httpd.conf
notify:
- restart apache
- name: ensure apache is running (and enable it at boot)
service: name=httpd state=started enabled=yes
handlers:
- name: restart apache
service: name=httpd state=restarted
答案 1 :(得分:0)
不要这样做。我了解您希望将Ansible用作编程工具,其中“处理程序”是您“调用”的“功能”,但并非如此。
您可以发明许多技巧来完成所需的工作,但结果将是一团糟,难以阅读甚至难以调试。
关键问题是,ansible不支持将“参数传递”到任何事物(模块除外)。您自己阅读或发明的所有技巧都会改变全局变量。如果您至少用任何一种语言编写过代码,那您就会知道,该程序中每个函数都使用全局变量(用于读取和写入以及传递参数)是根本有缺陷的。
那么,如何在一个很好的可读性Ansible中做到这一点?
是的,只需为每个服务编写一个单独的处理程序。这是最干净,最简单的Ansible。易于阅读,易于更改。
顺便说一句:如果您必须一连串进行操作,请不要将它们与“ &&”加入。
使用两个单独的处理程序:
import React, { Component } from "react";
import { storeProducts, detailProduct } from "./data";
const ProductContext = React.createContext();
//Provider
//Consumer
class ProductProvider extends Component {
state = {
products: [],
detailProduct: detailProduct
};
componentDidMount() {
this.setProducts();
}
setProducts = () => {
let tempProducts = [];
storeProducts.forEach(item => {
const singleItem = {...item};
tempProducts = [...tempProducts, singleItem];
})
this.setState(() => {
return {products: tempProducts }
});
};
handleDetail = () => {
console.log("hello from detail");
};
addToCart = () => {
console.log("hello from addToCart");
};
render() {
return (
<ProductContext.Provider value={{
...this.state,
handleDetail: this.handleDetail,
addToCart: this.addToCart
}}>
{this.props.children}
</ProductContext.Provider>
);
}
}
(请注意,处理程序的顺序是在处理程序列表中定义的,而不是在“通知”列表中定义的。)
顺便说一句,如果您的服务很少,您将节省多次重装操作-“ eye reload”将被调用一次。
答案 2 :(得分:0)
您不能这样做,但您可以使用 set_fact 来设置处理程序可以访问的事实。