Проблема, с которой вы сталкиваетесь, заключается в том, что вы пытаетесь ссылаться на факты / переменные одного хоста на другие хосты. Вы должны иметь в виду, что в Ansible переменная app_git_sha1
, назначенная хосту localhost
, отличается от переменной app_git_sha1
, назначенной хосту main
или любому другому хосту. Если вы хотите получить доступ к фактам / переменным хостов с другого хоста, вам необходимо явно ссылаться на него с помощью переменной hostvars
. .
Предположим, что у вас есть подобная пьеса:
- hosts: localhost
tasks:
- command: /bin/echo "this is a test"
register: foo
- hosts: localhost
tasks:
- debug: var=foo
Это будет работать, потому что вы 'ссылается на экземпляр хоста localhost
и localhosts
переменной foo
в обеих играх. Вывод этой пьесы выглядит примерно так:
PLAY [localhost] **************************************************************
GATHERING FACTS ***************************************************************
ok: [localhost]
TASK: [command /bin/echo "this is a test"] ************************************
changed: [localhost]
PLAY [localhost] **************************************************************
GATHERING FACTS ***************************************************************
ok: [localhost]
TASK: [debug var=foo] *********************************************************
ok: [localhost] => {
"var": {
"foo": {
"changed": true,
"cmd": [
"/bin/echo",
"this is a test"
],
"delta": "0:00:00.004585",
"end": "2015-11-24 20:49:27.462609",
"invocation": {
"module_args": "/bin/echo \"this is a test\"",
"module_complex_args": {},
"module_name": "command"
},
"rc": 0,
"start": "2015-11-24 20:49:27.458024",
"stderr": "",
"stdout": "this is a test",
"stdout_lines": [
"this is a test"
],
"warnings": []
}
}
}
Если вы немного измените эту игру, чтобы запустить первое воспроизведение на одном хосте, а второе воспроизведение на другом хосте, вы получите сообщение об ошибке вы столкнулись. Решение состоит в том, чтобы использовать встроенную переменную hostvars
Ansible, чтобы второй узел явно ссылался на первую переменную хоста. Поэтому измените первый пример следующим образом:
- hosts: localhost
tasks:
- command: /bin/echo "this is a test"
register: foo
- hosts: anotherhost
tasks:
- debug: var=foo
when: foo is defined
- debug: var=hostvars['localhost']['foo']
when: hostvars['localhost']['foo'] is defined
. Вывод этой пьесы показывает, что первая задача пропущена, потому что foo
не определяется хостом anotherhost
. Но вторая задача выполняется успешно, потому что она явно ссылается на экземпляр localhosts
переменной foo
:
TASK: [debug var=foo] *********************************************************
skipping: [anotherhost]
TASK: [debug var=hostvars['localhost']['foo']] **************************
ok: ['anotherhost'] => {
"var": {
"hostvars['localhost']['foo']": {
"changed": true,
"cmd": [
"/bin/echo",
"this is a test"
],
"delta": "0:00:00.005950",
"end": "2015-11-24 20:54:04.319147",
"invocation": {
"module_args": "/bin/echo \"this is a test\"",
"module_complex_args": {},
"module_name": "command"
},
"rc": 0,
"start": "2015-11-24 20:54:04.313197",
"stderr": "",
"stdout": "this is a test",
"stdout_lines": [
"this is a test"
],
"warnings": []
}
}
}
Итак, в двух словах вы хотите изменить ссылки на переменные в main
playbook для ссылки на переменные localhost
следующим образом:
{{ hostvars['localhost']['app_git_sha1'] }}
Я сделал это с помощью этого регулярного выражения:
<imgdir.*\s+<string name="type" value="n"\/>\s+(.+\s+)+?<\/imgdir>
Вы можете просто заменить эту находку пустой строкой.