Используйте переменную groups
:
- name: start the cluster
command: "pcs cluster setup --start --name cluster01 --force {{ groups['gfs2_hosts'] | join(' ') }}"
when: " 'is not currently running' in cluster_status.stderr "
Прочтите Доступ к информации о других хостах с магическими переменными из официальной документации для получения дополнительной информации.
Я сам использовал подход IRepository в последнее время, который предлагает Keith. Но, Вы не должны фокусироваться на том шаблоне здесь. Вместо этого существует еще несколько частей в сборнике пьес DDD, который может быть применен здесь.
Во-первых, существует понятие Объектов значения (VO), которые можно применить здесь. В Вас случай это был бы Адрес. Различие между Объектом Значения и Объектом Объекта - то, что Объекты имеют идентификационные данные; VOs не делают. Идентификационные данные VO действительно являются суммой, он - свойства, не уникальные идентификационные данные. В книжном Дизайне Доменного Диска Быстро (это - также бесплатная загрузка PDF), он объясняет это очень хорошо путем заявления, что адрес является действительно просто точкой на Земле и не нуждается в отдельных подобных SocialSecurity идентификационных данных как человек. Та точка на Земле является комбинацией улицы, числа, города, zip и страны. Это может иметь значения широты и долготы, но все еще это - даже VOs по определению, потому что это - комбинация двух точек.
Кроме того, не забывайте о Сервисном понятии в сборнике пьес DDD. В Вашем примере тот сервис был бы:
public class PersonCompanyService
{
void SavePersonCompany(IPersonCompany personCompany)
{
personRepository.SavePerson();
// do some work for a new company, etc.
companyRepository.SaveCompany();
}
}
Существует потребность в сервисе, когда у Вас есть два объекта, которые нуждаются оба, нуждаются в подобном действии для координирования комбинации других действий. В Вашем случае, сохраняя Человека () и создавая пустую Компанию () одновременно.
Теперь, как Вы пошли бы о сохранении Адреса VO в базе данных? Вы использовали бы IAddressRepository, очевидно. Но так как большинство ORMs (т.е. LingToSql) требует, чтобы все объекты имели Идентификационные данные, вот прием: Mark идентификационные данные как внутренние в Вашей модели, таким образом, это не выставляется за пределами Вашего уровня Model. Это - собственный совет Steven Sanderson.
public class Address
{
// make your identity internal
[Column(IsPrimaryKey = true
, IsDbGenerated = true
, AutoSync = AutoSync.OnInsert)]
internal int AddressID { get; set; }
// everything else public
[Column]
public string StreetNumber { get; set; }
[Column]
public string Street { get; set; }
[Column]
public string City { get; set; }
...
}
На основе моего недавнего опыта использования шаблона репозитория я думаю, что Вы извлекли бы выгоду из использования универсального репозитория, теперь общего IRepository T. Тем путем Вы не должны были бы добавлять методы репозитория как SavePerson (Человек человека). Вместо этого у Вас было бы что-то как:
IRepository<Person> personRepository = new Repository<Person>();
Person realPerson = new Person();
personRepository.SaveOrUpdate(realPerson);
Этот метод также предоставляет себя хорошо Разработке через тестирование и Насмешке.
Я чувствую, что вопросами о поведении в Вашем описании были бы опасения за Домен, возможно, Вы должны иметь метод AddCompany в своем классе Человека и изменить свойство Company на
public Company Company { get; private set; }
Моя точка; смоделируйте домен, не волнуясь о, как данные будут сохранены к базе данных. Это - беспокойство о сервисе, который будет использовать Вашу модель предметной области.
Назад в Репозиторий, взгляните на это сообщение для хорошего объяснения IRepository по LinqToSql. Блог Mike's имеет много других сообщений на Репозиториях. Когда Вы действительно приезжаете для выбора, ORM I может рекомендовать HHibernate по LinqToSql, последний является ныне несуществующим, и NHibernate имеет большое сообщество поддержки.