Разрешение для символических ссылок не оценивается.
В прежние времена не было возможности изменить биты разрешений для символических ссылок.
С некоторых пор POSIX представил fchmodat()
, и все платформы, поддерживающие этот вызов, могут изменять биты разрешений для символических ссылок.
Однако не ожидайте, что это повлияет на символическую ссылку.
Вместо того, чтобы генерировать свой идентификатор из учебника, здесь вы можете захотеть определить собственный факт. На вашем сервере 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
.
Вы можете использовать модуль копирования в дополнение к локальному _действию, чтобы сохранить переменную в локальном файле на управляющей машине и использовать ее позже в следующем плейбуке:
- local_action: copy content="slave_server_id: {{ slave_repli.stdout_lines[0] }}" dest=/path/to/var/file
У вас есть два варианта использования сгенерированного значения в вашем шаблоне:
Вариант 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 }}
...
Я предпочитаю второй подход, так как он намного чище.