首页 文章

带变量的Ansible Playbook?

提问于
浏览
-2

环境:Azure vm中的Ubuntu 16.04

ansible 2.4.3.0

python版本= 2.7.12(默认,2017年11月20日,18:23:56)[GCC 5.4.0 20160609]

azure-cli(2.0.27)

我已经使用Ansible Playbook在azure中成功创建了我的第一个vm .

现在,我的问题是:我可以在playbook中使用admin-password,vmname等变量,这样我就可以在一个具有不同名称的文件中放入我想要创建的10台机器的列表 . 他们的密码,然后循环并通过playbook命令将该信息提供给playbook.yml文件?

我对任何方式都持开放态度,而且我知道Ansible可能已经有了一种更容易/更正常的方式,我只是不知道谷歌我需要什么 .

编辑:显然我的问题太宽泛了 . 我会尝试更具体 . 我看了康斯坦丁苏沃洛夫离开的链接 . 据我了解,所描述的方法通过让你为组分配变量来实现我所追求的反转 . 在示例中,对现有机器 .

我需要的是能够以正常的YAML样式创建vms,但能够以某种方式进行过程循环,这样它将创建具有所有相同信息的机器1到10,除了机器名称和密码 . 上面的示例似乎使用变量将相同的信息分配给多台机器 .

我怎样才能做到这一点?我主要是一个bash脚本编写器,所以我要做的是将每个机器的名称:密码放在一个文件的多行上,循环通过它并在每个循环中运行一次ansible-playbook命令来创建每台机器,某种变量 . 但是,我感觉有一种更有效的方式,这样我运行命令一次,命令将创建每台机器,其中的变量/信息被编码(以某种方式)到yaml文件中 . 这个具体到底吗?

进一步编辑:感谢您让我走上正轨 . 我已经调整了我用来创建一个vm的脚本,试图让它创建两个 . 我得到各种各样的错误,其中没有一个似乎真的指向冒犯代码 . 以下是我正在尝试的内容:

- name: Create Azure VM
  hosts: localhost
  connection: local
  with_items:
    - { vmname: 'testvmfordb', userpassword: 'my password' }
    - { vmname: 'testvmforfe', userpassword: 'my other password' }
  tasks:
  - name: Create virtual network inteface card
    azure_rm_networkinterface:
      resource_group: my_rg
      name: "{{ item.vmname }}NIC"
      virtual_network: my_rg
      subnet: default
      public_ip_name: "{{ item.vmname }}IP"
      security_group: my_firewall_rules
  - name: Create VM
    azure_rm_virtualmachine:
      resource_group: my_rg
      name: "{{ item.vmname }}"
      vm_size: Standard_DS1_v2
      location: EastUS
      admin_username: myusername
      admin_password: "{{ item.userpassword }}"
      ssh_password_enabled: true
      storage_container: vhds
      storage_blob: "{{ item.vmname }}osdisk.vhd"
      network_interfaces: "{{ item.vmname }}NIC"
      image:
        offer: UbuntuServer
        publisher: Canonical
        sku: '16.04-LTS'
        version: latest
      os_type: Linux

提前致谢!

我按照@KonstantinSuvorov的建议,将创建任务分开到一个单独的文件中 . 我收到了这条消息:

TASK [include_tasks] *******************************************************************************************************************************
task path: /home/user/ansible_playbooks/azure_create_many_vms.yml:5
fatal: [localhost]: FAILED! => {
    "reason": "included task files must contain a list of tasks"
}
fatal: [localhost]: FAILED! => {
    "reason": "included task files must contain a list of tasks"
}

这是文件/代码:azure_create_many_vms.yml

- name: Create Azure VM
  hosts: localhost
  connection: local
  tasks:
  - include_tasks: azure_create_many_vms_tasks.yml
    with_items:
      - { vmname: 'testvmforelastic', userpassword: 'my user password' }
      - { vmname: 'testvmforfe', userpassword: 'my user password' }

azure_create_many_vms_tasks.yml

tasks:
  - name: Create virtual network inteface card
    azure_rm_networkinterface:
      resource_group: my_core_rg
      name: "{{ item.vmname }}NIC"
      virtual_network: my_core_rg
      subnet: default
      public_ip_name: "{{ item.vmname }}IP"
      security_group: my_core_firewall_rules
  - name: Create VM
    azure_rm_virtualmachine:
      resource_group: my_core_rg
      name: "{{ item.vmname }}"
      vm_size: Standard_DS1_v2
      location: EastUS
      admin_username: adminuser
      admin_password: "{{ item.userpassword }}"
      ssh_password_enabled: true
      storage_container: vhds
      storage_blob: "{{ item.vmname }}osdisk.vhd"
      network_interfaces: "{{ item.vmname }}NIC"
      image:
        offer: UbuntuServer
        publisher: Canonical
        sku: '16.04-LTS'
        version: latest
      os_type: Linux

1 回答

  • 1

    您应该从包含的文件中删除 tasks 关键字,只留下一个简单的任务列表,如下所示:

    - name: Create virtual network inteface card
      azure_rm_networkinterface:
        ...
    - name: Create VM
      azure_rm_virtualmachine:
        ...
    

相关问题