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

Как я могу установить факт, основанный на существовании файла, используя параметр для имени файла?

Это то, что я придумал для одного хоста

- name: Check for Let's Encrypt certificate
  block:
    - name: Set default for variable
      set_fact:
        use_letsencrypt: false

    - name: Get stat for cert file
      stat:
        path: /etc/letsencrypt/live/{{ hostname }}/cert.pem
      register: certificate_file

    - name: Set letsencrypt to true if certificate exists
      set_fact:
        use_letsencrypt: true
      when: certificate_file.stat.exists

Как я могу сделать это более СУХИМ? Передайте ему имя хоста, и он вернет значение true или false для переменной.

Изменить: дополнительная информация, чтобы было понятнее. Уже нормально работает как есть.

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

Я использую переменную use_letsencrypt в разных файлах конфигурации почты и Интернета и хочу сказать: «Я занят настройкой конфигурации для example.com, есть ли у меня для нее сертификат».

ХОРОШО. Итак, поигравшись и прочитав еще несколько документов, я нашел ответ.

Вы можете поместить приведенный выше фрагмент в отдельную роль и просто включать его каждый раз, когда он вам нужен.

- name: Set use_letsencrypt
  include_role:
    name: has_letsencrypt
  vars:
    hostname: example.com

Таким образом, он действует как модуль, и вы просто передаете ему var. Теперь я могу использовать этот фрагмент несколько раз в разных сборниках.

Я не уверен, правильно ли я вас понял.

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

Чтобы временно передать переменную, вы можете использовать параметр -e в ansible-playbook:

  -e EXTRA_VARS, --extra-vars=EXTRA_VARS
                        set additional variables as key=value or 
                        YAML/JSON, if filename prepend with @

Итак, вы бы запустили ansible-playbook, например:

ansible-playbook -e "hostname=YourHostname" your.yaml

И если вы не хотите запускаться на всех узлах, указанных в playbook / роли, вы также можете ограничить его из командной строки. Используйте параметр -l:

  -l SUBSET, --limit=SUBSET
                        further limit selected hosts to an additional 
                        pattern

Тогда команда будет такой:

ansible-playbook -e "hostname=YourHostname" -l YourHostname your.yaml

Если вы хотите, чтобы ansible получал локальное имя хоста, это доступно через модуль настройки. Поднос для использования {{ansible_hostname}} вместо вашего {{hostname}}.

Если вы хотите увидеть полный список переменных, предоставляемых модулем установки, просто запустите:

ansible -m setup <your host>