Не удается использовать файл Ansible inventory, поскольку он является исполняемым

Я пытаюсь запустить файл инвентаризации 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

2 ответов


исполняемые запасы анализируются как JSON вместо ini-файлов, поэтому вы можете преобразовать их в скрипт, который выводит JSON. Кроме того, Ansible передает им некоторые аргументы простому "коту" недостаточно:

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

не так элегантно, как простой "кот", но должен работать.


ответ@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