如果被标记为在ansible中使用,可能等同于厨师?

问题描述 投票:0回答:1

希望在ansible中找到Chef的if-tagged使用方法。这些标签是在库房服务器中使用knife命令创建的,可以在配方中通过if-tagged调用。

在ansible中执行此操作的等效方法是什么?

因此,在下面的代码中,如果节点被标记为prod,则它是从食谱中拾取prod模板并将其复制到节点的目标路径。

if tagged?('prod')
  template '/etc/prod.yml' do
  source 'prod.erb'
  action :create
end
else
template '/etc/qa.yml' do
  source 'qa.erb'
  action :create
  end
end
ansible chef
1个回答
0
投票

不确定是否定义或标记主机(无论它们是否为生产主机)。但是这是一个使用主机命名约定的示例。

  - set_fact: myenv="prod"
    when: ( ansible_hostname | search("-p$")) or ( ansible_hostname | search("-prod$") )

这将分析目标服务器的主机名,如果主机名以-p或-prod结尾,则会创建一个名为myenv且值为prod的变量(事实)。当然,您也可以使用其他ansible变量,或在目标上检查现有文件或配置设置等。

然后您可以使用copy模块:

  - name: Copy PROD config on PROD hosts
    copy: src=/srv/ansible/configs/prod.yml dest=/etc/prod.yml owner=root group=root mode=0644
    when: myenv == "prod"

  - name: Copy QA config on non-PROD hosts
    copy: src=/srv/ansible/configs/qa.yml dest=/etc/qa.yml owner=root group=root mode=0644
    when: myenv is undefined

注意,我添加了when: myenv is undefined,因为上面的set_fact仅在主机名查找与产品命名约定匹配时定义myenv变量。对于所有其他主机,这并不适用,并且对于ansible,在这种情况下不会设置该变量。您也可以在定义set_fact主机的地方创建第二个qa。在这种情况下,您可以将“复制QA ..”任务的when条件调整为when: myenv is undefined or myenv != "prod"

或者使用固定的事实变量(在这种情况下,没有不同的环境),更简单但动态性更小:

  - set_fact: myprod=yes
    when: ( ansible_hostname | search("-p$")) or ( ansible_hostname | search("-prod$") )

  - name: Copy PROD config on PROD hosts
    copy: src=/srv/ansible/configs/prod.yml dest=/etc/prod.yml owner=root group=root mode=0644
    when: myprod is defined

  - name: Copy QA config on all other hosts
    copy: src=/srv/ansible/configs/qa.yml dest=/etc/qa.yml owner=root group=root mode=0644
    when: myprod is undefined
© www.soinside.com 2019 - 2024. All rights reserved.