Как установить регистр переменной для сохранения между играми в недоступном?

У меня есть загрузочная тетрадь, где я хочу, чтобы переменная, которую я регистрирую на одной машине, была доступна на другой.

В моем случае я хотел бы запустить команду на localhost , в данном случае git rev-parse --abbrev-ref HEAD , поэтому я могу записать текущую ветку git и sha1 и зарегистрировать этот вывод, поэтому Я могу обратиться к нему позже, когда вы работаете на любой машине в main группе, во второй игре.

Однако мне непонятно, как я регистрирую переменную на localhost, поэтому я могу получить доступ к ней из main. Когда я пытаюсь получить доступ к переменной во второй игре, я получаю это сообщение:

 TASK: [debug msg={{ app_git_sha1.stdout }}] *********************************** fatal: [main] => One or more undefined variables: 'app_git_sha1' is undefined 

Вот игра, которую я использую. Есть ли что-то очевидное, что я должен делать?

 --- - hosts: localhost connection: local gather_facts: no tasks: - name: register current branch command: git rev-parse --abbrev-ref HEAD register: git_branch sudo: no when: vagrant tags: - debugsha - debug: msg={{ git_branch.stdout }} tags: - debugsha - name: register the SHA1 of the branch being deployed command: git rev-parse origin/{{ git_branch.stdout }} register: app_git_sha1 sudo: no tags: - slack - debugsha - debug: msg={{ app_git_sha1.stdout }} tags: - debugsha - hosts: main sudo: yes roles: - role: productscience.deploy_user # TODO reprovision using these roles, for consistency # - role: app.essentials # - role: zenoamaro.postgresql - role: productscience.papertrailapp - role: jdauphant.nginx tasks: - include: setup.yml # - include: db.yml - name: checkout source control when deploying to remote servers include: source.yml when: not vagrant tags: - deploy - include: django.yml tags: - deploy - name: include vagrant specific dependencies for local development include: vagrant.yml when: vagrant handlers: - name: restart postgres sudo: yes service: name=postgresql state=restarted - name: start restart uwsgi sudo: yes service: name={{ app }} state=restarted - hosts: localhost connection: local gather_facts: no tasks: - name: register the SHA1 of the branch being deployed when: not vagrant command: git rev-parse origin/{{ git_branch }} register: git_sha tags: - slack - name: Send notification message via Slack all options when: not vagrant tags: - slack local_action: module: slack token: "{{ wof_slack_token }}" msg: "Deployment of `{{ git_branch }}` to {{ app_url }} completed with sha `{{ git_sha.stdout }}`" channel: "#wof" username: "Ansible deploy-o-tron" 

Проблема, с которой вы сталкиваетесь, заключается в том, что вы пытаетесь ссылаться на факты / переменные одного хоста на другие хосты. Вы должны иметь в виду, что в 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 пьесе, чтобы ссылаться на переменные localhost таким образом:

 {{ hostvars['localhost']['app_git_sha1'] }} 

У меня были похожие проблемы с одним и тем же хостом, но в разных играх. Эта вещь, которую следует помнить, это факты, а не переменные, которые сохраняются в разных играх. Вот как я обошел эту проблему.

 #!/usr/local/bin/ansible-playbook --inventory=./inventories/ec2.py --- - name: "TearDown Infrastructure !!!!!!!" hosts: localhost gather_facts: no vars: aws_state: absent vars_prompt: - name: "aws_region" prompt: "Enter AWS Region:" default: 'eu-west-2' tasks: - name: Make vars persistant set_fact: aws_region: "{{aws_region}}" aws_state: "{{aws_state}}" - name: "TearDown Infrastructure hosts !!!!!!!" hosts: monitoring.ec2 connection: local gather_facts: no tasks: - name: set the facts per host set_fact: aws_region: "{{hostvars['localhost']['aws_region']}}" aws_state: "{{hostvars['localhost']['aws_state']}}" - debug: msg="state {{aws_state}} region {{aws_region}} id {{ ec2_id }} " - name: last few bits hosts: localhost gather_facts: no tasks: - debug: msg="state {{aws_state}} region {{aws_region}} " 

