2017-02-20 20 views
0

Я пытаюсь создать роль EBS для моих сценариев Ansible. Я собираюсь создать том EBS и присоединить его к себе через консоль. Я хочу, чтобы эта роль выполняла команды и монтировала диск, если диск еще не установлен, но пропустите это, если он уже установлен.Ansible - Проверьте, установлен ли накопитель

я имею у себя конкретный ВАР, которые дают список дисков и точки монтирования:

ebs_vols: 
    - drive: /dev/sdb 
    mount_point: /mnt/ebs1 
    directory: /var/lib/mysql 
    - drive: /dev/sdc 
    mount_point: /mnt/ebs2 
    directory: /var/backups 

Я хочу, чтобы моя задача проверить каждый диск с командой df и посмотреть, если он установлен. Затем пропустить команды, если диск установлен:

- name: Check if drives are already mounted 
    shell: df | grep "{{item.drive}}" | wc -l 
    with_items: "{{ebs_vols}}" 
    register: ebs_checked 

- name: output debug 
    debug: var=ebs_checked 

- name: Make filesystem 
    filesystem: 
    fstype: xfs 
    dev: "{{item.item.drive}}" 
    when: "{{item.stdout}} == 0" 
    with_items: ebs_checked.results 

Когда я запускаю его, по-видимому, чтобы проверить каждый диск просто отлично, потому что выход debug является объектом с правильными дисками и стандартным выводом. Проблема заключается в задаче Make filesystem. Ошибки из-за ошибки:

The conditional check '{{item.stdout}} == 0' failed. The error was: error while evaluating conditional ({{item.stdout}} == 0): 'ansible.vars.unsafe_proxy.AnsibleUnsafeText object' has no attribute 'stdout'\n\n

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

ответ

3

Вы не можете использовать «голые переменные» больше в Ansible. Следующая строка вызывает анзибль интерпретировать значение ebs_checked.results в виде строки:

with_items: ebs_checked.results 

Используйте правильный синтаксис вместо:

with_items: "{{ ebs_checked.results }}" 
+0

А, я вижу. Ошибка новичков. Я новичок в Ansible, и я предполагаю, что ожидал какой-то синтаксической ошибки, а не пытался ее выполнить. Благодаря! – gkrizek

+0

Синтаксическая ошибка отсутствует. 'item' присваивается строковое значение' ebs_checked.results', и вы получили сообщение об ошибке, что он не содержит ключ 'stdout', который вы пытались использовать. – techraf

+0

Это использование голых переменных в циклах 'with_' было устарело в Ansible 2.0 и удалено в 2.2 - см. Руководство по перемещению [Ansible 2.0 porting] (https://docs.ansible.com/ansible/porting_guide_2.0.html#deprecated). – RichVel

0

Вы можете попробовать:

- name: Check if drives are already mounted 
    command: '/bin/mountpoint -q {{item.directory}}' 
    with_items: '{{ebs_vols}}' 
    register: ebs_checked 
    changed_when: "ebs_checked.rc != 0" 

Кроме того, анзибль'S модуль установки заполняет массив ansible_mounts, но у меня не было возможности узнать, будет ли оно полезно в этом контексте.