在 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 中检索名称。谢谢。
我写了一个 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 中检索名称。谢谢。