使用Ansible在PaloAlto中添加地址对象

Ansible 支持PAN-OS 。

Ansible 2.3版本引入了多个模块,支持PAN-OS操作系统。
https://docs.ansible.com/ansible/list_of_network_modules.html#panos

panos_security_policy: セキュリティポリシーを作成する

panos_mgtconfig: 管理系設定を行う

我們這次將使用panos_address來創建地址對象。

2. 安装

2.1.无人机操作

pip install ansible

2.2. 泛 Python,泛设备

为了使用PAN-OS相关的模块,需要安装Python的pan-python和pandevice两个模块。

pip install pan-python pandevice

确认版本

[root@localhost ~]# ansible --version
ansible 2.3.0.0
  config file =
  configured module search path = Default w/o overrides
  python version = 2.7.8 (default, Oct 22 2016, 09:02:55) [GCC 4.4.7 20120313 (Red Hat 4.4.7-17)]

没有专门创建ansible.cfg。

3. 创建清单文件

[palo]
192.168.0.15  # 今回は1台だけ

[palo:vars]
ansible_user=admin
ansible_password=passwordpassword

4. 制作Playbook

请将以下文件创建为palo_addr.yml。

---
- hosts: palo
  gather_facts: no
  connection: local

  tasks:
    - name: create address object
      panos_address:
        ip_address: "{{ inventory_hostname }}"  # オブジェクトのアドレスではなくPaloaltoのアドレス
        username: "{{ ansible_user }}"
        password: "{{ ansible_password }}"
        address_name: "client_pc01"
        address: "192.168.0.101/32"
        commit: False   # 今回はcommitまでしない

这个模块的官方文档是一个很好的参考资料。

动作确认

5.1. 添加地址

5.1.1 预先确认

从没有地址对象的状态开始。

admin@PA-2050# show address
address;
[edit]
admin@PA-2050#

5.1.2 执行Playbook

[root@localhost ~]# ansible-playbook palo_addr.yml

PLAY [palo] **************************************************************************************************

TASK [create address Object] *********************************************************************************
ok: [192.168.1.15]

PLAY RECAP ***************************************************************************************************
192.168.1.15               : ok=1    changed=1    unreachable=0    failed=0

5.1.3 配置确认

已添加政策。

admin@PA-2050# show address
address {
  client_pc01 {
    ip-netmask 192.168.0.101/32;
  }
}

5.2 地址更改

我决定在这里更改现有地址对象的地址。

5.2.1. 更改Playbook

将地址更改为”192.168.0.101/32″。

---
- hosts: palo
  gather_facts: no
  connection: local

    - name: create address Object
      panos_address:
        ip_address: "{{ inventory_hostname }}"
        username: "{{ ansible_user }}"
        password: "{{ ansible_password }}"
        address_name: "client_pc01"
        address: "192.168.0.102/32"        # ここ変更
        commit: False

5.2.2执行Playbook再次

只要更改Playbook,就再次执行。

[root@localhost ~]# ansible-playbook palo_addr.yml

PLAY [palo] **************************************************************************************************

TASK [create address Object] *********************************************************************************
ok: [192.168.1.15]

PLAY RECAP ***************************************************************************************************
192.168.1.15               : ok=1    changed=0    unreachable=0    failed=0

哎呀哎呀?根据某些信息,没有发生任何更改。

看起来,更改IP地址不被视为一次实际的更改。

5.3 地址名称更改

这一次,我们决定不只是修改地址,还要改变地址的名称。

5.3.1. 战术调整

将 address_name 改为”client_pc02″。

---
- hosts: palo
  gather_facts: no
  connection: local

    - name: create address Object
      panos_address:
        ip_address: "{{ inventory_hostname }}"
        username: "{{ ansible_user }}"
        password: "{{ ansible_password }}"
        address_name: "client_pc02"        # ここ変更
        address: "192.168.0.101/32"
        commit: False

5.3.2 重新执行 Playbook

[root@localhost ~]# ansible-playbook palo_addr.yml

PLAY [palo] **************************************************************************************************

