ระบุรหัสผ่าน sudo สำหรับ Ansible


225

ฉันจะระบุรหัสผ่าน sudo สำหรับ Ansible แบบไม่โต้ตอบได้อย่างไร

ฉันใช้งานเพลย์บุ๊ค Ansible เช่นนี้:

$ ansible-playbook playbook.yml -i inventory.ini \
    --user=username --ask-sudo-pass

แต่ฉันต้องการเรียกใช้เช่นนี้:

$ ansible-playbook playbook.yml -i inventory.ini \
    --user=username` **--sudo-pass=12345**

มีวิธีหรือไม่? ฉันต้องการทำให้การปรับใช้โครงการเป็นไปโดยอัตโนมัติให้มากที่สุด


4
ดูเพิ่มเติมที่: serverfault.com/questions/560106/…
utapyngo

คำตอบ:


170

--extra-vars "name=value"คุณสามารถส่งผ่านตัวแปรในบรรทัดคำสั่งผ่านทาง ตัวแปรรหัสผ่าน Sudo ansible_sudo_passคือ ดังนั้นคำสั่งของคุณจะมีลักษณะดังนี้:

ansible-playbook playbook.yml -i inventory.ini --user=username \
                              --extra-vars "ansible_sudo_pass=yourPassword"

ปรับปรุง 2017 : เบิ้ล 2.2.1.0 ตอนนี้ใช้ ansible_become_passvar ดูเหมือนว่าทั้งสองจะทำงาน


7
จากมุมมองด้านความปลอดภัยคำตอบที่ดีที่สุดถ้าคุณเพิ่มต่อไปนี้: history -cหลังจากการดำเนินการของ yml
kiltek

12
@kiltek: หรือเพิ่มช่องว่างที่จุดเริ่มต้นของเส้น (ในทุบตี) ซึ่งจะ* ไม่ *.bash_historyเขียนเส้น
ccpizza

44
ไม่ใช่วิธีที่ดีที่จะส่งผ่านรหัสผ่านบนบรรทัดรับคำสั่ง ทุกคนจะสามารถดูรหัสผ่านในรายการกระบวนการในขณะที่คำสั่งดำเนินการ ...
พาเวล Chernikov

22
ยังทำไม่ได้เลย --ask-sudo-pass
JasonG

2
@scrutari ใช้ได้อย่างสมบูรณ์ในบางสถานการณ์: ตัวอย่าง: เปลี่ยนจากค่าเริ่มต้น, รหัสผ่านเริ่มต้น, ที่รู้จักกันทั่วโลกไปยังการฉีดรหัสสาธารณะ ssh ของผู้ใช้ ... คิดว่าการกำหนดค่าเริ่มต้นของระบบที่ถ่ายภาพใหม่
Ceredig

236

เอกสาร แนะนำอย่างยิ่งให้ตั้งค่ารหัสผ่าน sudo ในธรรมดาและแทนที่จะใช้--ask-sudo-passในบรรทัดคำสั่งเมื่อทำงานansible-playbook


อัพเดท 2016:

Ansible 2.0 (ไม่ใช่ 100% เมื่อ) ทำเครื่องหมาย--ask-sudo-passว่าเลิกใช้แล้ว เอกสารในขณะนี้ขอแนะนำให้ใช้--ask-become-passแทนในขณะที่ยังมีการสลับการใช้งานsudoตลอดทั้ง playbooks becomeของคุณด้วย


16
ใช่ฉันเห็นได้ว่าเหตุใดจึงแนะนำให้ทำเช่นนี้ อย่างไรก็ตามเมื่อเราใช้ Ansible เป็นส่วนหนึ่งของกระบวนการปรับใช้วิธีที่ดีกว่าในการทำให้สิ่งนี้เป็นแบบอัตโนมัติคืออะไร ไม่สะดวกในการหยุดกลางกระบวนการปรับใช้และขอให้ผู้ใช้ป้อนรหัสผ่าน sudo
Slava Fomin II

9
หมายเหตุ --ask-sudo-pass สามารถยกเลิกได้ที่ -K อย่างไรก็ตามเท่าที่ฉันเห็นไม่มีวิธีจัดการ playbook ที่ทำงานบนเซิร์ฟเวอร์หลายเครื่องด้วยรหัสผ่านที่แตกต่างกัน (มันถามคุณเพียงครั้งเดียว) ดังนั้นฉันคิดว่าไม่มีรหัสผ่าน sudo เป็นวิธีที่จะไป
William Turrell

1
ดูเหมือนจะไม่ทำงาน แต่ข้อเสนอแนะต่อไป ("some-host ansible_sudo_pass = 'foobar'") ทำ
nadavkav

--ask-sudo-pass เลิกใช้แล้วก่อนหน้านี้ใน 1.9
Chris Betti

ฉันชอบที่จะปรับปรุงคำตอบด้วยลิงค์แหล่งที่มาหากคุณมี
deefour

106

อาจเป็นวิธีที่ดีที่สุดในการทำเช่นนี้ - สมมติว่าคุณไม่สามารถใช้โซลูชัน NOPASSWD ที่ scottod จัดทำขึ้นให้ใช้โซลูชันของ Mircea Vutcovici ร่วมกับAnsible vaultหลุมฝังศพเบิ้ล

ตัวอย่างเช่นคุณอาจมี playbook บางอย่างเช่นนี้:

- hosts: all

  vars_files:
    - secret

  tasks:
    - name: Do something as sudo
      service: name=nginx state=restarted
      sudo: yes

ที่นี่เรารวมไฟล์ที่เรียกว่า secretซึ่งจะมีรหัสผ่าน sudo ของเรา

เราจะใช้ ansible-vault เพื่อสร้างเวอร์ชันที่เข้ารหัสของไฟล์นี้:

ansible-vault create secret

นี่จะขอรหัสผ่านจากคุณจากนั้นเปิดตัวแก้ไขเริ่มต้นเพื่อแก้ไขไฟล์ คุณสามารถใส่ของคุณansible_sudo_passที่นี่

เช่นsecret:

ansible_sudo_pass: mysudopassword

บันทึกและออกตอนนี้คุณมีsecretไฟล์ที่เข้ารหัสซึ่ง Ansible สามารถถอดรหัสเมื่อคุณเรียกใช้ playbook ของคุณ หมายเหตุ: คุณสามารถแก้ไขไฟล์ได้ansible-vault edit secret (และป้อนรหัสผ่านที่คุณใช้เมื่อสร้างไฟล์)

ชิ้นสุดท้ายของตัวต่อคือการให้ Ansible --vault-password-fileซึ่งมันจะใช้ในการถอดรหัสของคุณsecretไฟล์

สร้างไฟล์ชื่อvault.txtและใส่รหัสผ่านที่คุณใช้เมื่อสร้างsecretไฟล์รหัสผ่านควรเป็นสตริงที่จัดเก็บเป็นบรรทัดเดียวในไฟล์

จาก Ansible Docs:

.. ตรวจสอบให้แน่ใจว่าการอนุญาตในไฟล์นั้นไม่มีใครสามารถเข้าถึงคีย์ของคุณได้และอย่าเพิ่มคีย์ของคุณในการควบคุมซอร์ส

ในที่สุด: ตอนนี้คุณสามารถเรียกใช้ playbook ด้วยสิ่งที่ชอบ

ansible-playbook playbook.yml -u someuser -i hosts --sudo --vault-password-file=vault.txt 

ด้านบนคือสมมติว่าไดเรคทอรีดังต่อไปนี้:

.
|_ playbook.yml
|_ secret
|_ hosts
|_ vault.txt

คุณสามารถอ่านเพิ่มเติมเกี่ยวกับ Ansible Vault ได้ที่นี่: https://docs.ansible.com/playbooks_vault.html


5
หมายเหตุ: ตั้งแต่ ansible 1.9 ดูเหมือนว่าคุณจะไม่สามารถใช้ตัวแปร ansible_sudo_pass (หรือ ansible_become_pass) ได้อีกต่อไป: "ร้ายแรง: [... ] => ไม่มีรหัสผ่าน"
toast38coza

6
ฉันกำลังใช้วิธีแก้ปัญหานี้ในการผลิตเจนกินส์เก็บรหัสผ่านห้องนิรภัยเป็นตัวแปรสภาพแวดล้อมที่ยุ่งเหยิงเขียนมันที่รันไทม์ในไฟล์ชั่วคราวและดำเนินการเพื่อเรียกใช้ ansible
simone cittadini

6
หรือมากกว่าเพียง: ansible-vault create group_vars/all/ansible.ymlและเพิ่มansible_sudo_pass: yourpasswordมี ไม่จำเป็นต้องเปลี่ยน playbooks หรือคลังโฆษณา
Bouke Versteegh

1
พยายามทำสิ่งนี้ แต่ฉันได้รับข้อผิดพลาดนี้:fatal: [localhost]: FAILED! => {"changed": false, "failed": true, "module_stderr": "sudo: a password is required\n", "module_stdout": "", "msg": "MODULE FAILURE", "parsed": false}
JohnnyQ

8
อะไรคือสิ่งที่ดีถ้าคุณเก็บรหัสผ่านไปยังห้องนิรภัยเป็นข้อความธรรมดาถัดจากมัน?
Erik

44

ดูรหัส ( runner/__init__.py) ฉันคิดว่าคุณน่าจะตั้งรหัสนี้ในไฟล์คลังโฆษณาของคุณ:

[whatever]
some-host ansible_sudo_pass='foobar'

ดูเหมือนจะมีบทบัญญัติบางอย่างในansible.cfgไฟล์ปรับแต่งด้วย แต่ไม่ได้นำมาใช้ในตอนนี้ ( constants.py)


7
วิธีที่ดีในการกำหนดค่านี้อย่างปลอดภัยคือการจัดเก็บไว้ในไดเรกทอรีhost_varsหรือgroup_varsจากนั้นเข้ารหัสไฟล์โดยใช้ansible-vault
Kyle

44

ฉันไม่คิดว่า ansible จะให้คุณระบุรหัสผ่านในการตั้งค่าตามที่คุณต้องการ อาจมีบางอย่างในการกำหนดค่าที่สามารถตั้งค่าได้ แต่สิ่งนี้จะทำให้การใช้งานโดยรวมมีความปลอดภัยน้อยลงและไม่แนะนำ

สิ่งหนึ่งที่คุณสามารถทำได้คือการสร้างผู้ใช้บนเครื่องเป้าหมายและให้สิทธิ์ผู้ใช้ sudo โดยไม่ต้องใช้รหัสผ่านกับคำสั่งทั้งหมดหรือรายการคำสั่งที่ จำกัด

หากคุณเรียกใช้sudo visudoและป้อนบรรทัดตามด้านล่างผู้ใช้ 'privilegedUser' จะไม่ต้องป้อนรหัสผ่านเมื่อใช้งานบางอย่างเช่นsudo service xxxx start:

%privilegedUser ALL= NOPASSWD: /usr/bin/service

7
@bschlueter ดังนั้นคุณรับรองการปฏิบัติที่ไม่ดี?
stephen

1
ฉันไม่คิดว่านี่เป็นความคิดที่ดี ใช้ --ask-sudo-pass ทำให้รู้สึกถึงฉัน
kgpdeveloper

@simone cittadini ฉันเห็นด้วยเหมือนกันจริง ๆ แล้วนั่นคือคำตอบที่ฉันจะให้ อันนี้มีความเสี่ยงด้านความปลอดภัย
einarc

มีความเสี่ยงด้านความปลอดภัยน้อยกว่าหากคุณใช้ sudo ไม่มีรหัสผ่านในการปรับใช้กับ staging / prod แต่ต้องการใช้คำตอบเหล่านี้เพื่อข้ามโดยไม่ต้องพิมพ์รหัสผ่านเข้าสู่ระบบแล็ปท็อปท้องถิ่นของคุณเมื่อปรับใช้กับ localhost ของคุณ
Jonathan Hartley

คุณจะเพิ่มบรรทัดนี้โดยใช้ Ansible ได้อย่างไร
Matthias

21

รหัสผ่าน sudoansible_sudo_passจะถูกเก็บเป็นตัวแปรที่เรียกว่า คุณสามารถตั้งค่าตัวแปรนี้ได้หลายวิธี:

ต่อโฮสต์ในไฟล์โฮสต์พื้นที่โฆษณาของคุณ ( inventory/<inventoryname>/hosts)

[server]
10.0.0.0 ansible_sudo_pass=foobar

ต่อกลุ่มในไฟล์กลุ่มคลังโฆษณาของคุณ ( inventory/<inventoryname>/groups)

[server:vars]
ansible_sudo_pass=foobar

ต่อกลุ่มในกลุ่ม vars ( group_vars/<groupname>/ansible.yml)

ansible_sudo_pass: "foobar"

เข้ารหัสต่อกลุ่ม ( ansible-vault create group_vars/<groupname>/ansible.yml)

ansible_sudo_pass: "foobar"

18

คุณสามารถตั้งรหัสผ่านสำหรับกลุ่มหรือสำหรับเซิร์ฟเวอร์ทั้งหมดในครั้งเดียว:

[all:vars]
ansible_sudo_pass=default_sudo_password_for_all_hosts

[group1:vars]
ansible_sudo_pass=default_sudo_password_for_group1

14

ฉันกำลังฉีกผมของฉันออกไปจากที่นี่ตอนนี้ฉันได้พบวิธีแก้ปัญหาที่ฉันต้องการ:

1 ไฟล์ที่เข้ารหัสต่อโฮสต์ที่มีรหัสผ่าน sudo

/ etc / เบิ้ลโฮสต์ /:

[all:vars]
ansible_ssh_connection=ssh ansible_ssh_user=myuser ansible_ssh_private_key_file=~/.ssh/id_rsa

[some_service_group]
node-0
node-1

จากนั้นคุณสร้างไฟล์ var-file ที่เข้ารหัสเช่นนี้:

ansible-vault create /etc/ansible/host_vars/node-0

ด้วยเนื้อหา

ansible_sudo_pass: "my_sudo_pass_for_host_node-0"

วิธีที่คุณจัดระเบียบรหัสผ่านห้องนิรภัย (ป้อนผ่าน --ask-vault-pass) หรือโดย cfg ขึ้นอยู่กับคุณ

จากนี้ฉันสงสัยว่าคุณสามารถเข้ารหัสไฟล์โฮสต์ทั้งหมด ...


Encrypting ใช้หกคะเมนเหมาะสมที่สุดกับผม ansible-playbackแต่ผมพยายามที่จะใช้พวกเขาด้วย ฉันต้องใช้-e @vault/filename.extเพื่อใช้ห้องนิรภัยพร้อมansible-playbookสายของฉัน
Alex

9

วิธีที่เข้าใจได้มากกว่าในการทำเช่นนี้คือการจัดเก็บsudoรหัสผ่านของคุณในตู้นิรภัยที่ปลอดภัยเช่นLastPassหรือKeePassจากนั้นส่งผ่านไปยังการansible-playbookใช้-e@แต่แทนที่จะฮาร์ดโค้ดเนื้อหาในไฟล์จริงคุณสามารถใช้โครงสร้าง-e@<(...)เพื่อเรียกใช้คำสั่งใน sub-shell และเปลี่ยนทิศทางเอาต์พุต (STDOUT) ไปยัง file descriptor นิรนามป้อนรหัสผ่านอย่างมีประสิทธิภาพ-e@<(..)เพื่ออธิบายไฟล์ที่ไม่ระบุชื่อได้อย่างมีประสิทธิภาพการให้อาหารรหัสผ่านไปยัง

ตัวอย่าง

$ ansible-playbook -i /tmp/hosts pb.yml \
   -e@<(echo "ansible_sudo_pass: $(lpass show folder1/item1 --password)")

ด้านบนกำลังทำอะไรหลายอย่างมาทำลายมันกัน

  • ansible-playbook -i /tmp/hosts pb.yml - เห็นได้ชัดว่าใช้งาน playbook ผ่าน ansible-playbook
  • $(lpass show folder1/item1 --password)"- รัน LastPass CLI lpassและดึงรหัสผ่านที่จะใช้
  • echo "ansible_sudo_pass: ...password..." - รับสตริง 'ansible_sudo_pass:' และรวมเข้ากับรหัสผ่านที่จัดทำโดย lpass
  • -e@<(..)- ใส่ด้านบนเข้าด้วยกันและเชื่อมต่อ subshell <(...)เป็นไฟล์ descriptor สำหรับansible-playbookการบริโภค

การปรับปรุงเพิ่มเติม

หากคุณไม่ต้องการพิมพ์ทุกครั้งที่คุณสามารถทำสิ่งต่าง ๆ เช่นนี้ ก่อนอื่นให้สร้างนามแฝงในชื่อที่คุณ.bashrcชอบ:

$ cat ~/.bashrc
alias asp='echo "ansible_sudo_pass: $(lpass show folder1/item1 --password)"'

ตอนนี้คุณสามารถเรียกใช้ playbook ของคุณเช่นนี้:

$ ansible-playbook -i /tmp/hosts pb.yml -e@<(asp)

อ้างอิง


1
การใช้ subshell เป็นแนวคิดที่ฉลาดมาก! สำหรับผู้ที่สงสัยว่านี่คือสิ่งที่ดูเหมือนกับ 1Password ของ CLI:--extra-vars @<(echo ansible_become_pass: $(op get item <item name> | jq --raw-output '.details.sections[0].fields[] | select(.t=="password").v'))
Diti

1
ฉันชอบสิ่งนี้เพราะเมื่อฉันตรวจสอบประวัติ bach รหัสผ่านจะไม่ปรากฏในข้อความธรรมดา สิ่งนี้อาจเป็นจริงเช่นกันหากเปิดใช้งานการตรวจสอบระบบคำสั่งจะถูกบันทึกเป็นการอ่านไฟล์เช่น/dev/fd/63โดยรหัสผ่านที่อยู่ในตัวบ่งชี้ไฟล์ชั่วคราวจะไม่ถูกเปิดเผย
JPvRiel

5

หากคุณพอใจกับการเก็บรหัสผ่านไว้ในไฟล์ข้อความธรรมดาตัวเลือกอื่นคือการใช้ไฟล์ JSON พร้อมกับพารามิเตอร์ --extra-vars (อย่าลืมแยกไฟล์ออกจากแหล่งควบคุม):

ansible-playbook --extra-vars "@private_vars.json" playbook.yml 

เบิ้ลได้ให้การสนับสนุนตัวเลือกนี้ตั้งแต่ 1.3


5

คุณสามารถเขียนรหัสผ่าน sudo สำหรับ playbook ของคุณในไฟล์ hosts ดังนี้:

[host-group-name]
host-name:port ansible_sudo_pass='*your-sudo-password*'

5

ห้องนิรภัย Ansible ได้รับการแนะนำสองครั้งที่นี่ แต่ฉันชอบ git-crypt สำหรับการเข้ารหัสไฟล์ที่ละเอียดอ่อนใน playbooks ของฉัน หากคุณใช้คอมไพล์เพื่อเก็บเพลย์บุ๊ค ansible ของคุณมันเป็นเรื่องง่าย ปัญหาที่ฉันพบกับตู้เซฟ ansible คือฉันต้องเจอไฟล์ที่เข้ารหัสที่ฉันต้องการใช้งานและต้องถอดรหัสก่อนที่ฉันจะทำงานได้ git-cryptเสนอเวิร์กโฟลว์ที่ดีกว่า IMO

การใช้สิ่งนี้คุณสามารถใส่รหัสผ่านของคุณใน var ใน playbook ของคุณและทำเครื่องหมาย playbook ของคุณเป็นไฟล์ที่เข้ารหัสใน.gitattributesลักษณะนี้:

 my_playbook.yml filter=git-crypt diff=git-crypt

Playbook ของคุณจะถูกเข้ารหัสอย่างโปร่งใสใน Github จากนั้นคุณเพียงแค่ต้องติดตั้งคีย์เข้ารหัสของคุณบนโฮสต์ที่คุณใช้เพื่อเรียกใช้ ansible หรือทำตามคำแนะนำในเอกสารประกอบเพื่อตั้งค่าด้วยgpgแล้วคุณก็ต้องทั้งติดตั้งคีย์การเข้ารหัสของคุณบนโฮสต์ที่คุณใช้เพื่อเรียกเบิ้ลหรือปฏิบัติตามคำสั่งได้ในเอกสารที่จะตั้งขึ้นด้วย

มีดี Q & A ในการส่งต่อเป็นgpgกุญแจของคุณเช่นssh-agentการส่งต่อ SSH กุญแจที่นี่: /superuser/161973/how-can-i-forward-a-gpg-key-via-ssh-agent


3

คุณสามารถใช้sshpassยูทิลิตี้ดังต่อไปนี้

$ sshpass -p "your pass" ansible pattern -m module -a args \
   -i inventory --ask-sudo-pass

3

ใช้ansible 2.4.1.0และต่อไปนี้จะทำงาน:

[all]
17.26.131.10
17.26.131.11
17.26.131.12
17.26.131.13
17.26.131.14

[all:vars]
ansible_connection=ssh
ansible_user=per
ansible_ssh_pass=per
ansible_sudo_pass=per

และเพียงแค่เรียกใช้playbookด้วยคลังโฆษณานี้เป็น:

ansible-playbook -i inventory copyTest.yml

3

การแฮ็คของฉันโดยอัตโนมัติสิ่งนี้คือการใช้ตัวแปรสภาพแวดล้อมและเข้าถึงผ่านทาง --extra-vars="ansible_become_pass='{{ lookup('env', 'ANSIBLE_BECOME_PASS') }}'"สับของฉันโดยอัตโนมัตินี้คือการใช้ตัวแปรสภาพแวดล้อมและการเข้าถึงผ่านทาง

ส่งออก env var แต่หลีกเลี่ยงประวัติทุบตี / เชลล์ (เสริมด้วยช่องว่างหรือวิธีอื่น ๆ ) เช่น:

     export ANSIBLE_BECOME_PASS='<your password>'

ค้นหา env var ขณะที่ส่งansible_become_passตัวแปรพิเศษเข้าไปในansible-playbook, เช่น:

ansible-playbook playbook.yml -i inventories/dev/hosts.yml -u user --extra-vars="ansible_become_pass='{{ lookup('env', 'ANSIBLE_BECOME_PASS') }}'"

คำตอบอื่นที่ดี:


2

คุณสามารถใช้ตู้เซฟนิรภัยได้ซึ่งจะรหัสรหัสผ่านของคุณลงใน vault ที่เข้ารหัส หลังจากนั้นคุณสามารถใช้ตัวแปรจากห้องนิรภัยใน playbooks

เอกสารบางอย่างเกี่ยวกับห้องนิรภัย ansible:
http://docs.ansible.com/playbooks_vault.html

เราใช้มันเป็นห้องนิรภัยต่อสภาพแวดล้อม เพื่อแก้ไขห้องนิรภัยเรามีคำสั่งดังนี้:
ansible-vault edit inventories/production/group_vars/all/vault

หากคุณต้องการเรียกตัวแปร vault คุณต้องใช้ ansible-playbook กับพารามิเตอร์เช่น:
ansible-playbook -s --vault-password-file=~/.ansible_vault.password

ใช่เรากำลังเก็บรหัสผ่าน vault ไว้ในไดเรกทอรีภายในด้วยข้อความธรรมดา แต่มันก็ไม่อันตรายเช่นรหัสผ่าน root สำหรับทุกระบบ รหัสผ่านรูทอยู่ในไฟล์ vault หรือคุณสามารถมีได้เหมือนไฟล์ sudoers สำหรับผู้ใช้ / กลุ่มของคุณ

ฉันแนะนำให้ใช้ไฟล์ sudoers บนเซิร์ฟเวอร์ นี่คือตัวอย่างสำหรับผู้ดูแลกลุ่ม:
%admin ALL=(ALL) NOPASSWD:ALL



1

หลังจากห้าปีที่ผ่านมาฉันเห็นว่าเรื่องนี้ยังคงเป็นเรื่องที่เกี่ยวข้องมาก ค่อนข้างสะท้อนถึงคำตอบของ leucos ซึ่งฉันพบว่าดีที่สุดในกรณีของฉันโดยใช้เครื่องมือที่เข้าใจได้เท่านั้น (โดยไม่มีการรับรองความถูกต้องจากส่วนกลาง, โทเค็นหรืออะไรก็ตาม) สิ่งนี้จะถือว่าคุณมีชื่อผู้ใช้และรหัสสาธารณะเดียวกันบนเซิร์ฟเวอร์ทั้งหมด หากคุณไม่แน่นอนคุณจะต้องเจาะจงมากขึ้นและเพิ่มตัวแปรที่เกี่ยวข้องถัดจากโฮสต์:

[all:vars]
ansible_ssh_user=ansible
ansible_ssh_private_key_file=home/user/.ssh/mykey
[group]
192.168.0.50 ansible_sudo_pass='{{ myserver_sudo }}'

ansible-vault create mypasswd.yml
ansible-vault edit mypasswd.yml

เพิ่ม:

myserver_sudo: mysecretpassword

แล้ว:

ansible-playbook -i inv.ini my_role.yml --ask-vault --extra-vars '@passwd.yml'

อย่างน้อยคุณก็ไม่ต้องเขียนตัวแปรที่ชี้ไปยังรหัสผ่านอีก


1

วิธีแก้ปัญหาข้างต้นโดย @ toast38coza ใช้ได้สำหรับฉัน เพียงแค่sudo: ใช่เลิกใช้แล้วใน Ansible ตอนนี้ ใช้เป็นและกลายเป็น_ ผู้ใช้แทน

tasks:
 - name: Restart apache service
   service: name=apache2 state=restarted
   become: yes
   become_user: root

0

นอกจากนี้เรายังสามารถใช้ EXPECT BLOCK ในการสำรวจวางไข่และปรับแต่งตามความต้องการของคุณ

- name: Run expect to INSTALL TA
  shell: |
    set timeout 100
    spawn /bin/sh -i

    expect -re "$ "
    send "sudo yum remove -y xyz\n"

    expect "$ "
    send "sudo yum localinstall -y {{ rpm_remotehost_path_for_xyz }}\n"

    expect "~]$ "
    send "\n"

    exit 0
  args:
  executable: /usr/bin/expect

0

ง่ายมากและเพิ่มเฉพาะในไฟล์ตัวแปร:

ตัวอย่าง:

$ vim group_vars/all

และเพิ่มสิ่งเหล่านี้:

Ansible_connection: ssh
Ansible_ssh_user: rafael
Ansible_ssh_pass: password123
Ansible_become_pass: password123

ขอบคุณ แต่ฉันคิดว่าคุณหมายถึง ansible_become_pass แทน Ansible_become_pass
Krishnom

0

เป็นเพียงแค่ภาคผนวกดังนั้นจึงไม่มีใครที่น่ารำคาญที่ฉันทำเมื่อเร็ว ๆ นี้:

AFAIK ทางออกที่ดีที่สุดคือหนึ่งในสายทั่วไปของขนมปังปิ้ง 38coza ข้างต้น หากเหมาะสมที่จะผูกไฟล์รหัสผ่านและ playbook ของคุณไว้พร้อมกันให้ทำตามแม่แบบของเขาด้วยvars_files(หรือinclude_vars) หากคุณต้องการแยกมันออกจากกันคุณสามารถระบุเนื้อหาของตู้นิรภัยในบรรทัดคำสั่งดังนี้:

ansible-playbook --ask-vault-pass -e@<PATH_TO_VAULT_FILE> <PLAYBOOK_FILE>

เห็นได้ชัดว่าย้อนหลัง แต่นี่คือ gotchas:

  1. สัญลักษณ์@นั่นนองเลือด หากคุณปล่อยทิ้งไว้การแยกวิเคราะห์จะไม่ทำงานอย่างเงียบ ๆและเพลย์ลิสต์ที่เล่นได้จะดำเนินการต่อราวกับว่าคุณไม่ได้ระบุไฟล์ไว้ตั้งแต่แรก

  2. คุณต้องนำเข้าเนื้อหาของห้องนิรภัยอย่างชัดเจนด้วยบรรทัดคำสั่ง --extra-vars / -e หรือภายในรหัส YAML ของคุณ การ--ask-vault-passตั้งค่าสถานะไม่ได้ทำอะไรด้วยตัวเอง (นอกจากแจ้งให้คุณทราบถึงค่าที่อาจใช้หรือไม่สามารถใช้ในภายหลัง)

ขอให้คุณใส่ "@" และบันทึกได้หนึ่งชั่วโมง


-3

สิ่งนี้ทำงานได้สำหรับฉัน ... สร้างไฟล์ /etc/sudoers.d/90-init-users ด้วย NOPASSWD

echo "user ALL=(ALL)       NOPASSWD:ALL" > 90-init-users

โดยที่ "ผู้ใช้" เป็นหมายเลขผู้ใช้ของคุณ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.