ansible 将 shell 命令结果传递给变量

ansible 将 shell 命令结果传递给变量

我对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']定义。

假设你想要 ansible 部署这个事实,你可以这样做:

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

我更喜欢第二种方法,因为它更干净。

相关内容