以Ansible角色

时间:2017-10-25 12:09:27

标签: linux architecture ansible mariadb devops

我有一个简单的mariadb角色,允许在两台服务器上设置主/从复制。为了做到这一点,我必须在我的库存中定义我的2个节点:

node1 master=true 
node2 slave=true 

通过这种方式,我可以设置一个角色来使用Ansible在使用此vars播放语句时设置主/从复制。

- name: Setup master conf
  template: >-
    src="templates/master.conf.j2"
    dest="{{ master_config_file }}"
  when:
    - master is defined

现在,我想获得一些更自动的东西,可以动态地,随机地将主变量分配给一个节点,并将slave变量分配给所有其他节点。

我已经看过一些关于变量和过滤器的Ansible文档,但它们似乎都没有适应。我想我必须开发自己的Ansible变量插件才能做到这一点。

2 个答案:

答案 0 :(得分:1)

您可以使用facts.d。像这样:

- hosts: all
  become: yes
  tasks:
    - file:
        path: /etc/ansible/facts.d
        state: directory
    - shell: echo '{{ my_facts | to_json }}' > /etc/ansible/facts.d/role.fact
      args:
        creates: /etc/ansible/facts.d/role.fact
      vars:
        my_facts:
          is_master: "{{ true if play_hosts.index(inventory_hostname) == 0 else false }}"
      register: role_fact
    # refresh facts if fact has been just added
    - setup:
      when: role_fact | changed
    - set_fact:
        is_master: "{{ ansible_local.role.is_master }}"
    - debug:
        var: is_master

这将在远程节点上创建role.fact(如果它不存在)并使用is_master事实。在后续运行期间,会自动获取ansible_local.role.is_master

答案 1 :(得分:0)

您可以使用动态组来执行此操作。另一个用例:您不知道哪个节点是主节点,因为它是当选的,您只需要对主节点执行操作。

要使用动态小组,您需要在剧本中定义两次付款:

  • 第一个为了确定哪个节点是主节点并将其添加到动态组中,您需要使用命令
  • 然后在主从服务器上执行任务

接下来的剧本确定哪些节点是主节点和从节点,并在每种类型上执行播放:

- hosts: all
  tasks:
  - shell: <command on node to retrieve node type>
    register: result__node_type
  - name: If node is a master, add it in masters group
    add_host:
      name: "{{ inventory_hostname }}"
      groups: temp_master
    when: result__node_type.stdout == "MASTER"
  - name: If node is a slave, add it in slaves group
    add_host:
      name: "{{ inventory_hostname }}"
      groups: temp_slave
    when: result__node_type.stdout == "SLAVE"
  - name: No master found, then assign first one (or random if you want) to masters group
    add_host:
      name: "groups['all'][0]"
      groups: temp_master
    run_once: yes
    when: groups['temp_master'] | length == 0
  - name: No slave found, then assign others to slaves group
    add_host:
      name: "groups['all'][0]"
      groups: temp_slave
    run_once: yes
    with_items: "{{ groups['all'][1:] }}"
    when: groups['temp_slave'] | length == 0

- hosts: temp_master
  gather_facts: false
    tasks:
  - debug:
      msg: "Action on master {{ ansible_host }}"

- hosts: temp_slave
  gather_facts: false
    tasks:
  - debug:
      msg: "Action on slave {{ ansible_host }}"