Ansible Playbook с использованием списков / словарей с одним или несколькими значениями - PullRequest
0 голосов
/ 12 марта 2019

Я хотел бы использовать Ansible для автоматизации создания пользователей OpenShift.

  • Один или несколько пользователей могут быть указаны с одним паролем каждый
  • Каждый пользователь будет присоединен к одному или несколькимgroups

Я сейчас тестирую со списками и подэлементами, и я близок.

файл vars

---

host_group: localhost
users:
  - username: jdoe
    password: tester123
    groups:
      - test-group1
  - username: jdosephina
    password: tester456
    groups:
      - test-group2
      - test-group3

test.yaml

---
- hosts: "{{ host_group | default('empty_group') }}"
  vars_files:
    - /etc/ansible/vars/openshift_user_creation_vars.yaml
  tasks:

  - name: Create user on master server
    debug:
      msg: "htpasswd -b /etc/origin/master/htpasswd {{ item[0].username }} {{ item[0].password }}"
    become: yes
    with_subelements:
      - "{{ users }}"
      - groups

  - name: Restart atomic service
    debug:
      msg: "systemctl restart atomic-openshift-master-api"
    become: yes

  - name: Add user to group
    debug:
      msg: "oc adm groups add-users {{ item[1] }} {{ item[0].username }}"
    with_subelements:
      - "{{ users }}"
      - groups

Проблема, с которой я столкнулся сейчас, заключается в том, что если указано несколько групп (для jdosephina, в этом примере), первая команда для создания пользователя также запускается несколько раз.

TASK [Create user on master server] *********************************************************************************************************************************************************************************************************
ok: [localhost] => (item=None) => {
    "msg": "htpasswd -b /etc/origin/master/htpasswd jdoe tester123"
}
ok: [localhost] => (item=None) => {
    "msg": "htpasswd -b /etc/origin/master/htpasswd jdosephina tester456"
}
ok: [localhost] => (item=None) => {
    "msg": "htpasswd -b /etc/origin/master/htpasswd jdosephina tester456"
}

TASK [Restart atomic service] ***************************************************************************************************************************************************************************************************************
ok: [localhost] => {
    "msg": "systemctl restart atomic-openshift-master-api"
}

TASK [Add user to group] ********************************************************************************************************************************************************************************************************************
ok: [localhost] => (item=None) => {
    "msg": "oc adm groups add-users test-group1 jdoe"
}
ok: [localhost] => (item=None) => {
    "msg": "oc adm groups add-users test-group2 jdosephina"
}
ok: [localhost] => (item=None) => {
    "msg": "oc adm groups add-users test-group3 jdosephina"
}

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

1 Ответ

0 голосов
/ 20 марта 2019

Мне нужно было изменить {{ item[0].username }} {{ item[0].password }} в блоке создания пользователя на {{ item.username }} {{ item.password }}, удалить - groups и изменить with_subelements на with_items.

Полная новая книга воспроизведения:

test.yaml

---
- hosts: "{{ host_group | default('empty_group') }}"
  vars_files:
    - /etc/ansible/vars/openshift_user_creation_vars.yaml
  tasks:

  - name: Create user on master server
    debug:
      msg: "htpasswd -b /etc/origin/master/htpasswd {{ item.username }} {{ item.password }}"
    become: yes
    with_items:
      - "{{ users }}"

  - name: Restart atomic service
    debug:
      msg: "systemctl restart atomic-openshift-master-api"
    become: yes

  - name: Add user to group
    debug:
      msg: "oc adm groups add-users {{ item[1] }} {{ item[0].username }}"
    with_subelements:
      - "{{ users }}"
      - groups
...