运行Ansible playbook

时间:2016-12-07 14:25:04

标签: ansible

我有一个我希望在指定目标系统组时只运行 的剧本。虽然我可以通过

指定一个小组(在这个例子中,它可以' staging')
ansible-playbook ./playbooks/setup.yml -l staging

如果-l staging被删除,还有其他组可以运行。我意识到我可以为- hosts: "*"更改为相应组的每个组制作另一个剧本,但所有其余的剧本都是相同的。有没有办法在不重复/复制面食的情况下做到这一点?

有关其他上下文,请参阅我当前的设置路径结构

.
├── ansible.cfg
├── inventory
│   ├── group_vars
│   ├── host_vars
│   └── hosts
├── playbooks
│   └── setup.yml
└── roles
    ├── common
    │   ├── README.md
    │   ├── defaults
    │   │   └── main.yml
    │   ├── meta
    │   │   └── main.yml
    │   ├── tasks
    │   │   ├── main.yml
    │   │   └── redhat.yml
    │   └── templates
    ├── ...
    │   
    └── ...

这是setup.yml内容的粗略轮廓

---
- hosts: "*"
  vars_prompt:
    - name: ...
      prompt: "..."
      default: false
      private: no
    - name: "bar_a"
      prompt: "..."
      default: false
      private: no
    ...
  roles:
    - { role: foobar, foo: 'bar', foo_a: bar_a}

以下是我的ansible.cfg文件

的内容
[defaults]
inventory = inventory
roles_path = roles:$PROJECT_HOME/roles
forks = 10
timeout = 15
host_key_checking = False
#log_path=./log/ansible.log
retry_files_enabled = False
callback_whitelist = profile_tasks
transport = smart
gathering = smart
fact_caching = jsonfile
fact_caching_connection = ./.factcache
fact_caching_timeout = 86400

[ssh_connection]
ssh_args = -C -o ControlMaster=auto -o ControlPersist=60s -o ForwardAgent=yes
pipelining = true

2 个答案:

答案 0 :(得分:1)

我收到的当前最佳答案是我错误地认为,并且当前接受的实现我之后的方法是使用多个库存文件。每个人都有自己的一组相似的组。

首先:更改库存设置以模仿

.
├── ansible.cfg
├── inventory
│   ├── default
│   │   ├── ...
│   │   └── hosts
│   └── staging
│       ├── ...
│       └── hosts
:

第二次:更新ansible.cfg文件以反映新的默认广告资源文件

[defaults]
inventory = inventory/default
...

第三:将默认主机文件(../inventory/defaults/hosts)更新为此

# intentionally empty

第四:然后拨打电话指定备用库存文件(而不是其他组)

ansible-playbook ./playbooks/setup.yml -i inventory/staging

注意:尝试在未指定广告资源的情况下运行Playbook(即:ansible-playbook ./playbooks/setup.yml)将根据需要提前/突然结束

注意:使用i(备用库存文件)而非l(指定组)

答案 1 :(得分:0)

拆分阶段并将库存分成不同的文件有很多优点,但是有一个用例和一个体面的方法可以选择一个组或主机在执行时运行,就像你描述的那样。

一种方法是将组名作为变量传递 - 在我使用的Ansible环境中,我们有一个约定,即playbooks对变量subset运行,我们将其传递给{在playbook调用中{1}}(shortform:--extra-vars)参数。因此,要调用剧本,请运行命令行-e

大多数Playbooks只希望再次运行特定的逻辑主机组,因此为了保持该限制,您可以使用Ansible patterns来指定两个组的交集,例如:ansible-playbook -i inventory/staging -e subset=my-group playbook.yml。这样可以避免尝试在Linux主机上安装IIS,同时保持灵活性,以便在playbook调用时选择要运行的内容......

作为旁注,由set_fact模块won't work here设置的变量。这是因为Ansible解释器在确定哪些主机可以进行整场比赛时,不会解释属于各个主机的变量。