Ansible 不返回有效信息

网络工程 自动化 可靠的
2022-02-23 15:32:30

我是 Ansible 的新手,想知道为什么我得到无效的结果。这是一个简短的脚本,它应该返回库存信息,如 SN、型号、软件版本和名称。

    ---
- name: Cisco facts
  vars_prompt:
    - name: "site"
      prompt: "Which device would you like to check?"
      private: no
      default: all
  hosts: "{{ site }}"
  gather_facts: false
  connection: local

  tasks:
    - name: facts
      # Collect hardware facts from the device
      ios_facts:
        gather_subset: "hardware"
      register: output  
    - local_action:
        module: lineinfile
        dest: /Users/username/Downloads/test2.txt
        insertafter: EOF
        line: "{{ ansible_net_hostname }},{{ ansible_net_model }},{{ ansible_net_version }},{{ ansible_net_serialnum }}"
        create: yes

当我运行剧本时,只要我连接的设备具有不同的 IP 地址,我就会得到正确的结果。例如,当我连接到 172.16.110.2 并且 172.16.110.3 返回正确时,我在创建的文件中有两个行条目。当我使用 IP 172.16.110.11 和 172.16.110.1 连接设备时,它会创建一个包含一行条目的文件(最后连接的那个)。Play recap 显示所有设备都已连接,操作重定向到 localhost 并更改=1。

为什么脚本在连接到类似的设备 IP 地址时不添加一行?

2个回答

Lineinfile在这里是一个奇怪的选择。它是一个用于向配置文件添加行(例如)并确保存在一行的模块,它不适用于您似乎正在做的日志记录之类的事情。由于 IP 地址有很大的重叠,它匹配的机会很大,并且由于模块假定它已经存在,所以没有添加该行。我会寻找一个更适合日志记录的 ansible 模块。我只在网络设备上运行ansible,不要做这样的事情,所以我没有好的建议。

问题已解决,谢谢您的建议。ios_facts 模块为每个主机收集事实。通过 hostvars 访问这些数据会将正确的信息保存到文件中。

    ---
- name: Cisco facts
  vars_prompt:
    - name: "site"
      prompt: "Which device would you like to check?"
      private: no
      default: all
  hosts: "{{ site }}"
  gather_facts: false
  connection: local

  tasks:
    - name: facts
      # Collect hardware facts from the device
      ios_facts:
        gather_subset: "hardware"
    - local_action:
        module: copy
        content: |
          Hostname,Model,SN,Version
          {% for host in groups [site] %}
          {{ hostvars[host].ansible_net_hostname }},{{ hostvars[host].ansible_net_model }},{{ hostvars[host].ansible_net_serialnum }},{{ hostvars[host].ansible_net_version }}
          {% endfor %}
        dest: /Users/slawomirkaczmarek/Downloads/test2.txt
      run_once: true  

您不需要像组中的主机一样多次运行任务,因此在代码中运行 run_once。