Добавьте условные выражения к роли Ansible для выполнения заданий Идемпотента - PullRequest
0 голосов
/ 14 марта 2020

Я довольно долго искал и пробовал много вариантов и похожих ответов, но безуспешно. Надеюсь, это что-то простое, что мне не хватает.

Ansible 2.9.6

Я создаю множество пьес, которые имеют большой набор пользовательских ролей для моих клиентов. Я хочу, чтобы все логи c не попадали в игровые книжки и поместили эти логи c в роли, чтобы обеспечить максимальное повторное использование. По сути, я просто хочу добавить шаблонные сборники пьес для простых «ролей», запускаемых через теги, с некоторыми переопределениями переменных здесь и там.

Моя проблема в том, что я не могу сделать некоторые роли идемпотентными, используя условия - условия не работают. Я получаю сообщение об ошибке:

fatal: [localhost]: FAILED! => {"msg": "The conditional check 'homebrew_base.rc != 0' failed.
The error was: error while evaluating conditional (homebrew_bash.rc != 0): 'homebrew_bash' is undefined

The error appears to be in '/Users/eric/code/client1/provisioning/roles/bash/tasks/main.yaml': line 12, column 3, but may
be elsewhere in the file depending on the exact syntax problem.

The offending line appears to be:


- name: Change shell (chsh) for macOS to homebrew managed version
  ^ here
"}

Ниже приведен стандартный код для моих playbooks:

# ./playbook.yaml

---
- name: Provisioning
  hosts: localhost
  connection: local

  pre_tasks:
    - include_vars: "{{ item }}"
    with_fileglob:
      - "{{ playbook_dir }}/vars/global.yaml"
  tags: always

tasks:

  - name: Use homebrew bash binary
    include_role:
      name: bash
    tags: bash

Выше приведено довольно немного усеченное, но не хватает только дополнительных файлов var и целая куча include_role s.

Ниже приведен мой ролевый файл в полностью, хотя. Они в основном не проверены из-за ошибки, которую я продолжаю получать.

# ./roles/bash/tasks/main.yaml

---
- name: Check /etc/shells contains "/usr/local/bin/bash"
  command: grep -Fxq "/usr/local/bin/bash" /etc/shells
  register: homebrew_bash
  ignore_errors: True
  changed_when:
    - homebrew_bash.rc != 0

- name: Check that homebrew installed /usr/local/bin/bash
  stat:
    path: /usr/local/bin/bash
  register: homebrew_bash_binary

- name: Change shell (chsh) for macOS to homebrew managed versoin
  tags: bash, chsh
  shell: chsh -s /usr/local/bin/bash
  become: yes
  when:
    - homebrew_bash.rc != 0
    - homebrew_bash_binary.stat.exists = True

PS: я планирую абстрагировать эти жестко закодированные пути в roles/bash/defaults/. Но мне нужно, чтобы он сначала работал до этого.

Ps2: Если есть лучший способ использовать фильтр содержимого (вместо взлома grep), я весь в ушах.

Я пытался:

  • сделать отдельный tasks/chsh.yaml и использовать команду include: для вызова этой задачи в роли. Когда я делаю это, я получаю странную ошибку, сообщающую мне , что переменная не определена - в tasks/chsh.yaml - даже если я проверяю переменную в tasks/main.yaml! Это кажется неправильным.
  • с использованием кавычек в различных местах в условиях
  • , комментируя каждое условие: оба дают одинаковую ошибку, просто различаются enet имен.

Опять же, я пытаюсь сохранить этот лог c только в ролях, а не в сборнике пьес.

Спасибо!

1 Ответ

0 голосов
/ 14 марта 2020

Разобрался. Мне не хватало "тегов" на условных обозначениях!

# ./roles/bash/tasks/main.yaml

---
- name: Check /etc/shells contains "/usr/local/bin/bash"
  tags: bash, chsh
  command: grep -Fxq "/usr/local/bin/bash" /etc/shells
  register: homebrew_bash
  ignore_errors: True
  changed_when:
    - homebrew_bash.rc != 0

- name: Check that homebrew installed /usr/local/bin/bash
  tags: bash, chsh
  stat:
    path: /usr/local/bin/bash
  register: homebrew_bash_binary

- name: Change shell (chsh) for macOS to homebrew managed versoin
  tags: bash, chsh
  shell: chsh -s /usr/local/bin/bash
  become: yes
  when:
    - homebrew_bash.rc != 0
    - homebrew_bash_binary.stat.exists = True
...