Трубопровод Дженкинса - переход на S SH Ключи в ansible и Terraform - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть ansible playbook, который ссылается на данные ключа s sh для добавления ключа publi c в файл author_host при его создании, вот выдержка.

  vars:
    vm1: 
      ssh_key_var: '{{ ssh_key_data }}'

  tasks:
      - name: Create VM
        azure_rm_virtualmachine:
          resource_group: '{{ resource_group1.name }}'
          name: '{{ vm1.name }}'
          vm_size: '{{ vm1.size }}'
          admin_username: '{{ vm1.admin_username }}'
          ssh_password_enabled: false
          ssh_public_keys:
            - path: '/home/{{ vm1.admin_username }}/.ssh/authorized_keys'
              key_data: '{{ vm1.ssh_key_var }}'
          network_interfaces: '{{ network_interface1.name }}'
          image: '{{ vm1.image }}'

Обычно это довольно просто - я запускаю на своем ноутбуке и получаю ключ локально, возможно получаю данные, именуемые файлом.

Я пытался запустить playbook с секретным текстом в конвейере jenkins, используя секретный текст переменной среды "AZURE_AUTHORIZED_KEY" для ключа publi c, который я сохраняю в учетных данных:

   stage('Deploy server') {
        agent {
            docker { image 'my_ansible_container:latest' }
        }
        environment {
            AZURE_CLIENT_ID         = credentials('AZURE_CLIENT_ID_ANSIBLE')
            AZURE_SECRET            = credentials('AZURE_SECRET_ANSIBLE')
            AZURE_SUBSCRIPTION_ID   = credentials('AZURE_SUBSCRIPTION_ID_ANSIBLE')
            AZURE_TENANT            = credentials('AZURE_TENANT_ANSIBLE')
            AUTHORIZED_KEY          = credentials('AZURE_AUTHORIZED_KEY')
        }
        steps {
            // deploy server
            sh "ansible-playbook playbook.yml --extravars \"ssh_key_data=${AUTHORIZED_KEY}\""
        }
    }

Когда я добавляю ключ publi c как переменную в playbook, все работает нормально, но я не хочу хранить ключи в репо, даже если они являются публичными c ключами и это частное репо.

Когда я импортирую как env_var, он, кажется, не принимает значение и не "каскадирует" его в переменную, как и ожидалось. У кого-нибудь есть решение этой проблемы - мой подход неправильный?

Спасибо

1 Ответ

0 голосов
/ 29 апреля 2020

В этом не было ничего плохого, ожидайте ошибок при наборе текста, немного закрывающих кавычек. Вот синтаксис для тех, кому это может быть интересно. Заметьте, я использую это в качестве промежуточного решения, в котором я хочу переместить секреты из jenkins в нечто вроде хранилища hashicorp.

Я также переименовал некоторые из моих env vars, чтобы они стали немного больше, представитель :

         }
        environment {
            AZURE_CLIENT_ID         = credentials('AZURE_CLIENT_ID_ANSIBLE')
            AZURE_SECRET            = credentials('AZURE_SECRET_ANSIBLE')
            AZURE_SUBSCRIPTION_ID   = credentials('AZURE_SUBSCRIPTION_ID_ANSIBLE')
            AZURE_TENANT            = credentials('AZURE_TENANT_ANSIBLE')
            AUTHORIZED_KEY          = credentials('AZURE_AUTHORIZED_KEY')
            AUTHORIZED_PASSWORD     = credentials('AZURE_AUTHORIZED_PASSWORD')
        }
        steps {
            // deploy a boot strap server
            sh "ansible-playbook playbook.yml \
                    --extra-var 'admin_password_var=${AUTHORIZED_PASSWORD}' \
                    --extra-var 'ssh_public_key_var=${AUTHORIZED_KEY}'"
        }

и выдержка из сборника пьес

     vars: 
       vm1: 
         admin_password: '{{ admin_password_var }}'
         ssh_public_key: '{{ ssh_public_key_var }}'  

      - name: Create VM
        azure_rm_virtualmachine:
          resource_group: '{{ resource_group1.name }}'
          name: '{{ vm1.name }}'
          vm_size: '{{ vm1.size }}'
          admin_username: '{{ vm1.admin_username }}'
          admin_password: '{{ vm1.admin_password }}'
          ssh_password_enabled: false
          ssh_public_keys:
            - path: '/home/{{ vm1.admin_username }}/.ssh/authorized_keys'
             key_data: '{{ vm1.ssh_public_key }}'
          network_interfaces: '{{ network_interface1.name }}'
          image: '{{ vm1.image }}'

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

Могут быть и другие подходы, но это рабочий, и простой; что кажется мне привлекательным сочетанием!

...