R4F*_*4F6 0 ansible ansible-playbook
我为我们的Web服务创建了部署手册。每个Web服务都位于其自己的目录中,例如:
/webapps/service-one/
/webapps/service-two/
/webapps/service-three/
Run Code Online (Sandbox Code Playgroud)
我想检查服务目录是否存在,如果存在,我想运行一个shell脚本来优雅地停止服务。目前,我可以使用来完成此步骤ignore_errors: yes。
- name: Stop services
with_items: services_to_stop
shell: "/webapps/scripts/stopService.sh {{item}}"
ignore_errors: yes
Run Code Online (Sandbox Code Playgroud)
在这种情况下,如果其中一个目录不存在或第一次部署服务,则输出将非常混乱。我实际上想要这样的东西之一:
这个:
- name: Stop services
with_items: services_to_stop
shell: "/webapps/scripts/stopService.sh {{item}}"
when: shell: [ -d /webapps/{{item}} ]
Run Code Online (Sandbox Code Playgroud)
或这个:
- name: Stop services
with_items: services_to_stop
shell: "/webapps/scripts/stopService.sh {{item}}"
stat:
path: /webapps/{{item}}
register: path
when: path.stat.exists == True
Run Code Online (Sandbox Code Playgroud)
我先收集事实,然后再做必要的事情。
- name: Check existing services
stat:
path: "/tmp/{{ item }}"
with_items: "{{ services_to_stop }}"
register: services_stat
- name: Stop existing services
with_items: "{{ services_stat.results | selectattr('stat.exists') | map(attribute='item') | list }}"
shell: "/webapps/scripts/stopService.sh {{ item }}"
Run Code Online (Sandbox Code Playgroud)
另请注意,with_items从Ansible 2.2开始,裸变量in 无效,因此您应该对其进行模板化。