ansible:将变量传递给处理程序

时间:2014-10-20 22:09:30

标签: ansible ansible-playbook

我使用“眼睛”作为主管,模板的更改必须运行如下:

eye load service.rb
eye restart service.rb

我想将此定义为所有应用的单一处理程序,并将其称为

eye reload appname

在处理程序中运行如下:

- name: reload eye service
command: eye load /path/{{ service }}.rb && eye restart {{ service }}

但是我找不到将变量传递给处理程序的方法。有可能吗?

3 个答案:

答案 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 来设置处理程序可以访问的事实。