ansible 및 자동 생성 ID에 약간 문제가 있습니다. 여러 개의 mysql 마스터 및 슬레이브 서버가 있고 서버 ID를 생성해야 합니다.
내 생각은 다음과 같이하는 것입니다.
- name: generate repli-id
shell: hostname -I | sed -e 's/ \+\([a-z0-9]\+\:\)\+[a-z0-9]\+//' | sed -e 's/ /\n/' | grep -v '^$' | tail -1 | awk -F. '{print $3 * 256 + $4}'
register: slave_repli
- debug: var=slave_repli.stdout_lines
- name: rewrite
template: src=templates/root.j2 dest=/root/test.conf
그래서 생성된 ID를 얻었습니다.
TASK [debug] *******************************************************************
task path: /Users/miwi/ansible/roles/test/main.yml:32
ok: [mysqls5slave] => {
"slave_repli.stdout_lines": [
"3698"
]
}
ok: [mysqls5master] => {
"slave_repli.stdout_lines": [
"3699"
]
}
내 질문은 이제 그것을 내 var 파일에 전달하는 방법입니다.
슬레이브 서버 ID: {{ 슬레이브 서버 ID }}
답변1
local_action과 함께 복사 모듈을 사용하여 변수를 제어 시스템의 로컬 파일에 저장하고 나중에 다음 플레이북에서 사용할 수 있습니다.
- local_action: copy content="slave_server_id: {{ slave_repli.stdout_lines[0] }}" dest=/path/to/var/file
답변2
플레이북에서 ID를 생성하는 대신 여기에서 사용자 정의 사실을 정의할 수 있습니다. mysql 서버에서 다음을 수행할 수 있습니다.
mkdir -p /etc/ansible/facts.d
cat <<EOF >/etc/ansible/facts.d/mysql.fact
#!/bin/sh
echo "[mysql]"
echo server_id=`hostname -I | sed -e 's/ \+\([a-z0-9]\+\:\)\+[a-z0-9]\+//' | sed -e 's/ /\n/' | grep -v '^$' | tail -1 | awk -F. '{print $3 * 256 + $4}'`
EOF
chmod +x /etc/ansible/facts.d/mysql.fact
ansible -m setup your.mysql.ip.address
사실이 올바르게 실행되었는지 확인하기 위해 실행하십시오 . 몇 가지 정의가 있어야 합니다 ansible_local['mysql']['mysql']['server_id']
.
이 사실을 배포할 수 있다고 가정하면 다음을 수행할 수 있습니다.
- name: install fact
copy: src=myfact dest=/etc/ansible/facts.d/mysql.fact owner=root group=root mode=0755
register: fact_installed
- name: reload facts
setup: filter=ansible_local
when: fact_installed is defined and fact_installed.changed == True
그런 다음 변수를 참조하여 템플릿을 포함할 수 있습니다 server_id
.
답변3
템플릿에서 생성된 값을 사용하는 데는 두 가지 옵션이 있습니다.
옵션 1:slave_repli.stdout_lines
템플릿에서 사용:
# in templates/root.j2:
...
slave_server_id: {{ slave_repli.stdout_lines[0] }}
...
옵션 2:변수를 할당하다
스크립트에서:
- name: rewrite
vars:
slave_server_id: "{{ slave_repli.stdout_lines[0] }}"
template:
src: templates/root.j2
dest: /root/test.conf
템플릿에서:
# in templates/root.j2:
...
slave_server_id: {{ slave_server_id }}
...
나는 두 번째 방법이 더 깨끗하기 때문에 선호합니다.