Используя Ansible к настройке пользователей: Изменить факты/расширять hostvars?

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

Таким образом, вот мой вызов. Я работаю над настройкой пользователей базы данных и хотел бы гибкий метод определения пользователей. Я встречаюсь с проблемой с использованием Джинджи для условных выражений и ansible циклов, потому что я делаю вещи, я думаю, что ansible был не обязательно разработан, чтобы сделать. Давайте запустимся с переменной:

mysql_users:
  - user: biggles
    password: boggles
    group: app
    database: some_db
  - user: boogers
    password: boogers
    hosts:
      - "12.34.56.78"
      - "12.34.56.79"
      - "12.34.56.80"
    database: another_db

Я хотел бы взять group введите первый объект и разверните его в список IP-адресов (как во втором объекте). group относится к группе хостов ansible. Чтобы сделать это, у меня есть это:

- name: Expand Mysql users hosts from their group name
  set_fact:
  args:
    mysql_users_dirty:
      user: "{{ item }}"
      hosts: "{{ groups[item.group | default('')] | default(item.hosts) }}"
  with_items: mysql_users
  register: mysql_users_results
  # when: item.group is defined | default(false)

- name: Map fact result list to correct ansible fact
  set_fact:
    mysql_users_expanded: "{{ mysql_users_results.results | map(attribute='ansible_facts.mysql_users_dirty') | list }}"

Это преобразовывает mysql_users в mysql_users_expanded:

mysql_users_expanded:
  - hosts:
      - "23.34.56.78"
      - "23.34.56.79"
      - "23.34.56.80"
    user:
      user: biggles
      password: boggles
      group: app
      database: some_db
  - hosts:
      - "12.34.56.78"
      - "12.34.56.79"
      - "12.34.56.80"
    user: 
      user: boogers
      password: boogers
      database: another_db
      hosts:
        - "12.34.56.78"
        - "12.34.56.79"
        - "12.34.56.80"

И затем мы добавляем пользователей:

- name: Create/assign additional database users to db and grant permissions (group hosts)
  mysql_user: name="{{ item.0.user.user }}"
              password="{{ item.0.user.password }}"
              host="{{ hostvars[ item.1 ]['ansible_' + private_iface ]['ipv4']['address'] | default(item.1) }}"
              priv="{{ item.0.user.database }}.*:{{ item.0.user.priv | default('ALL')}}"
              state=present
              login_host="localhost"
              login_user=root
              login_password="{{ mysql_root_password }}"
  with_subelements:
    - mysql_users_expanded
    - hosts
  when: item.1 is defined | default(false)

У меня есть это движение, но ansible вопли во мне говорящий это не могут найти "12.34.56.78", потому что это пытается использовать тот IP-адрес в качестве ключа к поиску хост в hostvars. Я испытываю затруднения при нахождении лучшего способа обработать поиск IP-адреса и спасти отказавшие поиски.

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

2
задан 3 June 2015 в 20:49
2 ответа

Я обнаружил эта полезная ветка и в итоге создала шаблон файла var локально, а затем загрузила его в playbook. Это позволило мне использовать больше логики при создании файла var.

1
ответ дан 3 December 2019 в 12:46

Вероятно, это можно было бы решить с помощью фильтров карт и списков, как это было описано во втором примере здесь:

http://docs.ansible.com/ansible/set_fact_module.html

# Example setting host facts using complex arguments
- set_fact:
     one_fact: something
     other_fact: "{{ local_var * 2 }}"
     another_fact: "{{ some_registered_var.results | map(attribute='ansible_facts.some_fact') | list }}"

Здесь я углубляюсь немного глубже: http://smileytechadventures.blogspot.com/2015/07/ansible-filter-results.html

0
ответ дан 3 December 2019 в 12:46

Теги

Похожие вопросы