Ansible playbook выполняет только определенные задачи для каждой среды

У меня есть playbook с кучей задач:

vars:
  params_ENV_SERVER: "{{ lookup('env', 'ENV_SERVER') }}"
  params_UML_SUFFIX: "{{ lookup('env', 'UML_SUFFIX') }}"

tasks:

- name: delete previous files 
  shell: ssh deploy@{{ params_ENV_SERVER }} sudo rm -rf /opt/jenkins-files/*
  become: true
  become_user: deploy
  
- name: create build dir
  shell: ssh deploy@{{ params_ENV_SERVER }} sudo mkdir -p /opt/jenkins-files/build
  become: true
  become_user: deploy
  
- name: chown build dir
  shell: ssh deploy@{{ params_ENV_SERVER }} sudo chown -R deploy:deploy /opt/jenkins-files
  become: true
  become_user: deploy
  

Который я вызываю из Jenkinsfile для PROD и QA env-s:

 withEnv(["ENV_SERVER=192.168.1.30","UML_SUFFIX=stage-QA"]) {
     sh "ansible-playbook nginx-depl.yml --limit 127.0.0.1" 
 }                        
 withEnv(["ENV_SERVER=192.168.1.130","UML_SUFFIX=stage-PROD"]) {
     sh "ansible-playbook nginx-depl.yml --limit 127.0.0.1" 

Можно ли как-то модифицировать плейбук, чтобы на QA выполнялись все задачи, а на PROD только 2-я и 3-я?

Что вы подразумеваете под «выполнить на QA»? соотв. "на ПРОД"? Вы выполняете только на "--limit 127.0.0.1".

Vladimir Botka 23.12.2020 11:52

Да, я выполняю playbook локально, но задачи выполняются на удаленном сервере с использованием ssh, зависит от переменной ENV_SERVER.

Vasyl Stepulo 23.12.2020 12:12
"DevOps: Jenkins & AWS Series, часть 5: Установка Gradle на Ubuntu 22.04
"DevOps: Jenkins & AWS Series, часть 5: Установка Gradle на Ubuntu 22.04
В этой статье блога мы проведем вас через процесс установки Gradle на Ubuntu 22.04, интеграции его с Jenkins и создания задания Gradle. Мы...
0
2
551
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это то, что вы ищете?

- name: delete previous files 
  shell: ssh deploy@{{ params_ENV_SERVER }} sudo rm -rf /opt/jenkins-files/*
  become: true
  become_user: deploy
  when: "params_UML_SUFFIX == 'stage-QA'"
  
- name: create build dir
  shell: ssh deploy@{{ params_ENV_SERVER }} sudo mkdir -p /opt/jenkins-files/build
  become: true
  become_user: deploy
  when: "params_UML_SUFFIX == 'stage-QA'" or
        "params_UML_SUFFIX == 'stage-PROD'"
  
- name: chown build dir
  shell: ssh deploy@{{ params_ENV_SERVER }} sudo chown -R deploy:deploy /opt/jenkins-files
  become: true
  become_user: deploy
  when: "params_UML_SUFFIX == 'stage-QA'" or
        "params_UML_SUFFIX == 'stage-PROD'"

При желании "Ansible-way" будет создавать инвентарь.

shell> cat hosts
[prod]
192.168.1.130

[qa]
192.168.1.30

и объявить все хосты в playbook

shell> cat playbook.yml
- hosts: all
  tasks:

    - debug:
        msg: "Delete previous files.
              Execute module file on {{ inventory_hostname }}"
      when: inventory_hostname in groups.qa

    - debug:
        msg: "Create build dir.
              Execute module file on {{ inventory_hostname }}"
      when: inventory_hostname in groups.qa or
            inventory_hostname in groups.prod

    - debug:
        msg: "Chown build dir. 
              Execute module file on {{ inventory_hostname }}"
      when: inventory_hostname in groups.qa or
            inventory_hostname in groups.prod

Вы можете опустить «become: true» и «become_user: deploy» и объявить удаленного пользователя в командной строке. Например

shell> ansible-playbook -u deploy -i hosts playbook.yml

дает (сокращенно)

TASK [debug] ****
skipping: [192.168.1.130]
ok: [192.168.1.30] => 
  msg: Delete previous files. Execute module file on 192.168.1.30

TASK [debug] ****
ok: [192.168.1.130] => 
  msg: Create build dir. Execute module file on 192.168.1.130
ok: [192.168.1.30] => 
  msg: Create build dir. Execute module file on 192.168.1.30

TASK [debug] ****
ok: [192.168.1.30] => 
  msg: Chown build dir. Execute module file on 192.168.1.30
ok: [192.168.1.130] => 
  msg: Chown build dir. Execute module file on 192.168.1.130

Вы можете ограничить выполнение определенными хостами или группами. Например, приведенная ниже команда будет выполняться только для группы продуктов.

shell> ansible-playbook -u deploy -i hosts playbook.yml --limit prod

дает (сокращенно)

TASK [debug] ****
skipping: [192.168.1.130]

TASK [debug] ****
ok: [192.168.1.130] => 
  msg: Create build dir. Execute module file on 192.168.1.130

TASK [debug] ****
ok: [192.168.1.130] => 
  msg: Chown build dir. Execute module file on 192.168.1.130

Примечания

  • «Ansible-way» — выполнять модули на удаленных хостах.
  • Замените задачи отладки на файл
  • Интеграция в одну задачу "создать каталог сборки" и "chown каталог сборки"
  • Если вы запускаете playbook как пользовательское развертывание, вы можете опустить параметр «-u deploy».

Другие вопросы по теме