Как установить регистр переменной для сохранения между играми в недоступном?
У меня есть загрузочная тетрадь, где я хочу, чтобы переменная, которую я регистрирую на одной машине, была доступна на другой.
В моем случае я хотел бы запустить команду на localhost
, в данном случае git rev-parse --abbrev-ref HEAD
, поэтому я могу записать текущую ветку git и sha1 и зарегистрировать этот вывод, поэтому Я могу обратиться к нему позже, когда вы работаете на любой машине в main
группе, во второй игре.
Однако мне непонятно, как я регистрирую переменную на localhost, поэтому я могу получить доступ к ней из main. Когда я пытаюсь получить доступ к переменной во второй игре, я получаю это сообщение:
- Сделать MSDeploy (Visual Studio) не удалять папку App_Data, но удалять все остальное
- Android Studio не развертывает изменения в приложении
- Развертывание проекта Maven throws java.util.zip.ZipException: недопустимый заголовок LOC (плохая подпись)
- Как развернуть приложение JAX-RS?
- XamlParseException после развертывания проекта WPF
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"
- Как я могу развернуть приложение .NET, использующее ODAC, без установки всего компонента пользователю?
- Выбор устройства для Android - мое устройство кажется офлайн
- Лучшие практики ILMerge
- Ошибка при развертывании артефакта в Nexus
- Универсальный ЭЛТ-модуль MSVC 2015 для локального развертывания приложений
- Создание Windows Installer для программ на Java
- Как вручную установить веб-сервис на Tomcat 6?
- Как ссылаться на другую версию dll с помощью MSBuild
Проблема, с которой вы сталкиваетесь, заключается в том, что вы пытаетесь ссылаться на факты / переменные одного хоста на другие хосты. Вы должны иметь в виду, что в 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}}