Назад | Перейти на главную страницу

Запуск команд ansible playbook внутри образа докера с использованием конвейера jenkins

У меня есть требование создать доступный образ докера и запустить playbook с помощью конвейера jenkins.

Я создал образ докера, но я не понимаю, как ключи SSH, поддерживаемые докером, копируются на удаленный доступный хост. Нужно ли делать эту настройку заранее?

Вы упомянули, что используете для этого Jenkins. Есть плагин под названием "Агент SSH"что позволяет запускать сценарии в контексте закрытого ключа SSH даже внутри контейнера докеров.

Прежде всего, убедитесь плагин установлен в Дженкинсе

Затем зарегистрируйте закрытый ключ SSH в Секреты Дженкинса

Затем вы можете повторно использовать секретный идентификатор в своей работе, как показано в примере ниже:

pipeline {
  agent {
    label "docker"
  }

  environment {
    ANSIBLE_VAULT_PASSWORD = credentials('ANSIBLE_VAULT_PASSWORD')
  }

  options {
    timeout(time: 60, unit: "MINUTES")
  }

  stages {
    stage('Run Ansible playbook') {
      agent {
        docker {
          image 'hippolab/ansible'
          args '-u 0:0'
          reuseNode true
        }
      }
      steps {
        sshagent(credentials : ['MY_SSH_KEY_SECRET_ID']) {
          sh '''
            ansible-galaxy install -r requirements.yml
            echo ${ANSIBLE_VAULT_PASSWORD} | ansible-playbook \
              --inventory-file hosts \
              --extra-vars ansible_ssh_common_args='"-o StrictHostKeyChecking=no -o ServerAliveInterval=30"' \
              --ask-vault-pass \
              my_playbook.yml
          '''
        }
      }
    }
  }

  post {
    always {
      deleteDir()
    }
  }

}

Авторский опыт:

  • Если Ansible Vault используется, пароль может быть передан инструменту ansible-playbook с помощью shell pipe
  • StrictHostKeyChecking = нет имеет решающее значение, если вы не настроили свои ведомые устройства статически и не предварительно приняли ключи всех узлов вручную, что не так в 99% случаев
  • ServerAliveInterval = 30 может быть опущен, если у вас нет строгого SSH-сервера на той стороне, которая прерывает соединения из-за бездействия. Помогите, если некоторые задачи Ansible занимают много времени