【问题标题】:Automation of networks using ansible on openstack在 openstack 上使用 ansible 实现网络自动化
【发布时间】:2016-08-23 00:36:10
【问题描述】:

我编写了一个 ansible 脚本,用于根据条件创建网络。因此,即使我再次运行 ansible 脚本,它也不会在我的 openstack 环境中创建重复的条目。

任务:

name: "create network"

shell: neutron net-create (openstack details like project username,password, api) network_1

when: ("neutron net-list -c name| grep network_1| awk '{print$2}'" == "null")
  the above condition didn't work so, I tried another condition

when: ("neutron net-list -c name| grep network_1| awk '{print$2}'" == neutron net-list -c name| grep network_2 | awk '{print$2}')

我的项目中没有这两个网络中的任何一个。我的意图是,两个语句都显示空输出,并且第一次条件变为真,它应该执行并创建一个网络。如果我第二次运行该脚本,它不满足条件并且条件检查变为错误并且将不会创建网络。

但是两个条件都被跳过并返回错误,说条件检查失败。

【问题讨论】:

  • 如果您复制/粘贴这些neutron 命令行并在标准终端中执行它们,它们是否有效?您需要确定他们正在返回您的条件所期望的内容。如果您包含这些命令的示例输出,它可能会对非中子读者有所帮助。祝你好运。
  • 嘿壳,他们不返回任何东西。因为它们在表中不存在。条件是如果他们返回 null 或什么都没有命令应该执行。看来我需要另辟蹊径。谢谢你调查它!

标签: linux shell ansible ansible-playbook openstack


【解决方案1】:

您的 when 条件需要是 Ansible 能够识别的内容,而不仅仅是您没有告诉它如何执行的 shell 命令。

在这种情况下,您可以这样做:

- name: check for network_1    
  shell: "neutron net-list -c name| grep network_1| awk '{print$2}'"    
  register: network_1

- name: "create network"    
  shell: neutron net-create (openstack details like project username,password, api) network_1    
  when: network_1.stdout == "null"

这是假设当你运行neutron net-list -c name| grep network_1| awk '{print$2}' 而network_1 不存在时它返回null(我没有经常使用OpenStack,所以不确定这是否真的如此)。

不过,一般来说,使用 Ansible,您应该只在绝对需要的情况下才使用,因为您需要执行上述操作,您需要检查资源是否存在并管理幂等性,任何体面的人都应该为您解决这些问题模块。在这种情况下,您应该可以使用 os_network 创建您的网络(如果它尚不存在):

- os_network:
    cloud: mycloud
    state: present
    name: network_1
    external: false

它还会在运行 Ansible 的主机上愉快地获取环境变量,例如 OS_USERNAME,这样您就可以避免将凭据放入您的 Ansible 代码中。

【讨论】:

  • 您必须编辑您的问题以添加一个命令的输出,该命令检查网络是否存在,结果为阴性和阳性
  • 我尝试过使用 os_network 模块,但它的开销是,您需要在您正在运行的主机上安装 shade 模块。为此,首先我们需要安装 pip,然后使用 pip 我们需要安装 shade 和 virtualenv 等。Shade 模块正在安装与 keystone nova 等相关的 python 包。如果那些修改 openstack 组件的包会造成一些损坏,我不太担心。我已尝试按照您的建议更改问题。但找不到。堆栈流的新手。
【解决方案2】:
  • 名称:网络列表

    shell: neutron net-list -c name | grep 网络 | awk '{print$2}'

    注册:资源

  • 名称:网络创建

    shell: neutron net-create network

    当:res.stdout != "network"

这里在第一个语句中检查网络名称是否存在于列表中。第二部分是说如果网络名称不等于网络,则创建网络。如果我们再次运行 playbook,此条件将为 false,因为第一条语句将能够从表中检索名称。谢谢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 2018-03-07
    • 2018-03-22
    • 1970-01-01
    • 2021-12-26
    • 2011-03-23
    • 2021-09-02
    相关资源
    最近更新 更多