staging.inyokaproject.org

Ansible Playbook: Problem mit zugriff auf einen Wert

Status: Ungelöst | Ubuntu-Version: Server 18.04 (Bionic Beaver)
Antworten |

peddy

Avatar von peddy

Anmeldungsdatum:
31. Oktober 2006

Beiträge: 162

Hallo,

ich mache meine ersten Gehversuche mit Ansible und möchte ein Playbook schreiben.

Das habe ich bereits:

---

- hosts: kolumbus
  become: yes

  tasks:
  - name: Copy RPM
    copy:
      src: "{{ item }}"
      dest: /tmp
    with_fileglob:
      - /opt/omd/versions/default/share/check_mk/agents/check-mk-agent-*.noarch.rpm
    register: copied_file

  - debug: var=copied_file

Ausgabe von Debug:

TASK [debug] **********************************************************************************************************************************************************************************
ok: [kolumbus] => {
    "copied_file": {
        "changed": false,
        "msg": "All items completed",
        "results": [
            {
                "_ansible_ignore_errors": null,
                "_ansible_item_result": true,
                "_ansible_no_log": false,
                "_ansible_parsed": true,
                "changed": false,
                "checksum": "55ae455adc639f9cfca738683b5955f32e78d2db",
                "dest": "/tmp/check-mk-agent-1.5.0p5-1.noarch.rpm",
                "diff": {
                    "after": {
                        "path": "/tmp/check-mk-agent-1.5.0p5-1.noarch.rpm"
                    },
                    "before": {
                        "path": "/tmp/check-mk-agent-1.5.0p5-1.noarch.rpm"
                    }
                },
                "failed": false,
                "gid": 0,
                "group": "root",
                "invocation": {
                    "module_args": {
                        "attributes": null,
                        "backup": null,
                        "content": null,
                        "delimiter": null,
                        "dest": "/tmp",
                        "diff_peek": null,
                        "directory_mode": null,
                        "follow": false,
                        "force": false,
                        "group": null,
                        "mode": null,
                        "original_basename": "check-mk-agent-1.5.0p5-1.noarch.rpm",
                        "owner": null,
                        "path": "/tmp/check-mk-agent-1.5.0p5-1.noarch.rpm",
                        "recurse": false,
                        "regexp": null,
                        "remote_src": null,
                        "selevel": null,
                        "serole": null,
                        "setype": null,
                        "seuser": null,
                        "src": "check-mk-agent-1.5.0p5-1.noarch.rpm",
                        "state": "file",
                        "unsafe_writes": null,
                        "validate": null
                    }
                },
                "item": "/opt/omd/versions/default/share/check_mk/agents/check-mk-agent-1.5.0p5-1.noarch.rpm",
                "mode": "0644",
                "owner": "root",
                "path": "/tmp/check-mk-agent-1.5.0p5-1.noarch.rpm",
                "secontext": "unconfined_u:object_r:user_home_t:s0",
                "size": 32768,
                "state": "file",
                "uid": 0
            }
        ]
    }
}

Wie komme ich an den Wert "dest": "/tmp/check-mk-agent-1.5.0p5-1.noarch.rpm" damit ich es in einem weiteren Task verwenden kann???

may24x

Anmeldungsdatum:
26. April 2016

Beiträge: 116

Hm ... ich versteh nicht ganz was du da machen willst ... also rate ich mal 😀

Du willst wahrscheinlich an die Infos von: copied_file (das wäre dann copied_file.dest) oder den facts ... aber wofür ?

Copy, kopiert Dateien von deinem Ansible-Hosts auf die Target Maschine. Und zwar nach /tmp (siehe Playbook) Daher die Frage: Was willst du machen

peddy

(Themenstarter)
Avatar von peddy

Anmeldungsdatum:
31. Oktober 2006

Beiträge: 162

Ich möchte ein RPM auf einen Zielrechner kopieren und anschließend installieren.

So könnte das fertige Playbook aussehen, jedoch kommt immer eine Fehlermeldung.

---

- hosts: kolumbus
  become: yes

  tasks:
  - name: Copy RPM
    copy:
      src: "{{ item }}"
      dest: /tmp
    with_fileglob:
      - /opt/omd/versions/default/share/check_mk/agents/check-mk-agent-*.noarch.rpm
    register: copied_file

  - name: Install check_mk
    yum:
      name: "{{ copied_file.dest }}"
      state: present

Und hier der Fehler:

fatal: [kolumbus]: FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: 'dict object' has no attribute 'dest'\n\nThe error appears to have been in '/home/support/ansible/playbooks/update-cmk-linux.yml': line 15, column 5, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n  - name: Install check_mk\n    ^ here\n"}

may24x

Anmeldungsdatum:
26. April 2016

Beiträge: 116

sorry für die verspätete Antwort ... Ist das nur ein RPM ?

peddy

(Themenstarter)
Avatar von peddy

Anmeldungsdatum:
31. Oktober 2006

Beiträge: 162

Ja, es ist nur eine Datei. Da sich die Versionsnummer jedoch ändern kann, versuche ich das Playbook so zu bauen das keine Änderungen nötig sind.

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

Du musst dich in der registrierten Variable halt bis zum gewünschten Wert durchhangeln - du hast da ein Dictionary, in dem eine Liste von Ergebnissen steckt, wenn man die Debug-Ausgabe einkürzt, sieht man das leichter:

1
2
3
4
5
6
7
    "copied_file": {
        "results": [
            {
                "path": "/tmp/check-mk-agent-1.5.0p5-1.noarch.rpm",
            }
        ]
    }

In dem Fall könntest du "{{ copied_file.results[0].path }}" verwenden.

may24x

Anmeldungsdatum:
26. April 2016

Beiträge: 116

Hm ... wie wär's damit:

---
- hosts: kolumbus
  become: yes

  tasks:
    - name: copy RPM to {{ inventory_hostname }}
      copy:
        src: /opt/omd/versions/default/share/check_mk/agents/check-mk-agent-*.noarch.rpm
        dest: /tmp
      register: out
   
    - debug:
        msg: "{{ out }}"

    - name: install RPM {{ out.dest }}
      yum:
        name: "{{ out.dest }}"
        state: present

Also ... das ganze ist nicht weiter getestet weil ich grad keine RHEL/CentOS Kiste hier hab. und Ubuntu das "apt" Modul benutzt

Ich hab's ein wenig anders aufgebaut als du ... ist aber Geschmackssache.

Zunächst kopiere ich die Datei auf die Ziel-Maschine. Die "return values" diese Vorgangs werden in "out" gespeichert.
Doch Achtung. Dank des "*" werden vielleicht mehrere RPM's selektiert ... d.h. es werden dann auch all diese installiert !
Zum besseren Verständnis hab ich daher den Debug noch mit eingebaut. Der ist aber für die weiter Funktion unerheblich

Die Info die du dann suchst befindet sich in "out.dest" ... und diese Information kannst du jetz für's installieren benutzen.

Schau mal ob das so geht 👍

Antworten |