Ansible 在角色中设置 ansible_user 和 ansible_ssh_pass

标签 ansible

我正在 ansible 中创建我的第一个角色,通过 apt 安装软件包,因为这是我每天都会做的任务。

apt
├── apt_install_package.yaml
├── server.yaml
├── tasks
│   └── main.yaml
└── vars
    └── main.yaml

# file: apt_install_package.yaml

- name: apt role
  hosts: server
  gather_facts: no
  become: yes
  roles:
  - apt

# tasks
- name: install package
  apt: 
   name: "{{ package }}" 
   state: present
   update_cache:  True
  with_items: "{{ package }}"

#vars
---
package:
  - nginx
  - supervisor

#inventory
---
server:
  hosts:
    new-server:
      ansible_host: 10.54.x.x


为了安装软件包,我必须指定 ssh 用户,但我不知道在哪里指定。

我的想法是用变量来表示参数,类似于这样

  ansible_user: "{{ myuser }}"
  ansible_ssh_pass: "{{ mypass }}"
  ansible_become_pass: "{{ mypass }}"

有什么建议吗?

问候,

最佳答案

根据 latest documentation对于任何给定的主机或主机组条目,在 Ansible 中,关于 list 源,可以使用 ansible_password 关键字配置 SSH 密码,同时通过 ansible_user 关键字指定 SSH 用户。

值得一提的是,为了使用Ansible实现主机的SSH密码登录,sshpass Controller 上需要程序。否则,由于初始化连接时注入(inject)密码错误,任何播放都会失败。

按以下方式在现有广告资源中定义这些关键字:

#inventory
---
server:
  hosts:
    new-server:
      ansible_host: 10.54.x.x
      ansible_user: <username>
      ansible_password: <password>
      ansible_become_password; <password>

YAML 插件将从 list 源解析您的主机配置参数,并将附加用于建立 SSH 连接的主机/组变量。

这种情况下的主要缺点是您的身份验证 key 将以纯文本形式存储,并且通常 Ansible 是致力于源代码控制存储库的 IaC。在生产环境中 Not Acceptable 。

考虑使用查找插件,例如 envfile从 Controller 动态呈现密码 secret 并防止泄露。

#inventory
---
server:
  hosts:
    new-server:
      ansible_host: 10.54.x.x
      ansible_user: "{{ lookup('env', 'MY_SECRET_ANSIBLE_USER') }}"
      ansible_password: "{{ lookup('file', '/path/to/password') }}"
      ansible_become_password; "{{ lookup('env', 'MY_SECRET_BECOME_PASSWORD') }}"

根据您的用例,其他查找插件也可能对您有用,并且可以进一步研究 here .

或者,您可以在 Ansible 配置文件中单独指定默认远程连接用户、连接用户密码和密码,该文件通常位于 /etc/ansible/ansible.cfg

了解有关 Ansible 中可用配置选项的更多信息 here .

所有三个提到的配置选项都可以在[defaults] INI 部分下指定为:

remote_user:默认连接用户名

connection_password_file:默认连接密码文件

become_password_file:默认成为密码文件

注意:connection_password_filebecome_password_file 必须是包含 Ansible 用于登录或升级权限的密码的文件系统路径。不支持在配置文件中将默认密码存储为纯文本字符串。

另一个选项涉及剧本执行时存在的环境变量。在 playbook 执行时导出或通过命令行显式传递它们。

ANSIBLE_REMOTE_USER:默认连接用户名

ANSIBLE_CONNECTION_PASSWORD_FILE:默认连接密码文件

ANSIBLE_BECOME_PASSWORD_FILE:默认成为密码文件

比如下面这样:

ANSIBLE_BECOME_PASSWORD_FILE="/path/to/become_password"ansible-playbook ...

除非您更新 Controller 上 Ansible 运行用户的 shell 配置文件以在登录时自动设置这些变量,否则这种方法的效率要低得多。通常不建议用于密码等敏感数据。

就安全性而言,尽可能首选 SSH key 对身份验证。但是,第二种最佳方法是使用 ansible-vault 来保管敏感密码。

Vault 允许您加密静态数据,并在库存/播放中引用它,而不会造成泄露风险。

查看此link了解可用程序并开始使用。

关于Ansible 在角色中设置 ansible_user 和 ansible_ssh_pass,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70992112/

相关文章:

elasticsearch - 通过Ansible或Fig运行docker中的传递参数(例如-Des.node.name =“TestNode”)

ansible - 使用 Ansible 读取远程节点上的 INI 文件中的选项的正确方法是什么?

ansible - 无法将纪元转换为ansible中可读的格式

grails - Ansible 无法在 Vagrant 机器上构建 Grails war

ubuntu - Ansible apt 任务 : Failed to Lock apt for Exclusive Operation

kubernetes - 在组名中发现无效字符但未替换 ansible k8s

linux - 在 Ansible 剧本中循环注册变量

ansible - 在 Ansible 中,如何迭代键/值对列表?

python - Ansible EC2 Python 错误 : ValueError: No JSON object could be decoded

Ansible 警告 "type list in a string field was converted to type string"