2015-09-08 2 views
0

Я пытаюсь зарегистрировать вывод команды оболочки в свойство элемента внутри списка элементов.Ansible - зарегистрировать переменную для свойства item в цикле

Это происходит во время цикла, но не регистрирует свойства. После запуска задачи свойство все еще показывает значение none. Мне интересно, что я делаю что-то неправильно? Или есть способ сделать это?

Переменные:

users: 
    - username: someguy 
    description: "Some Guy" 
    groups: ['sudo', 'guy'] 
    new_id: 6001 
    old_uid: 
    old_gid: 
    user_exists: 
    password: waffles 
    - username: somedude 
    description: "Some Dude" 
    groups: ['dude'] 
    new_id: 6002 
    old_uid: 
    old_gid: 
    user_exists: 
    password: toast 

Задачи

--- 

- name: Check if user exists 
    shell: /usr/bin/getent passwd {{ item.username }} | /usr/bin/wc -l | tr -d ' ' 
    with_items: "{{ users }}" 
    register: item.user_exists 

- name: Check user current UID 
    shell: /usr/bin/id -u {{ item.username }} 
    with_items: "{{ users }}" 
    register: item.old_uid 
    when: item.user_exists == 1 

- name: Check user current GID 
    shell: /usr/bin/id -g {{ item.username }} 
    with_items: "{{ users }}" 
    register: item.old_gid 
    when: item.user_exists == 1 

Выходные

TASK: [users | Check if user exists] ****************************************** 
changed: [bserver] => (item={'username': 'someguy', 'password': 'waffles', 'description': 'Some Guy', 'new_id': 6001, 'groups': ['sudo', 'guy'], 'user_exists': None, 'old_uid': None, 'old_gid': None}) 
changed: [aserver] => (item={'username': 'someguy', 'password': 'waffles', 'description': 'Some Guy', 'new_id': 6001, 'groups': ['sudo', 'guy'], 'user_exists': None, 'old_uid': None, 'old_gid': None}) 
changed: [aserver] => (item={'username': 'somedude', 'password': 'toast', 'description': 'Some Dude', 'new_id': 6002, 'groups': ['dude'], 'user_exists': None, 'old_uid': None, 'old_gid': None}) 
changed: [bserver] => (item={'username': 'somedude', 'password': 'toast', 'description': 'Some Dude', 'new_id': 6002, 'groups': ['dude'], 'user_exists': None, 'old_uid': None, 'old_gid': None}) 

TASK: [users | Check user current UID] **************************************** 
skipping: [aserver] => (item={'username': 'someguy', 'password': 'waffles', 'description': 'Some Guy', 'new_id': 6001, 'groups': ['sudo', 'guy'], 'user_exists': None, 'old_uid': None, 'old_gid': None}) 
skipping: [aserver] => (item={'username': 'somedude', 'password': 'toast', 'description': 'Some Dude', 'new_id': 6002, 'groups': ['dude'], 'user_exists': None, 'old_uid': None, 'old_gid': None}) 
skipping: [bserver] => (item={'username': 'someguy', 'password': 'waffles', 'description': 'Some Guy', 'new_id': 6001, 'groups': ['sudo', 'guy'], 'user_exists': None, 'old_uid': None, 'old_gid': None}) 
skipping: [bserver] => (item={'username': 'somedude', 'password': 'toast', 'description': 'Some Dude', 'new_id': 6002, 'groups': ['dude'], 'user_exists': None, 'old_uid': None, 'old_gid': None}) 

TASK: [users | Check user current GID] **************************************** 
skipping: [aserver] => (item={'username': 'someguy', 'password': 'waffles', 'description': 'Some Guy', 'new_id': 6001, 'groups': ['sudo', 'guy'], 'user_exists': None, 'old_uid': None, 'old_gid': None}) 
skipping: [aserver] => (item={'username': 'somedude', 'password': 'toast', 'description': 'Some Dude', 'new_id': 6002, 'groups': ['dude'], 'user_exists': None, 'old_uid': None, 'old_gid': None}) 
skipping: [bserver] => (item={'username': 'someguy', 'password': 'waffles', 'description': 'Some Guy', 'new_id': 6001, 'groups': ['sudo', 'guy'], 'user_exists': None, 'old_uid': None, 'old_gid': None}) 
skipping: [bserver] => (item={'username': 'somedude', 'password': 'toast', 'description': 'Some Dude', 'new_id': 6002, 'groups': ['dude'], 'user_exists': None, 'old_uid': None, 'old_gid': None}) 

