Невозможно использовать доступный файл инвентаризации, поскольку он является исполняемым.

Я пытаюсь запустить файл инвентаризации Ansible ansible -i hosts-prod all -u root -m ping, и он не работает с этим сообщением:

ERROR: The file hosts-prod is marked as executable, 
but failed to execute correctly. If this is not supposed 
to be an executable script, correct this with 
`chmod -x hosts-prod`.

Я считаю, что это потому, что я использую Virtual Box и общие папки, которые заставляют все мои файлы использовать ug + rwx. И vbox не позволяет изменять разрешения для общих папок (по крайней мере, для общих папок, исходящих из Windows, что является моей ситуацией)

Есть ли способ разрешить Ansible запускать этот файл? Я вижу несколько вариантов:

  1. Отредактируйте hosts-prod, чтобы он стал исполняемым файлом. Я не знаю, с чем это связано (очевидно, я новичок в Ansible).
  2. Установите параметр конфигурации в Ansible, чтобы он не запускал этот файл как исполняемый файл — просто относитесь к нему как к статическому файлу конфигурации. Я не могу найти вариант сделать это, поэтому я подозреваю, что это невозможно.
  3. Переместите файл за пределы общих папок: в моем случае это не вариант.
  4. Ваша лучшая идея ..

Вся помощь/идеи приветствуются!

Фактический файл конфигурации hosts-prod выглядит следующим образом, поэтому приветствуются любые советы по его внутреннему исполняемому файлу:

web01 ansible_ssh_host=web01.example.com
db01 ansible_ssh_host=db01.example.com

[webservers]
web01

[dbservers]
db01

[all:vars]
ansible_ssh_user=root

person Steve Midgley    schedule 11.11.2014    source источник
comment
очень похоже на ошибку Ubuntu с поддержкой ansible   -  person tedder42    schedule 12.11.2014


Ответы (2)


Исполняемые инвентаризации обрабатываются как JSON, а не ini-файлы, поэтому их можно преобразовать в сценарий, выводящий JSON. Вдобавок ко всему, Ansible передает им некоторые аргументы, а простого «кошки» недостаточно:

#!/bin/bash
cat <<EOF
{
 "_meta": {
   "hostvars": {
     "host1": { "some_var": "value" }
   }
 },
 "hostgroup1": [
   "host1",
   "host2"
 ]
 ...
}
EOF

Не такой элегантный, как простой «кошка», но должен работать.

person hkariti    schedule 11.11.2014
comment
Мне нравится этот ход мыслей! У меня это не работает - я получаю этот вывод/сообщение об ошибке, когда пробую эту стратегию: steve@Zorin-VM:/media/sf_devdrive/learntaculous/devops/ansible$ ansible -i hosts-prod all -u root -m ping /bin/cat: unrecognized option '--list' Try '/bin/cat --help' for more information. ERROR: failed to parse executable inventory script results: {'msg': '', 'failed': True, 'parsed': False} - person Steve Midgley; 11.11.2014
comment
Похоже, он пытается передать --list кошке? Зачем это делать? Я не знаю, что отвечает --list? Питон этого не делает. Может быть, исполняемый файл ansible должен реагировать на определенные параметры параметра CLI? - person Steve Midgley; 11.11.2014

Ответ @hkariti является первым и наиболее близким к исходному вопросу. В итоге я полностью переписал файл конфигурации в сценарий Ruby, и он отлично работает. Я решил поделиться этим кодом здесь, так как найти полные примеры для файлов динамической инвентаризации Ansible было для меня не очень легко. Этот файл отличается от статического файла тем, как вы связываете переменные со списками машин в инвентаре (используя тег _meta).

#!/usr/bin/env ruby
# this file must be executable (chmod +x) in order for ansible to use it
require 'json'
module LT
  module Ansible
    def self.staging_inventory
      {
        local: {
          hosts:["127.0.0.1"],
          vars: { 
            ansible_connection: "local"
          }
        },
        common: {
          hosts: [],
          children: ["web", "db"],
          vars: {
            ansible_connection: "ssh",
          }
        },
        web: {
          hosts: [],
          children: ["web_staging"]
        },
        db: {
          hosts: [],
          children: ["db_staging"]
        },
        web_staging: {
          hosts: ["webdb01-ci"],
          vars: {
            # server specific vars here
          }
        },
        db_staging: {
          hosts: ["webdb01-ci"]
        }
      }
    end
  end
end
# ansible will pass "--list" to this file when run from command line
# testing for --list should let us require this file in code libraries as well
if ARGV.find_index("--list") then
  puts LT::Ansible::staging_inventory.to_json
end
person Steve Midgley    schedule 20.11.2014