TASK [create address Object] *********************************************************************************
changed: [192.168.1.15]

PLAY RECAP ***************************************************************************************************
192.168.1.15               : ok=1    changed=1    unreachable=0    failed=0

这次变成了 changed=1。

5.3.3 查看配置

并不是进行了更改,而是添加了另一个对象的地址名。

admin@PA-2050# show address
address {
  client_pc01 {
    ip-netmask 192.168.0.101/32;
  }
  client_pc02 {
    ip-netmask 192.168.0.101/32;
  }
}

检查是否有对象名称,如果没有,则添加处理。

6. 关于Python 2.6的错误(补充)

在Python 2.6环境下执行ansible-playbook时,pandevice出现以下错误,导致无法正常执行。因此,我们选择在Python 2.7环境下进行执行。

Using module file /root/ansible/ansible/lib/ansible/modules/network/panos/panos_security_policy.py
<192.168.1.15> ESTABLISH LOCAL CONNECTION FOR USER: root
<192.168.1.15> EXEC /bin/sh -c 'echo ~ && sleep 0'
<192.168.1.15> EXEC /bin/sh -c '( umask 77 && mkdir -p "` echo /root/.ansible/tmp/ansible-tmp-1491081586.53-46889509406412 `" && echo ansible-tmp-1491081586.53-46889509406412="` echo /root/.ansible/tmp/ansible-tmp-1491081586.53-46889509406412 `" ) && sleep 0'
<192.168.1.15> PUT /tmp/tmpKdGZ_T TO /root/.ansible/tmp/ansible-tmp-1491081586.53-46889509406412/panos_security_policy.py
<192.168.1.15> EXEC /bin/sh -c 'chmod u+x /root/.ansible/tmp/ansible-tmp-1491081586.53-46889509406412/ /root/.ansible/tmp/ansible-tmp-1491081586.53-46889509406412/panos_security_policy.py && sleep 0'
<192.168.1.15> EXEC /bin/sh -c '/usr/bin/python /root/.ansible/tmp/ansible-tmp-1491081586.53-46889509406412/panos_security_policy.py; rm -rf "/root/.ansible/tmp/ansible-tmp-1491081586.53-46889509406412/" > /dev/null 2>&1 && sleep 0'
The full traceback is:
Traceback (most recent call last):
  File "/tmp/ansible_JzsakO/ansible_module_panos_security_policy.py", line 264, in <module>
    import pandevice.firewall
  File "/usr/lib/python2.6/site-packages/pandevice/firewall.py", line 27, in <module>
    from pandevice import device
  File "/usr/lib/python2.6/site-packages/pandevice/device.py", line 19, in <module>
    from base import PanObject, Root, MEMBER, ENTRY
  File "/usr/lib/python2.6/site-packages/pandevice/base.py", line 1224
    option_paths = {opt: re.sub(r"\([\w\d|-]*\)", opt, path) for opt in options}
                                                               ^
SyntaxError: invalid syntax

fatal: [192.168.1.15]: FAILED! => {
    "changed": false,
    "failed": true,
    "module_stderr": "Traceback (most recent call last):\n  File \"/tmp/ansible_JzsakO/ansible_module_panos_security_policy.py\", line 264, in <module>\n    import pandevice.firewall\n  File \"/usr/lib/python2.6/site-packages/pandevice/firewall.py\", line 27, in <module>\n    from pandevice import device\n  File \"/usr/lib/python2.6/site-packages/pandevice/device.py\", line 19, in <module>\n    from base import PanObject, Root, MEMBER, ENTRY\n  File \"/usr/lib/python2.6/site-packages/pandevice/base.py\", line 1224\n    option_paths = {opt: re.sub(r\"\\([\\w\\d|-]*\\)\", opt, path) for opt in options}\n                                                               ^\nSyntaxError: invalid syntax\n",
    "module_stdout": "",
    "msg": "MODULE FAILURE",
    "rc": 0
}

7. 最后

由于似乎有一些怪癖,最好进行一些验证探究。

广告
将在 10 秒后关闭
bannerAds