ansible создание openssl_csr с динамическим c CN и список alt_namess - PullRequest
0 голосов
/ 26 мая 2020

Я создаю закрытый ключ и файл csr через ansible. Я застрял в том, как передать имена CN и alt (список, разделенный запятыми) в ansible playbook.

ручная команда и файл конфигурации.

openssl req -new -sha256 -nodes -out NEW.csr -newkey rsa:2048 -keyout NEW.key -config config.txt

[req]
default_bits = 2048
prompt = no
default_md = sha256
req_extensions = req_ext
distinguished_name = dn

[dn]
C=US
ST=NEWYORK
L=CITY
O=ABC
OU=XYZ
emailAddress=ABC@XYZ.com
CN = uat.com

[req_ext]
subjectAltName = @alt_names

[alt_names]
DNS.1 = us.uat.com
DNS.2 = apac.uat.com 
DNS.3 =  123
DNS.4 =  abc
DNS.5 =  xyz

Я создал playbook ниже, но застрял на том, как передать CN и alt_names в виде списка, разделенного запятыми, в качестве входных данных, а также, если существует существующий CN с alt_names, я хочу, чтобы ansible добавлялся / добавить записи DNS-сервера в файл конфигурации и создать новый файл csr.

   - name: Generate an OpenSSL private RSA key with size-2048 bits
     openssl_privatekey:
      path: API.key_{{ansible_date_time.iso8601}}
      type: RSA
      size: 2048
     register: privatekey

   - name: Generate an OpenSSL certificate signing request file bases on input key values
     openssl_csr:
       path: API.csr_{{ansible_date_time.iso8601}}
       privatekey_path: "{{ privatekey.filename }}"
       common_name: "{{ CN }}"
       group: apigee
       owner: apigee
       mode: '700'
       digest: sha256
       email_address:  abc@xyz.com
       country_name: US
       locality_name:  
       organization_name:  
       organizational_unit_name:  
       state_or_province_name:  
       subject_alt_name: "{{ item.value | map('regex_replace', '^', 'DNS:') | list }}"
     with_dict:
       dns_server:
       - www.ansible.com
       - m.ansible.com
   - debug: var="{{ item }}"
     with_items:
     - csr.filename
     - csr.privatekey
     - csr.subject
     - csr.subjectAltName

Ответы [ 2 ]

0 голосов
/ 28 мая 2020

Вариант 1: передать extra_vars как словарь

ansible-playbook test.yaml -vv -e '{"CN":"uat.com","dns_server":["www.ansible.com","m.ansible.com"]}'

Вариант 2: несколько extra_vars, но необходимо редактировать переменную dns_server: "{{ dns_server_list.split(',') }}"

ansible-playbook test.yaml -vv -e "dns_server_list=www.ansible.com,m.ansible.com" -e "CN=uat.com"

для ниже test.yaml

---
- hosts: loadbalancer
  vars:
    dns_server: "{{ dns_server_list.split(',') }}"
  tasks:
  - name: debug CN
    debug:
      msg: "{{ CN }}"
    when: CN is defined
  - name: debug dns_server
    debug:
      msg: "{{ dns_server }}"
    when: dns_server is defined

приведет к

TASK [debug CN] ************************************************************************************************************************************
task path: /vagrant/provisioning/testvar.yaml:4
ok: [loadbalancer] => {
    "msg": "uat.com"
}

TASK [debug dns_server] ****************************************************************************************************************************
task path: /vagrant/provisioning/testvar.yaml:8
ok: [loadbalancer] => {
    "msg": [
        "www.ansible.com", 
        "m.ansible.com"
    ]
}
0 голосов
/ 27 мая 2020

Привет, пожалуйста, попробуйте этот фрагмент

  vars:
    CN: uat.com
    dns_server:
      - www.ansible.com
      - m.ansible.com

  tasks:

  - name: Generate an OpenSSL private RSA key with size-2048 bits
    openssl_privatekey:
      path: API.key_{{ansible_date_time.iso8601}}
      type: RSA
      size: 2048
    register: privatekey

  - name: Generate an OpenSSL certificate signing request file bases on input key values
    openssl_csr:
      path: API.csr_{{ansible_date_time.iso8601}}
      privatekey_path: "{{ privatekey.filename }}"
      common_name: "{{ CN }}"
      group: apigee
      owner: apigee
      mode: '700'
      digest: sha256
      email_address:  abc@xyz.com
      country_name: US
      locality_name:  
      organization_name:  
      organizational_unit_name:  
      state_or_province_name:  
      subject_alt_name: "{{ item.value | map('regex_replace', '^', 'DNS:') | list }}"
    with_dict:
      dns_server: "{{dns_server}}"
    register: csr

  - set_fact:
      res: "{{csr.results[0]}}"

  - debug: var="{{item}}"
    with_items:
    - res.filename
    - res.privatekey
    - res.subject
    - res.subjectAltName
...