ansible은 쉘 명령 결과를 변수에 전달합니다.

ansible은 쉘 명령 결과를 변수에 전달합니다.

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 }}
...

나는 두 번째 방법이 더 깨끗하기 때문에 선호합니다.

관련 정보