在 openstack 上使用 ansible 实现网络自动化

Automation of networks using ansible on openstack

我写了一个 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}'" == "null")
  the above condition didn't work so, I tried another condition

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

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

但是条件都跳过了,返回false说条件检查失败。

你的 when 条件需要是 Ansible 可以识别的东西,而不仅仅是你没有告诉它如何执行的 shell 命令。

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

- name: check for network_1    
  shell: "neutron net-list -c name| grep network_1| awk '{print}'"    
  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}' 当 network_1 不存在时 returns null (我没怎么用过 OpenStack 所以不确定这是否属实)。

一般来说,使用 Ansible 时,你应该只在绝对需要时才 shell 退出,因为那时你需要做上面那样的事情,你需要检查资源的存在并管理幂等性,这应该任何体面的模块都会为您覆盖。在这种情况下,您应该能够使用 os_network 创建您的网络(如果它尚不存在):

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

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

  • 名称:网络列表

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

    注册:res[​​=10=]

  • 名称:网络创建

    shell: neutron net-创建网络

    当: res.stdout != "network"

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