希望在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
不确定是否定义或标记主机(无论它们是否为生产主机)。但是这是一个使用主机命名约定的示例。
- 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