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

标签 linux shell ansible 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$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/

相关文章:

php - 定时任务不工作

java - 半透明 JPanel 不清除背景/在 Linux 中显示背景伪像

linux - 如何遍历 shell 命令的输出?

regex - 如何在 Ansible 的 lineinfile 模块中的正则表达式中转义 1 个或多个空格?

ansible - 使用 ansible playbook 检查嵌套数据结构中的给定字符串

linux - 无法安装 Ansible

linux - 为什么我看到的线程数比我在 `ps` 列表中创建的线程数多一个?

linux - 使用 shell 脚本查找文件大小

linux - 用换行符替换空格,特殊字符包裹的空格除外

linux - Bash 变量定义顺序