приводит к

 Enter AWS Region: [eu-west-2]: PLAY [TearDown Infrastructure !!!!!!!] *************************************************************************************************************************************************************************************************** TASK [Make vars persistant] ************************************************************************************************************************************************************************************************************** ok: [localhost] PLAY [TearDown Infrastructure hosts !!!!!!!] ********************************************************************************************************************************************************************************************* TASK [set the facts per host] ************************************************************************************************************************************************************************************************************ ok: [XXXXXXXXXXXXXXXXX] TASK [debug] ***************************************************************************************************************************************************************************************************************************** ok: [XXXXXXXXXXX] => { "changed": false, "msg": "state absent region eu-west-2 id i-0XXXXX1 " } PLAY [last few bits] ********************************************************************************************************************************************************************************************************************* TASK [debug] ***************************************************************************************************************************************************************************************************************************** ok: [localhost] => { "changed": false, "msg": "state absent region eu-west-2 " } PLAY RECAP ******************************************************************************************************************************************************************************************************************************* XXXXXXXXXXXXX : ok=2 changed=0 unreachable=0 failed=0 localhost : ok=2 changed=0 unreachable=0 failed=0 

Использовать фиктивный хост и его переменные

Например, передать маркер K8S и hash от мастера к работникам.

На хозяине

 - name: "Cluster token" shell: kubeadm token list | cut -d ' ' -f1 | sed -n '2p' register: K8S_TOKEN - name: "CA Hash" shell: openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //' register: K8S_MASTER_CA_HASH - name: "Add K8S Token and Hash to dummy host" add_host: name: "K8S_TOKEN_HOLDER" token: "{{ K8S_TOKEN.stdout }}" hash: "{{ K8S_MASTER_CA_HASH.stdout }}" - name: debug: msg: "[Master] K8S_TOKEN_HOLDER K8S token is {{ hostvars['K8S_TOKEN_HOLDER']['token'] }}" - name: debug: msg: "[Master] K8S_TOKEN_HOLDER K8S Hash is {{ hostvars['K8S_TOKEN_HOLDER']['hash'] }}" 

О рабочем

 - name: debug: msg: "[Worker] K8S_TOKEN_HOLDER K8S token is {{ hostvars['K8S_TOKEN_HOLDER']['token'] }}" - name: debug: msg: "[Worker] K8S_TOKEN_HOLDER K8S Hash is {{ hostvars['K8S_TOKEN_HOLDER']['hash'] }}" - name: "Kubeadmn join" shell: > kubeadm join --token={{ hostvars['K8S_TOKEN_HOLDER']['token'] }} --discovery-token-ca-cert-hash sha256:{{ hostvars['K8S_TOKEN_HOLDER']['hash'] }} {{K8S_MASTER_NODE_IP}}:{{K8S_API_SERCURE_PORT}} 
  • Приложение .NET не может запускать и получать XamlParseException
  • развертывание фреймворка zend на сервере
  • Объединить msi и exe
  • Как развернуть SQL Server Compact Edition 4.0?
  • Горячее развертывание на JBoss - как мне заставить JBoss «видеть» изменение?
  • Как найти полное имя сборки?
  • Ошибка развертывания: запуск Tomcat не удался, порт 8080 сервера уже используется
  • Ошибка развертывания Heroku H10 (приложение разбилось)
  • Существует ли компилятор R?
  • Запуск приложения на основе .net без .NET Framework
  • Установите службу Windows .NET без InstallUtil.exe
  • Interesting Posts

    Шаблон Builder в эффективной Java

    Найти все дубликаты документов в коллекции MongoDB по ключевому полю

    Java KeyListener заикается

    Какие рекомендации для дизайна электронной почты HTML существуют?

    Как проверить, нажата ли клавиша во время события click с помощью jQuery?

    Как получить доступ к моей конфигурации модема ADSL удаленно через Интернет

    Проблемы с перезаписью (повторным сохранением) изображения, когда он был установлен как источник изображения

    Отключение ускорения мыши в Mac OS X

    Объявление активности в AndroidManifest.xml

    Почему люди используют __ (двойное подчеркивание) так много в C ++

    AngularJS intellisense не работает на Visual Studio 2015

    Драйверы для наушников с встроенным микрофоном и пультом дистанционного управления

    Как исходный код Android не имеет основного метода и все еще работает?

    правильная цитата для cmd.exe для нескольких аргументов

    setValue: forUndefinedKey: этот class не является ключевым значением, совместимым с кодировкой для ключа

    Давайте будем гением компьютера.