我编写了一个 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}')
我的项目中没有两个网络。我的意图是,这两个语句都显示空输出并且第一次条件变为真,它应该执行并创建一个网络。如果我第二次运行脚本,它不满足条件并且条件检查变为错误并且不会创建网络。
但是两个条件都跳过了,返回了false说条件检查失败。
最佳答案
您的 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 代码中。
关于linux - 在 openstack 上使用 ansible 实现网络自动化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39090641/