关于 enable/disable 按 ansible yaml 清单中的条件值
About enable/disable by conditional values in ansible yaml manifest
我希望 Ansible 上的变量根据条件是主动的还是被动的。
我正在使用角色“davidwittman.redis”。我正在设置一个 redis 集群。我需要 运行 一个 yml 文件,同时将它部署到 3 个服务器。我无法单独分发“yml”文件。
下面我有一个简单的设置配置。在这里,我想根据条件在除主服务器之外的所有其他服务器上激活“redis_slaveof”值。
换句话说,我希望我选择的“redis_slaveof”值在主服务器上不处于活动状态,但在其他 2 个服务器上处于活动状态。
我该怎么做,你有什么建议吗?
我的主要ansible配置;
> - name: Redis Replication Slave Installations hosts: localhost
>
> pre_tasks:
> - name: check redis server1
> shell: "cat /etc/hosts |grep redis |awk '{print }' |sed -n 1p"
> register: server01
>
> - name: check redis server2
> shell: "cat /etc/hosts |grep redis |awk '{print }' |sed -n 2p"
> register: server02
>
> - name: check redis server3
> shell: "cat /etc/hosts |grep redis |awk '{print }' |sed -n 3p"
> register: server03
>
> roles:
> - role: davidwittman.redis
>
> vars:
> - redis_version: 6.2.6
> - redis_bind: 0.0.0.0
> - redis_port: 6379
> - redis_service_name: redis-service
> - redis_protected_mode: "no"
> - redis_config_file_name: "redis.conf"
>
> # - redis_slaveof: "{{ server01.stdout }} 6379"
我尝试了以下方法;
- 我添加了额外的任务和“import_role”。我在里面放了一个 when 条件。如果我的 server01 值和服务器本地主机名值不相等,请启用此角色。因此,我认为它会在除主服务器之外的其他服务器上激活此值 server.But 它不起作用,将其添加到所有服务器上。我在日志中看到以下错误。
“[警告]:flush_handlers 有条件时不支持任务”
tasks:
- name: test
import_role:
name: davidwittman.redis
vars:
redis_slaveof: "{{ server01.stdout }} 6379"
when: '"{{ (server01.stdout) }}" != "{{ ansible_hostname }}"'
- 我如上所述将when条件添加到主要角色,并在一个yml中将其分为两个不同的角色。这个方法也失败了。
- role: davidwittman.redis
when: '"{{ (server01.stdout) }}" != "{{ ansible_hostname }}"'
- 我在变量中定义了“if/else”条件如下。但是虽然看起来有效,但是还是报错“does not support when conditional”。也将其添加到所有服务器。
- redis_slaveof: "{%if '{{ (server01.stdout) }} != {{ ansible_hostname }}' %} {{ '{{ (server01.stdout) }} 6379' }} {% else %} {{ '' }} {% endif %}"
因此,您希望根据变量运行 扮演不同的角色。
在你的剧本中不要使用
roles:
- role: davidwittman.redis
而是做
tasks:
- name: Pass variables to role
include_role:
name: myrole
vars:
rolevar1: value from task
这是在角色之后执行的,但现在您可以添加 when
表达式:
tasks:
- name: Pass variables to role
include_role:
name: myrole
vars:
rolevar1: value from task
when: ansible_hostname = "server1"
- name: Pass variables to role
include_role:
name: myrole
vars:
rolevar1: value from task
additionalrolevar: whatever
when: ansible_hostname != "server1"
我希望 Ansible 上的变量根据条件是主动的还是被动的。
我正在使用角色“davidwittman.redis”。我正在设置一个 redis 集群。我需要 运行 一个 yml 文件,同时将它部署到 3 个服务器。我无法单独分发“yml”文件。
下面我有一个简单的设置配置。在这里,我想根据条件在除主服务器之外的所有其他服务器上激活“redis_slaveof”值。
换句话说,我希望我选择的“redis_slaveof”值在主服务器上不处于活动状态,但在其他 2 个服务器上处于活动状态。
我该怎么做,你有什么建议吗?
我的主要ansible配置;
> - name: Redis Replication Slave Installations hosts: localhost
>
> pre_tasks:
> - name: check redis server1
> shell: "cat /etc/hosts |grep redis |awk '{print }' |sed -n 1p"
> register: server01
>
> - name: check redis server2
> shell: "cat /etc/hosts |grep redis |awk '{print }' |sed -n 2p"
> register: server02
>
> - name: check redis server3
> shell: "cat /etc/hosts |grep redis |awk '{print }' |sed -n 3p"
> register: server03
>
> roles:
> - role: davidwittman.redis
>
> vars:
> - redis_version: 6.2.6
> - redis_bind: 0.0.0.0
> - redis_port: 6379
> - redis_service_name: redis-service
> - redis_protected_mode: "no"
> - redis_config_file_name: "redis.conf"
>
> # - redis_slaveof: "{{ server01.stdout }} 6379"
我尝试了以下方法;
- 我添加了额外的任务和“import_role”。我在里面放了一个 when 条件。如果我的 server01 值和服务器本地主机名值不相等,请启用此角色。因此,我认为它会在除主服务器之外的其他服务器上激活此值 server.But 它不起作用,将其添加到所有服务器上。我在日志中看到以下错误。 “[警告]:flush_handlers 有条件时不支持任务”
tasks: - name: test import_role: name: davidwittman.redis vars: redis_slaveof: "{{ server01.stdout }} 6379" when: '"{{ (server01.stdout) }}" != "{{ ansible_hostname }}"'
- 我如上所述将when条件添加到主要角色,并在一个yml中将其分为两个不同的角色。这个方法也失败了。
- role: davidwittman.redis when: '"{{ (server01.stdout) }}" != "{{ ansible_hostname }}"'
- 我在变量中定义了“if/else”条件如下。但是虽然看起来有效,但是还是报错“does not support when conditional”。也将其添加到所有服务器。
- redis_slaveof: "{%if '{{ (server01.stdout) }} != {{ ansible_hostname }}' %} {{ '{{ (server01.stdout) }} 6379' }} {% else %} {{ '' }} {% endif %}"
因此,您希望根据变量运行 扮演不同的角色。
在你的剧本中不要使用
roles:
- role: davidwittman.redis
而是做
tasks:
- name: Pass variables to role
include_role:
name: myrole
vars:
rolevar1: value from task
这是在角色之后执行的,但现在您可以添加 when
表达式:
tasks:
- name: Pass variables to role
include_role:
name: myrole
vars:
rolevar1: value from task
when: ansible_hostname = "server1"
- name: Pass variables to role
include_role:
name: myrole
vars:
rolevar1: value from task
additionalrolevar: whatever
when: ansible_hostname != "server1"