Ansible: что я делаю не так? Я хочу проверить, активен ли сервис (через shell, а не с помощью встроенных модулей), затем установить его.

Вопрос или проблема

У меня есть этот плейбук:

- name: push ssh key for all lxc
  hosts: proxmox_host
  vars:
    lxc_cts:
        - 100
        - 102
        - 106
        - 107
        - 108
        - 109
        - 111
        - 112
        - 113
        - 114
  tasks:
    - name: check ssh
      command: pct exec {{ item }} -- rpm -q openssh-server
      register: ssh_check
      ignore_errors: true
      loop: '{{ lxc_cts }}'

    - name: SSH status
      debug:
        var: ssh_check

    - name: install openssh if not installed
      command: pct exec {{ item }} -- dnf install -y openssh-server
      when: ssh_check.results[ansible_loop.index0].rc != 0      
      loop: '{{ lxc_cts }}'


    - name: enable sshd
      command: pct exec {{ item }} -- dnf enable --now sshd
      loop: '{{ lxc_cts }}'

    - name: copy key
      command: pct push {{ item }} /root/.ssh/id_rsa.pub /root/.ssh/authorized_keys
      delegate_to: proxmox_host
      loop: '{{ lxc_cts }}'

    - name: perms for dir
      command: pct exec {{ item }} -- chmod 700 /root/.ssh
      loop: '{{ lxc_cts }}'

    - name: perms for file
      command: pct exec {{ item }} -- chmod 600 /root/.ssh/authorized_keys
      loop: '{{ lxc_cts}}'

    - name: (debug) SSH is already installed!
      debug:
        msg: 'SSH is already installed on CT {{ item }}!'
      when: ssh_check.results|length > item|int and ssh_check.results[item|int].rc != 0
      with_items: '{{ lxc_cts }}'

Я пробую все, что предлагает ИИ, читаю документацию, но все еще не могу понять ошибку в логах.

2025-01-09 21:09:12,656 p=3537536 u=root n=ansible | fatal:
[proxmox_host]: FAILED! => {“msg”: “The conditional check
‘ssh_check.results[ansible_loop.index0].rc != 0’ failed. The error
was: error while evaluating conditional
(ssh_check.results[ansible_loop.index0].rc != 0): list object has no
element AnsibleUndefined(hint=None, obj=missing, name=”ansible_loop”).
list object has no element AnsibleUndefined(hint=None, obj=missing,
name=”ansible_loop”)\n\nThe error appears to be in
‘/root/ansible/keypush_with_check.yml’: line 26, column 7, 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 openssh if not
installed\n ^ here\n”}

Я думаю, это логическая ошибка, но ИИ не может ее объяснить и исправить, может быть, кто-то здесь может помочь мне?

Вместо ansible_loop.index0 вам нужно использовать loop_control и index_var:

- name: install openssh if not installed
  command: pct exec {{ item }} -- dnf install -y openssh-server
  when: ssh_check.results[my_idx].rc != 0      
  loop: '{{ lxc_cts }}' 
  loop_control:
    index_var: my_idx

Ответ или решение

Конечно, я помогу вам разобраться в проблеме с вашей Ansible плейбуком и найдём решение. Давайте рассмотрим, в чем заключается логическая ошибка и как можно её исправить.

Проблема и её анализ

В вашей задаче вы хотите проверить, установлен ли сервис (в данном случае openssh-server) в контейнерах LXC, и установить его в случае отсутствия. Однако ошибка возникает из-за неправильного использования переменной индекса в условии.

Конкретная ошибка: ansible_loop.index0 не определена. В Ansible, начиная с версии 2.8, ansible_loop и ansible_loop.index стали недоступными, вместо этого внедрена новая методология с использованием loop_control и index_var.

Исправление

  1. Применение loop_control и index_var

    Вместо использования ansible_loop.index0, вы должны использовать loop_control блок с определением index_var, например:

    - name: install openssh if not installed
     command: pct exec {{ item }} -- dnf install -y openssh-server
     when: ssh_check.results[my_idx].rc != 0      
     loop: '{{ lxc_cts }}' 
     loop_control:
       index_var: my_idx

    Здесь my_idx будет использоваться для отслеживания текущего индекса в ssh_check.results.

  2. Правильная проверка статуса

    Необходимо также убедиться, что проверка статуса установки работает корректно. После выполнения команды rpm -q openssh-server, если пакет не установлен, rc будет равен ненулевому значению. Убедитесь, что вы корректно проверяете возвращаемый код (rc) команд для всех элементов.

Рекомендации

  • Логирование и отладка: Используйте debug для вывода результатов выполнения и понимания, как идет воркфлоу.

  • Избегайте дублирования: Убедитесь, что каждая команда выполняется только тогда, когда это действительно необходимо, чтобы сократить время выполнения и снизить риски возникновения ошибок.

  • Документация: Всегда держите документацию под рукой, Ansible имеет хорошую документацию, особенно раздел о новых функциях и изменение устоявшихся стандартов.

Заключение

Мы решили проблему с логической ошибкой, направив ваше внимание на правильное использование индексации внутри Ansible плейбуков. Уверен, что внедрение указанных изменений поможет вам успешно выполнить вашу задачу. Для более глубокого понимания рекомендую периодически проверять официальные обновления Ansible и документацию, чтобы быть в курсе последних изменений и улучшений.

Если у вас будут дополнительные вопросы или потребуется помощь, не стесняйтесь задавать вопросы!

Оцените материал
Добавить комментарий

Капча загружается...