Ansible: получение значений из результатов - PullRequest
0 голосов
/ 21 января 2020

У меня проблемы с получением переменных из ansible. Я мог бы неправильно все это понимать, но;

У меня есть игра, я создаю 3 mysql экземпляров, которые я хотел бы получить, установив новый root проход от временного прохода в mysql log.

Я могу сделать это с одним экземпляром, но когда я пытаюсь провести l oop через мои 3 экземпляра, это убивает меня.

Игра:




   - name: "Percona new install password retrieval"
     block:
   - name: Parse temporary password from mysql log
     become: yes
     shell: "cat /var/log/mysql-instance{{ item }}/error.log | sed -n 's/.*temporary password is generated for root@localhost: //p'"
     register: temppass
     with_sequence: start=1 end=3
     tags: hest888

   - debug: var=temppass.results
     tags: hest888

это дает временные пароли и хранит в переменной temppass. temppass.results показывают:

  ok: [X-sql08] => {
      "temppass.results": [
          {
              "_ansible_ignore_errors": null,
              "_ansible_item_label": "1",
              "_ansible_item_result": true,
              "_ansible_no_log": false,
              "_ansible_parsed": true,
              "changed": true,
              "cmd": "grep 'A temporary password is generated for root@localhost' /var/log/mysql-instance1/error.log | awk -F ' ' '{print $(NF)}'",
              "delta": "0:00:00.004820",
              "end": "2020-01-21 16:37:54.164040",
              "failed": false,
              "invocation": {
                  "module_args": {
                      "_raw_params": "grep 'A temporary password is generated for root@localhost' /var/log/mysql-instance1/error.log | awk -F ' ' '{print $(NF)}'",
                      "_uses_shell": true,
                      "argv": null,
                      "chdir": null,
                      "creates": null,
                      "executable": null,
                      "removes": null,
                      "stdin": null,
                      "warn": true
                }
            },
            "item": "1",
            "rc": 0,
            "start": "2020-01-21 16:37:54.159220",
            "stderr": "",
            "stderr_lines": [],
            "stdout": "(7FJWDd8uEfs",
            "stdout_lines": [
                "(7FJWDd8uEfs"
            ]
        },
        {
            "_ansible_ignore_errors": null,
            "_ansible_item_label": "2",
            "_ansible_item_result": true,
            "_ansible_no_log": false,
            "_ansible_parsed": true,
            "changed": true,
            "cmd": "grep 'A temporary password is generated for root@localhost' /var/log/mysql-instance2/error.log | awk -F ' ' '{print $(NF)}'",
            "delta": "0:00:00.004983",
            "end": "2020-01-21 16:37:54.621576",
            "failed": false,
            "invocation": {
                "module_args": {
                    "_raw_params": "grep 'A temporary password is generated for root@localhost' /var/log/mysql-instance2/error.log | awk -F ' ' '{print $(NF)}'",
                    "_uses_shell": true,
                    "argv": null,
                    "chdir": null,
                    "creates": null,
                    "executable": null,
                    "removes": null,
                    "stdin": null,
                    "warn": true
                }
            },
            "item": "2",
            "rc": 0,
            "start": "2020-01-21 16:37:54.616593",
            "stderr": "",
            "stderr_lines": [],
            "stdout": "mwY9h1y17r+D",
            "stdout_lines": [
                "mwY9h1y17r+D"
            ]
        },
        {
            "_ansible_ignore_errors": null,
            "_ansible_item_label": "3",
            "_ansible_item_result": true,
            "_ansible_no_log": false,
            "_ansible_parsed": true,
            "changed": true,
            "cmd": "grep 'A temporary password is generated for root@localhost' /var/log/mysql-instance3/error.log | awk -F ' ' '{print $(NF)}'",
            "delta": "0:00:00.004704",
            "end": "2020-01-21 16:37:55.073540",
            "failed": false,
            "invocation": {
                "module_args": {
                    "_raw_params": "grep 'A temporary password is generated for root@localhost' /var/log/mysql-instance3/error.log | awk -F ' ' '{print $(NF)}'",
                    "_uses_shell": true,
                    "argv": null,
                    "chdir": null,
                    "creates": null,
                    "executable": null,
                    "removes": null,
                    "stdin": null,
                    "warn": true
                  }
              },
              "item": "3",
              "rc": 0,
              "start": "2020-01-21 16:37:55.068836",
              "stderr": "",
              "stderr_lines": [],
              "stdout": "GZ!xq=ard9mz",
              "stdout_lines": [
                  "GZ!xq=ard9mz"
              ]
          }
      ]
    }


ок ... итак, в temppass.results есть вся информация, которая мне нужна, но я не могу ее найти?

что бы я хотел сделать (в идеальном мире, полностью выровненном, чтобы удовлетворить все мои прихоти) - это получить результат "item" и "stdout" из temppass.results и использовать их в качестве входных данных для раздела обновления пароля.

   - name: Set root password using temp password to log in
     shell: 'mysql -e --protocol=TCP -P {{ item.port }}"ALTER USER ''root''@''localhost'' \
             IDENTIFIED WITH mysql_native_password AS ''{{ mysql_root_hash }}'';" \
             --connect-expired-password -uroot -p"{{ temppass_{{ item.instance }}.stdout }}"'
     with_items:
       - { instance: 1, port: 3306 }
       - { instance: 2, port: 3307 }
       - { instance: 3, port: 3308 }
     tags: hest888

или что-то в этом роде.

Я обнаружил, что двойной {{в двойном {{не работает, но надеюсь, вы понимаете, что я пытаюсь сделать.

Есть идеи?

1 Ответ

0 голосов
/ 22 января 2020

Ниже приведен ответ, использующий несколько иной подход, который не требует выбора элементов в ваших результатах на основе его индекса. Если вы все еще хотите понять, как писать выражения для таких элементов, вы можете взглянуть на этот другой ответ , где есть объяснение.


  1. Создать var в вашей игровой книге, в которой будут храниться данные mysql экземпляров (вместо жесткого кодирования в последнем задании l oop, мы будем использовать это повторно)
    mysql_instances:
      - instance: 1
        port: 3306
      - instance: 2
        port: 3307
      - instance: 3
        port: 3308
    
  2. Используйте этот var вместо диапазон до l oop по вашим файлам журнала. Обратите внимание, что когда вы отлаживаете результат, поле item внутри каждого результата теперь отображается как текущий элемент (т. Е. Определение экземпляра * 1028), зацикленный на

    - name: Parse temporary password from mysql log
      become: yes
      shell: "cat /var/log/mysql-instance{{ item.instance }}/error.log | sed -n 's/.*temporary password is generated for root@localhost: //p'"
      register: temppass
      loop: "{{ mysql_instances }}"
    
  3. Теперь у вас есть вся необходимая информация в каждом temppass.results (захваченный пароль, номер экземпляра и порт). Вам просто нужно l oop, чтобы установить пароль. (Примечание: я сохранил ваш пример, но вы, возможно, захотите взглянуть на mysql_user модуль вместо использования оболочки)

    - name: Set root password using temp password to log in
      shell: 'mysql -e --protocol=TCP -P {{ item.item.port }}"ALTER USER ''root''@''localhost'' \
             IDENTIFIED WITH mysql_native_password AS ''{{ mysql_root_hash }}'';" \
             --connect-expired-password -uroot -p"{{ item.stdout }}"'
     loop: "{{ temppass.results }}"
    
...