Назад | Перейти на главную страницу

Ansible: доступ к переменным и дамп в файл CSV

vars:

servers:
  - name: centos
    port: 22

tasks:

- name: Check if remote port
  wait_for: host={{ item.name }} port={{ item.port }} timeout=1
  ignore_errors: True
  register: out
  with_items: "{{ servers }}"

- debug: var=out

- name: Save remote port   
  shell: echo "{{ item.host }}" > /tmp/x_output.csv
  args:
    executable: /bin/bash
  with_items: "{{ out.results }}"

ВЫВОД

PLAY [all] **************************************************************************************************************************

TASK [Gathering Facts] **************************************************************************************************************
ok: [centos]

TASK [telnet : Check if remote port] ************************************************************************************************
ok: [centos] => (item={u'name': u'centos', u'port': u'22'})

TASK [telnet : debug] ***************************************************************************************************************
ok: [centos] => {
    "out": {
        "changed": false,
        "msg": "All items completed",
        "results": [
            {
                "_ansible_ignore_errors": true,
                "_ansible_item_result": true,
                "_ansible_no_log": false,
                "_ansible_parsed": true,
                "changed": false,
                "elapsed": 0,
                "failed": false,
                "invocation": {
                    "module_args": {
                        "active_connection_states": [
                            "ESTABLISHED",
                            "FIN_WAIT1",
                            "FIN_WAIT2",
                            "SYN_RECV",
                            "SYN_SENT",
                            "TIME_WAIT"
                        ],
                        "connect_timeout": 5,
                        "delay": 0,
                        "exclude_hosts": null,
                        "host": "centos",
                        "msg": null,
                        "path": null,
                        "port": 22,
                        "search_regex": null,
                        "sleep": 1,
                        "state": "started",
                        "timeout": 1
                    }
                },
                "item": {
                    "name": "centos",
                    "port": "22"
                },
                "path": null,
                "port": 22,
                "search_regex": null,
                "state": "started"
            }
        ]
    }
}

TASK [telnet : Save remote port] ****************************************************************************************************
fatal: [centos]: FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: 'dict object' has no attribute 'host'\n\nThe error appears to have been in '/home/xxxxxx/ansible/tso-playbook/roles/telnet/tasks/main.yml': line 17, column 3, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n- name: Save remote port\n  ^ here\n\nexception type: <class 'ansible.errors.AnsibleUndefinedVariable'>\nexception: 'dict object' has no attribute 'host'"}
        to retry, use: --limit @/home/xxxxxxx/ansible/tso-playbook/telnet.retry

PLAY RECAP **************************************************************************************************************************
centos                     : ok=3    changed=0    unreachable=0    failed=1

Примечание: я публикую здесь впервые, не знаю, как правильно исправить построчно ... Я просто хочу получить доступ к out.host, который является 'centos', и сохранить его в файле csv, конечно, мне нужно чтобы сделать больше, но это первое, что мне нужно сделать, пожалуйста, помогите! Спасибо.

---

- name: Save remote port   
  shell: echo {{ item.changed }} > /tmp/x_output.csv

  args:
    executable: /bin/bash

  with_items: "{{ out.results }}"

Это единственное, на что я могу сослаться, item.changed, который имеет значение "False", а на все остальные я не могу.

Зачем?

Как вы можете видеть в опубликованной вами отладке, в отличие от changed ключ, нет host ключ в элементах results список.

Есть один внутри invocation словарь, так что:

shell: echo "{{ item.invocation.module_args.host }}" > /tmp/x_output.csv

Хотя это значение, которое вы определили сами, а не возвращаемое значение.