Установите ANSI соединение по-разному в соответствии с заданным условием - PullRequest
0 голосов
/ 19 мая 2019

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

В этом конкретном случае существует туннель между двумя из них, и один маршрутизирует весь свой трафик через этот туннель, поэтому после настройки мне нужно использовать другой в качестве переключателя для подключения - но я могу представить множество других обстоятельств где вы, возможно, захотите изменить метод подключения mid-playbook, так же просто, как изменить пользователей / пароли.

Как мне использовать метод условного подключения?

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

Ответы [ 2 ]

1 голос
/ 20 мая 2019

Дьявол подробно описывает этот вопрос, но в целом я думаю, что использование add_host будет самым разборчивым способом сделать то, что вы хотите.Вы также можете изменить connection для каждой задачи или условно изменить connection для всей книги игр для этого хоста:

- hosts: all
  connection: ssh  # <-- or whatever bootstrap connection plugin
  gather_facts: no
  tasks:
    - command: echo "do something here"
      register: the_thing

    # now, you can either switch to the alternate connection per task:
    - command: echo "do the other thing"
      connection: lxd  # <-- or whatever
      when: the_thing is success

    # OR, you can make the alternate connection the default
    # for the rest of the current playbook
    - name: switch the rest of the playbook
      set_fact:
        ansible_connection: chroot
      when: the_thing is success

    # OR, perhaps run another playbook using the alternate connection
    # by adding the newly configured host to a special group
    - add_host:
        name: '{{ ansible_host }}'
        groups:
          - configured_hosts
      when: the_thing is success

# and then running the other playbook against configured hosts
- hosts: configured_hosts
  connection: docker   # <-- or whatever connection you want
  tasks:
    - setup:
0 голосов
/ 20 мая 2019

Я использую следующий фрагмент в качестве роли и вызываю эту роль в зависимости от ситуации, нужен ли мне Jumphost (бастион или прокси) или нет. Пример также приведен в комментариях. Эта роль может добавить несколько хостов одновременно. Поместите следующее содержимое в roles/inventory/tasks/main.yml

# Description: |
#   Adds given hosts to inventory.
# Inputs:
#   hosts_info:  |
#     (mandatory)
#     List of hosts with the structure which looks like this:
#
#     - name: <host name>
#       address: <url or ip address of host>
#       groups: [] list of groups to which this host will be added.
#       user: <SSH user>
#       ssh_priv_key_path: <private key path for ssh access to host>
#       proxy: <define following structure if host should be accessed using proxy>
#         ssh_priv_key_path: <priv key path for ssh access to proxy node>
#         user: <login user on proxy node>
#         host: <proxy host address>
#
# Example Usage:
#   - include_role:
#        name: inventory
#     vars:
#       hosts_info:
#         - name: controller-0
#           address: 10.100.10.13
#           groups:
#             - controller
#           user: user1
#           ssh_priv_key_path: /home/user/.ssh/id_rsa
#         - name: node-0
#           address: 10.10.1.14
#           groups:
#             - worker
#             - nodes
#           user: user1
#           ssh_priv_key_path: /home/user/.ssh/id_rsa
#           proxy:
#             ssh_priv_key_path: /home/user/jumphost_key.rsa.priv
#             user: jumphost-user
#             host: 10.100.10.13

- name: validate inventory input
  assert:
    that:
      - "single_host_info.name is defined"
      - "single_host_info.groups is defined"
      - "single_host_info.address is defined"
      - "single_host_info.user is defined"
      - "single_host_info.ssh_priv_key_path is defined"
  loop: "{{ hosts_info }}"
  loop_control:
    loop_var: single_host_info

- name: validate inventory proxy input
  assert:
    that:
      - "single_host_info.proxy.host is defined"
      - "single_host_info.proxy.user is defined"
      - "single_host_info.proxy.ssh_priv_key_path is defined"
  when: "single_host_info.proxy is defined"
  loop: "{{ hosts_info }}"
  loop_control:
    loop_var: single_host_info

- name: Add hosts to inventory without proxy
  add_host:
    groups: "{{ single_host_info.groups | join(',') }}"
    name: "{{ single_host_info.name }}"
    host: "{{ single_host_info.name }}"
    hostname: "{{ single_host_info.name }}"
    ansible_host: "{{ single_host_info.address }}"
    ansible_connection: ssh
    ansible_ssh_user: "{{ single_host_info.user }}"
    ansible_ssh_extra_args: "-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null"
    ansible_ssh_private_key_file: "{{ single_host_info.ssh_priv_key_path }}"
  loop: "{{ hosts_info | json_query(\"[?contains(keys(@), 'proxy') == `false`]\") | list }}"
  loop_control:
    loop_var: single_host_info

- name: Add hosts to inventory with proxy
  add_host:
    groups: "{{ single_host_info.groups | join(',') }}"
    name: "{{ single_host_info.name }}"
    host: "{{ single_host_info.name }}"
    hostname: "{{ single_host_info.name }}"
    ansible_host: "{{ single_host_info.address }}"
    ansible_connection: ssh
    ansible_ssh_user: "{{ single_host_info.user }}"
    ansible_ssh_extra_args: "-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null"
    ansible_ssh_private_key_file: "{{ single_host_info.ssh_priv_key_path }}"
    ansible_ssh_common_args: >-
      -o ProxyCommand='ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null
      -W %h:%p -q -i {{ single_host_info.proxy.ssh_priv_key_path }}
      {{ single_host_info.proxy.user }}@{{ single_host_info.proxy.host }}'
  loop: "{{ hosts_info | json_query(\"[?contains(keys(@), 'proxy') == `true`]\") }}"
  loop_control:
    loop_var: single_host_info
...