关于 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"

我尝试了以下方法;

 tasks:
  - name: test
    import_role:
      name: davidwittman.redis
    vars:
      redis_slaveof: "{{ server01.stdout }} 6379"
    when: '"{{ (server01.stdout) }}" != "{{ ansible_hostname }}"'
- role: davidwittman.redis
  when: '"{{ (server01.stdout) }}" != "{{ ansible_hostname }}"'
  • 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"