0

Фон,анзибль работает одна команда из многих локально в цикле

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

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

--- 
- hosts: tag_Ansible_CLOUD_QA 

    vars_files: 
    - ../users/qa.yml 
    - ../users/groups.yml 
    remote_user: ec2-user 
    sudo: yes 

    tasks: 

    - name: Create groups 
    group: name="{{ item.key }}" state=present 
    with_dict: "{{ user_groups }}" 

    - name: Create remote users QA 
    user: name="{{ item.key }}" comment="user" group=users groups="qa" 
    with_dict: "{{ qa_users }}" 

    - name: Erase previous authorized keys QA 
    shell: rm -rf /home/"{{ item.key }}"/.ssh/authorized_keys 
    with_dict: "{{ qa_users }}" 

    - name: Add public keys to remote users QA 
    local_action: 
     find: paths="{{'/opt/pubkeys/2016/q2/'}}" patterns="{{ item.key }}" 
     register: result 
    authorized_key: user="{{ item.key }}" key="{{ lookup('file', result) }}" 
    with_dict: "{{ qa_users }}" 

Hash:

qa_users: 
    user1: 
    name: User 1 
    user2: 
    name: User 2 

ответ

1

Вы зубрежки две задачи в один элемент задачи в этой окончательной задаче так анзибль не будет нравится.

Расщепления задачи правильно должен работать:

- name: Find keys 
    local_action: find paths="{{'/opt/pubkeys/2016/q2/'}}" patterns="{{ item.key }}" 
    register: result 
    with_dict: "{{ qa_users }}" 

    - name: Add public keys to remote users QA 
    authorized_key: user="{{ item.0.key }}" key="{{ lookup('file', item.1.stdout) }}" 
    with_together: 
     - "{{ qa_users }}" 
     - result 

Вторая задача затем петли над словарем и результатом от предыдущей задачи, используя with_together петли, которая продвигается через две структуры данных на этапе.

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

Если вы посмотрите на то, что ваши задачи здесь пытаются сделать вы могли бы заменить его более просто с чем-то вроде этого:

- name: Add public keys to remote users QA 
    authorized_key: user="{{ item.key }}" key="{{ lookup('file', '/opt/pubkeys/2016/q2/' + item.key) }}" 
    with_dict: 
     - "{{ qa_users }}" 

Вы также можете удалить thid задачи, где разъединяются предыдущие ключи пользователя по просто используя параметр authorized_keys модуля exclusive:

- name: Add public keys to remote users QA 
    authorized_key: user="{{ item.key }}" key="{{ lookup('file', '/opt/pubkeys/2016/q2/' + item.key) }}" exclusive=yes 
    with_dict: 
     - "{{ qa_users }}" 

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

+0

Спасибо за обратную связь и предложения я, вероятно, буду следовать ему, но мне очень интересно, почему я получаю эту ошибку при запуске local_action: - name: Найти ключи, ОШИБКА: Синтаксис Ошибка при загрузке сценария YAML, credentials/distribute-public-key.yml Примечание: Ошибка может появиться до этой позиции: строка 41, столбец 17 - имя: Найти ключи local_action: ^ –

+0

@DmitryR вы можете попробовать сейчас с моим редактированием. Не выявил вашу начальную проблему с синтаксисом вокруг local_action. Это все еще непроверенный ум, так что все равно может потерпеть неудачу. – ydaetskcoR

-1

Спасибо @ydaetskcoR для обмена правильного подхода, следующее решение было динамическим общественным распределение ключей для меня, когда файлы, хранящиеся на локальном компьютере и на удаленных Предоставлен EC2 машинах:

--- 
- hosts: tag_Ansible_CLOUD_QA 

    vars_files: 
    - ../users/groups.yml 
    - ../users/qa.yml 
    remote_user: ec2-user 
    become: yes 
    become_method: sudo 

    tasks: 
    - name: Find user matching key files 
    become_user: jenkins 
    local_action: find paths="{{'/opt/pubkeys/2016/q1/'}}" patterns="{{ '*' + item.key + '*' }}" 
    register: pub_key_files 
    with_dict: "{{ qa_users }}" 

    - name: Create groups 
    group: name="{{ item.key }}" state=present 
    with_dict: "{{ user_groups }}" 

    - name: Allow test users to have passwordless sudo 
    lineinfile: "dest=/etc/sudoers state=present regexp='^%{{ item.key }} ALL=.*ALL.* NOPASSWD: ALL' line='%{{ item.key }} ALL=(ALL) NOPASSWD: ALL'" 
    with_dict: "{{ user_groups }}" 

    - name: Create remote users qa 
    user: name="{{ item.key }}" comment="user" group=users groups="qa" 
    with_dict: "{{ qa_users }}" 

    - name: Add public keys to remote users qa 
    #debug: "msg={{ 'User:' + item.item.key + ' KeyFile:' + item.files.0.path }}" 
    authorized_key: user="{{ item.item.key }}" key="{{ lookup('file', item.files.0.path) }}" exclusive=yes 
    with_items: "{{ pub_key_files.results }}" 

Это команда линии, чтобы получить динамические инвентаризации на основе EC2 Метки:

ansible-playbook -i inventory/ec2.py --private-key <path to your key file> --extra-vars '{"QUATER":"q1"}' credentials/distribute-public-key.yml 
+0

вы не должны отвечать как вопрос ...вы прокомментируете ответ – confiq

+0

@confiq На вопрос, который я использовал, вы ответите на кнопку, а также вы не можете вставить код, так как количество символов ограничено для комментариев и не выделяется код выделения линии, я предположил, что любой, кто ищет такое решение по достоинству оценит ответ, который решает этот случай. –

Смежные вопросы