ответ

1

К сожалению, это не так, как это работает.

Ваша строка register: "{{item.user_exists}}", вероятно, приведет к результату, зарегистрированному в переменной, называемой false.

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

Дополнительно register имеет полный комплект different behavior in a loop. Вместо того, чтобы отдельно регистрировать каждую итерацию, он регистрирует один единственный объект, который содержит результаты всех элементов в ключе results.

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

Первый зарегистрировать результат в одной переменной, то здесь users_checked:

- name: Check if user exists 
    shell: /usr/bin/getent passwd {{ item.username }} | /usr/bin/wc -l | tr -d ' ' 
    with_items: users 
    register: users_checked 

Я рекомендую вам работать с debug модулем всегда проверять с тем, что структура данных вы работаете.

- debug: var=users_checked 

Это покажет вам что-то вроде этого:

"var": { 
    "users_checked": { 
     "changed": true, 
     "msg": "All items completed", 
     "results": [ 
      { 
       "changed": true, 
       "cmd": "/usr/bin/getent passwd someguy | /usr/bin/wc -l | tr -d ' '", 
       "delta": "0:00:00.005415", 
       "end": "2015-09-08 20:59:33.379516", 
       "invocation": { 
        "module_args": "/usr/bin/getent passwd someguy | /usr/bin/wc -l | tr -d ' '", 
        "module_name": "shell" 
       }, 
       "item": { 
        "description": "Some Guy", 
        "groups": [ 
         "sudo", 
         "guy" 
        ], 
        "new_id": 6001, 
        "old_gid": null, 
        "old_uid": null, 
        "password": "waffles", 
        "user_exists": null, 
        "username": "someguy" 
       }, 
       "rc": 0, 
       "start": "2015-09-08 20:59:33.374101", 
       "stderr": "", 
       "stdout": "0", 
       "stdout_lines": [ 
        "0" 
       ], 
       "warnings": [] 
      }, 
      { 
       "changed": true, 
       "cmd": "/usr/bin/getent passwd somedude | /usr/bin/wc -l | tr -d ' '", 
       "delta": "0:00:00.006362", 
       "end": "2015-09-08 20:59:33.530546", 
       "invocation": { 
        "module_args": "/usr/bin/getent passwd somedude | /usr/bin/wc -l | tr -d ' '", 
        "module_name": "shell" 
       }, 
       "item": { 
        "description": "Some Dude", 
        "groups": [ 
         "dude" 
        ], 
        "new_id": 6002, 
        "old_gid": null, 
        "old_uid": null, 
        "password": "toast", 
        "user_exists": null, 
        "username": "somedude" 
       }, 
       "rc": 0, 
       "start": "2015-09-08 20:59:33.524184", 
       "stderr": "", 
       "stdout": "0", 
       "stdout_lines": [ 
        "0" 
       ], 
       "warnings": [] 
      } 
     ] 
    } 
} 

Так что результат не только держит фактические результаты всех элементов, но и входные объекты. Это позволяет вам перебирать users_checked.results вместо вашего исходного списка users.

- name: Check user current UID 
    shell: /usr/bin/id -u {{ item.item.username }} 
    with_items: users_checked.results 
    when: item.stdout == 1 

Но теперь это будет неприятно, поскольку вы хотите проверить еще две вещи. Вероятно, вы могли бы продолжить этот подход, зарегистрировать вышеприведенный результат, а затем использовать зарегистрированную структуру данных в качестве входных данных для следующего цикла, но в итоге вы получите глубоко вложенный объект и в конце будет иметь исходный объект где-то в registered_var.results[x].item.results[y].item.results[z].item....

Чтобы избежать этого беспорядка, вы можете посмотреть creating a custom module для выполнения этой задачи.

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