我有一个简单的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变量插件才能做到这一点。
答案 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 }}"