Andible自动填写密码/密码短语

有关在Ansible中指定密码的总结(使用方法)。

简要概述

SSH连接密码

    • ssh のパスワードを自動入力するためには、sshpass が必要。

 

    • sshpass は ansible のモジュールではないため、別途インストールが必要。

 

    • sshpass は、”assword” という文字列 (プロンプト) が表示されるのを待って、パスワードを入力。

 

    • ansible から呼び出す sshpass へ引数を渡す方法が用意されていないため、秘密鍵のパスフレーズ入力には(そのままでは)使用不可。

 

    • 秘密鍵のパスフレーズは外さずに ssh-agent/ssh-add を使用。

 

    • やむを得ずパスワード/パスフレーズを設定ファイル等に記載する場合には、ansible-vault で暗号化。

 

    ログインパスワードは一般的に sudo 権限昇格のパスワードと同じため、公開鍵暗号等に速やかに移行。

变成 (sudo) 密码

    パスワードを記載する必要がある場合には、ansible-vault で暗号化。

公開密钥密码中私钥文件名的技巧

    • sshpass プログラムはデフォルトで “assword” を含むプロンプトを期待している。

 

    • ssh のパスフレーズ入力プロンプトは “Enter passphrase for key ‘…id_rsa’:” となっており、”assword” を含まない。(そのため、sshpass がプロントを待ち続けて、そのままでは自動化できない)

 

    秘密鍵のファイル名に “assword” を含めると、プロンプトに “assword” を含むことになり、sshpass がデフォルトのまま利用可能。

因此,如果将密钥文件命名为”assword”,那么即使在ansible中也可以自动输入密码。

ansible-vault:vault-id 的提示

    • 暗号化された文字列のヘッダに label がついていても、vault-id-list に設定された ID のパスワードファイルを頭から順に試している模様。

 

    つまり、現バージョンでは、label は人間が識別するためのもので、ansible-vault プログラムにとっては、ほとんど意味をなしていない。(と思われる)

前提条件

操作系统环境

控制主机操作系统:Ubuntu 18.04
目标主机操作系统:Ubuntu 18.04 (docker)× 2

NAME="Ubuntu"
VERSION="18.04.3 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.3 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic

Python环境

(ansible) $ pip freeze
ansible==2.9.2
cffi==1.13.2
cryptography==2.8
Jinja2==2.10.3
MarkupSafe==1.1.1
passlib==1.7.2
pkg-resources==0.0.0
pycparser==2.19
PyYAML==5.2
six==1.13.0
(ansible) $

连接选项和连接环境的密码等相关信息。

接続先 IP addressssh 接続秘密鍵パスフレーズユーザ名&sudo 利用172.17.0.2公開鍵方式”privkey_passphrase“pubkeyuser

パスワード: “pubkeyuser_password“172.17.0.3パスワード入力-pwduser

パスワード: “pwduser_password

Ansible 环境 – Ansible Environment

安装 Ansible 的版本

(ansible) $ ansible --version
ansible 2.9.2
  config file = /home/luser/work/ansible.cfg
  configured module search path = ['/home/luser/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /home/luser/work/Python.d/envs/ansible/lib/python3.6/site-packages/ansible
  executable location = /home/luser/work/Python.d/envs/ansible/bin/ansible
  python version = 3.6.9 (default, Nov  7 2019, 10:44:02) [GCC 8.3.0]
(ansible) $

Ansible 主机文件

[hostgroup]
172.17.0.2
172.17.0.3

抑制Ansible的DEPRECATION WARNING。

为了抑制DEPRECATION WARNING,我们要在连接的主机上明确指定使用python3而不是python2,则在当前目录下放置如下的ansible.cfg文件。(虽然也可以设置deprecation_warnings=False,但不要让其他警告也消失)

ansible.cfg 文件

[defaults]
interpreter_python      = /usr/bin/python3

保密钥匙

将用于动作确认的秘密钥匙放置在当前目录中。

pubkeyuser_id_rsa 文件

(ansible) $ ls -l pubkeyuser_id_rsa
-rw------- 1 luser luser 1766 Jan 11 02:19 pubkeyuser_id_rsa

文件结构

(ansible) $ tree -a ./
./
|-- ansible.cfg
|-- host_vars
|   |-- 172.17.0.2.yml
|   `-- 172.17.0.3.yml
|-- hosts
|-- pubkeyuser_id_rsa
`-- pubkeyuser_id_rsa_assword -> pubkeyuser_id_rsa

1 directory, 6 files
(ansible) $

前提到此为止。


使用Ansible时的密码(口令)类型

    1. 通过ssh连接时的密码/密码短语

 

    通过sudo(变成)时的密码

SSH连接的密码/密码短语设置

参考文献:ssh – 通过ssh客户端二进制文件连接 – Ansible文档

在中国,SSH连接主要有以下两种方法进行。

    1. 使用公开密钥加密的连接

 

    使用PAM密码进行连接

使用公开密钥加密的连接。

(ansible) $ ssh -i ./pubkeyuser_id_rsa pubkeyuser@172.17.0.2
Enter passphrase for key './pubkeyuser_id_rsa':  ← ここで秘密鍵のパスフレーズを入力
Last login: Tue Jan  7 08:00:57 2020 from 172.17.0.1
$ id -a
uid=1001(pubkeyuser) gid=1001(pubkeyuser) groups=1001(pubkeyuser),27(sudo)
$ exit
Connection to 172.17.0.2 closed.
(ansible) $

Ansible连接如下所示。

(ansible) $ ansible -i hosts -u pubkeyuser --private-key pubkeyuser_id_rsa 172.17.0.2 -m ping
Enter passphrase for key 'pubkeyuser_id_rsa':  ← ここで秘密鍵のパスフレーズを入力
172.17.0.2 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
(ansible) $

使用ssh-agent/ssh-add

可以使用ssh-agent/ssh-add来避免输入密码。

当使用默认的连接插件时,Ansible不会提供一个通道来允许用户与ssh过程进行通信,手动输入密码以解密ssh密钥。强烈建议使用ssh-agent。

Ansible的文件中也强烈推荐使用ssh-agent。

(ansible) $ eval `ssh-agent`
Agent pid 3256
(ansible) $ echo $SSH_AUTH_SOCK
/tmp/ssh-dcXxsNEXR7zu/agent.3254
(ansible) $ ssh-add pubkeyuser_id_rsa
Enter passphrase for pubkeyuser_id_rsa:
Identity added: pubkeyuser_id_rsa (pubkeyuser_id_rsa)
(ansible) $ ssh-add -l
2048 SHA256:Skhwkjn4nNRdRzWxNZBRGSPamcZikVkeBVpPhtFzgXw pubkeyuser_id_rsa (RSA)
(ansible) $ ansible -i hosts -u pubkeyuser --private-key pubkeyuser_id_rsa 172.17.0.2 -m ping
172.17.0.2 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
(ansible) $

如果使用csh系列命令时,需要在命令中添加-c选项,如eval `ssh-agent -c`。

在批处理中设置密码口令。

只有在像批处理那样自动启动,无需人工干预的情况下,才需要进行设置,而不是交互式的。

使用 ssh-agent/ssh-add

    • ssh-agent は、(通常)ログアウトしてもプロセスが残り、ソケットが利用可能です。

 

    これを利用すると、非インタラクティブな処理でもパスワードの入力を省略できます。

当您从~/.bashrc(或直接在.bashrc中编写)调用以下的shell脚本时,您可以重复使用现有的进程。

#!/bin/sh

[ $(id -u) -eq 0 ] && exit 255

LANG=C
SSH_AGENT=ssh-agent
SSH_AGENT_SAVED=${SSH_AGENT_SAVED:-"${HOME}/.ssh/.${SSH_AGENT}"}

AGENT_ENV=""

if [ -f ${SSH_AGENT_SAVED} ]
then
        eval $(tail -1 ${SSH_AGENT_SAVED}) > /dev/null

        if (ps -fp ${SSH_AGENT_PID} | sed -e 's/  */ /g' | cut -d' ' -f 8 | grep '^ssh-agent$' > /dev/null)
        then
                AGENT_ENV=$(tail -1 ${SSH_AGENT_SAVED})
        else
                AGENT_ENV=$(${SSH_AGENT})
        fi
else
        AGENT_ENV=$(${SSH_AGENT})
fi

echo ${AGENT_ENV} | tee ${SSH_AGENT_SAVED}
chmod 0600 ${SSH_AGENT_SAVED}

可以加载ssh-agent的环境变量设置,以便使用ansible命令。

在非互动执行中,您仍需进行一些前处理,比如读取已执行的ssh-agent/ssh-add相关环境变量。值得推荐的一点是,您无需将密码本身保存在文件中。

使用sshpass

利用sshpass可以指定包含密码的文件并执行。

由于sshpass不是ansible的一部分,因此需要另外安装它。

(ansible) $ sudo apt install sshpass
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following NEW packages will be installed:
  sshpass
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
:
Processing triggers for man-db (2.8.3-2ubuntu0.1) ...
(ansible) $ ls -l ~/.ansible_rings/.pubkeyuser_passphrase
-rw------- 1 luser luser 19 Jan 12 21:00 /home/luser/.ansible_rings/.pubkeyuser_passphrase
(ansible) $ cat ~/.ansible_rings/.pubkeyuser_passphrase
privkey_passphrase
(ansible) $ sshpass -P "pubkeyuser_id_rsa':" -f ~/.ansible_rings/.pubkeyuser_passphrase ansible -i hosts -u pubkeyuser --private-key pubkeyuser_id_rsa 172.17.0.2 -m ping
172.17.0.2 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
(ansible) $ cat ~/.ansible_rings/.pubkeyuser_passphrase | sshpass -P "pubkeyuser_id_rsa':" -d 0 ansible -i hosts -u pubkeyuser --private-key pubkeyuser_id_rsa 172.17.0.2 -m ping
172.17.0.2 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
(ansible) $

如果要以非交互方式使用sshpass,请注意需要在某处明文保存密码短语。
sshpass期望将密码提示设置为”assword”,因此在输入私钥密码短语时需要使用-P选项来指定提示。

然而,Ansible并没有提供一种将参数传递给sshpass的方法。
因此,为了让”assword”出现在提示符上,我们将在私钥文件名中包含”assword”。

(ansible) $ ln -s pubkeyuser_id_rsa pubkeyuser_id_rsa_assword
(ansible) $ ls -l pubkeyuser_id_rsa pubkeyuser_id_rsa_assword
-rw------- 1 luser luser 1766 Jan 11 02:19 pubkeyuser_id_rsa
lrwxrwxrwx 1 luser luser   17 Jan 12 21:12 pubkeyuser_id_rsa_assword -> pubkeyuser_id_rsa
(ansible) $

通过ssh客户端二进制文件连接 – 查看Ansible文档中的密码行时,可以将其作为变量(var)。

变量:ansible_password
变量:ansible_ssh_pass
变量:ansible_ssh_password

有说明可以使用。
因此,将密码设置在主机172.17.0.2上。
(如下所述,最好不要使用“ansible_ssh_password”这个参数。)

---
# Remote User
ansible_ssh_user: pubkeyuser
# 秘密鍵
ansible_private_key_file: ./pubkeyuser_id_rsa_assword
# SSH 共通引数
ansible_ssh_common_args: "-o PubkeyAuthentication=yes -o PasswordAuthentication=no -o StrictHostKeyChecking=no"
# SSH 秘密鍵パスフレーズ
ansible_ssh_pass: 'privkey_passphrase'
(ansible) $ ansible 172.17.0.2 -m ping
172.17.0.2 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
(ansible) $

我能够在不输入密码的情况下执行操作。

使用PAM密码进行连接

希望避免使用登录密码进行连接,但由于某种原因有时必须使用用户密码进行ssh连接。
例如,在初始状态下,可能还没有复制公钥的情况。(如果可能的话,我希望在执行ansible之前注册公钥)

(ansible) $ ssh -o PubkeyAuthentication=no -o PasswordAuthentication=yes -o StrictHostKeyChecking=no pwduser@172.17.0.3 id -a
pwduser@172.17.0.3's password: ← "pwduser" のログインパスワードを入力
uid=1001(pwduser) gid=1001(pwduser) groups=1001(pwduser),27(sudo)
(ansible) $

在这种情况下,需要输入SSH密码。

(ansible) $ ansible --ssh-common-args="-o PubkeyAuthentication=no -o PasswordAuthentication=yes -o StrictHostKeyChecking=no" -i hosts -u pwduser 172.17.0.3 -m ping
172.17.0.3 | UNREACHABLE! => {
    "changed": false,
    "msg": "Failed to connect to the host via ssh: Permission denied (publickey,password).",
    "unreachable": true
}
(ansible) $

在Ansible中,通过指定-k选项,可以询问SSH密码。如果不使用此选项,就会出现上述错误。

(ansible) $ ansible --ssh-common-args="-o PubkeyAuthentication=no -o PasswordAuthentication=yes -o StrictHostKeyChecking=" -i hosts -u pwduser 172.17.0.3 -m ping -k
SSH password:
172.17.0.3 | FAILED! => {
    "msg": "to use the 'ssh' connection type with passwords, you must install the sshpass program"
}
(ansible) $

通过添加-k选项,会出现密码输入提示,但这次他要我们安装sshpass程序,以便使用密码的ssh连接类型。虽然在使用公钥连接时也会用到它,但sshpass并不是ansible的一部分,因此需要单独安装。

(ansible) $ sudo apt install sshpass
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following NEW packages will be installed:
  sshpass
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
:
Processing triggers for man-db (2.8.3-2ubuntu0.1) ...
(ansible) $

安装sshpass后,它将开始运行。

(ansible) $ ansible --ssh-common-args="-o PubkeyAuthentication=no -o PasswordAuthentication=yes -o StrictHostKeyChecking=no" -i hosts -u pwduser 172.17.0.3 -m ping -k
SSH password:
172.17.0.3 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
(ansible) $

在批处理中设置密码短语

与公开密钥的情况相同,在172.17.0.3.yml文件中设置变量。

---
# Remote User
ansible_ssh_user: pwduser
# パスワード認証の指定
ansible_ssh_common_args: '-o PreferredAuthentications=password -o PubkeyAuthentication=no -o PasswordAuthentication=yes -o StrictHostKeyChecking=no'
# 認証パスワード
ansible_ssh_pass: 'pwduser_password'
(ansible) $ ansible 172.17.0.3 -m ping
172.17.0.3 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
(ansible) $

不需要输入密码就能执行。

sudo (become) 时的密码

参考:sudo – 替代用户执行 – Ansible文档

根据 Ansible 文档中的「sudo – 替换用户执行」,密码的设置如下所示。

原始条目:
[sudo_become_plugin]
密码 = VALUE

env:ANSIBLE_BECOME_PASS
env:ANSIBLE_SUDO_PASS
var: ansible_become_password
var: ansible_become_pass
var: ansible_sudo_pass

重述条目:
[sudo_become_plugin]
密码 = VALUE

环境变量:ANSIBLE_BECOME_PASS
环境变量:ANSIBLE_SUDO_PASS
变量:ansible_become_password
变量:ansible_become_pass
变量:ansible_sudo_pass

使用变量”ansible_become_pass”,将其设置为”172.17.0.2.yml”和”172.17.0.3.yml”。

---
# Remote User
ansible_ssh_user: pubkeyuser
# 秘密鍵
ansible_private_key_file: ./pubkeyuser_id_rsa_assword
# SSH 共通引数
ansible_ssh_common_args: "-o PubkeyAuthentication=yes -o PasswordAuthentication=no -o StrictHostKeyChecking=no"
# SSH 秘密鍵パスフレーズ
ansible_ssh_pass: 'privkey_passphrase'

# become (sudo) パスワード
ansible_sudo_pass: 'pubkeyuser_password'
---
# Remote User
ansible_ssh_user: pwduser
# パスワード認証の指定
ansible_ssh_common_args: '-o PreferredAuthentications=password -o PubkeyAuthentication=no -o PasswordAuthentication=yes -o StrictHostKeyChecking=no'
# 認証パスワード
ansible_ssh_pass: 'pwduser_password'

# become (sudo) パスワード
ansible_sudo_pass: 'pwduser_password'

可以实现无需输入密码(非交互式)即可执行 become。

(ansible) $ ( set -x; for h in 172.17.0.2 172.17.0.3 hostgroup; do ansible $h -m command -a 'id -a'; ansible $h -m command -a 'id -a' -b; done )
+ for h in 172.17.0.2 172.17.0.3 hostgroup
+ ansible 172.17.0.2 -m command -a 'id -a'
172.17.0.2 | CHANGED | rc=0 >>
uid=1001(pubkeyuser) gid=1001(pubkeyuser) groups=1001(pubkeyuser),27(sudo)

+ ansible 172.17.0.2 -m command -a 'id -a' -b
172.17.0.2 | CHANGED | rc=0 >>
uid=0(root) gid=0(root) groups=0(root)

+ for h in 172.17.0.2 172.17.0.3 hostgroup
+ ansible 172.17.0.3 -m command -a 'id -a'
172.17.0.3 | CHANGED | rc=0 >>
uid=1001(pwduser) gid=1001(pwduser) groups=1001(pwduser),27(sudo)

+ ansible 172.17.0.3 -m command -a 'id -a' -b
172.17.0.3 | CHANGED | rc=0 >>
uid=0(root) gid=0(root) groups=0(root)

+ for h in 172.17.0.2 172.17.0.3 hostgroup
+ ansible hostgroup -m command -a 'id -a'
172.17.0.3 | CHANGED | rc=0 >>
uid=1001(pwduser) gid=1001(pwduser) groups=1001(pwduser),27(sudo)

172.17.0.2 | CHANGED | rc=0 >>
uid=1001(pubkeyuser) gid=1001(pubkeyuser) groups=1001(pubkeyuser),27(sudo)

+ ansible hostgroup -m command -a 'id -a' -b
172.17.0.3 | CHANGED | rc=0 >>
uid=0(root) gid=0(root) groups=0(root)

172.17.0.2 | CHANGED | rc=0 >>
uid=0(root) gid=0(root) groups=0(root)

(ansible) $

使用ansible-vault进行加密

参考资料:Ansible Vault — Ansible 文档

通过将密码/密码短语设置为各个变量,现在可以在不输入的情况下执行,但是明文保存密码/密码短语是不可取的。

因此,可以使用ansible-vault进行加密。
使用ansible-vault可以实现以下操作。

    • ファイル全体を暗号化する

 

    • key=value を暗号化する

 

    value 部分を暗号化する

在这里,我们将展示一个具体示例,即加密了第三个 value 部分的情况。请参考 “Ansible Vault — Ansible Documentation” 获取详细信息。

在 ansible-vault 中,有一个叫作 vault-id 的东西,在文档中描述得很难理解。

–vault-id オプションで、ID リスト (カンマ区切りで複数指定可) を提示し、–encrypt-vault-id オプションで、暗号化時の ID (label) を指定します。
vault-id の形式は、”label@パスワードファイル名” という形で、label とパスワードの記載されたファイル名の組み合わせになります。

我决定将ansible-vault的加密/解密密码设置在如下文件中。

(ansible) $ tree -a ~/.ansible_rings/
/home/luser/.ansible_rings/
|-- .vault_pass_sample.txt
|-- .vault_pass_sample1.txt
|-- .vault_pass_sample2.txt
|-- .vault_pass_sample3.txt
|-- .vault_pass_sample4.txt
`-- .vault_pass_sample_default.txt

0 directories, 6 files
(ansible) $
samplepassword
sample1password
sample2password
sample3password
sample4password
defaultPassword

然后,我们将在ansible.cfg中进行ansible-vault的配置。

[defaults]
interpreter_python      = /usr/bin/python3
# インベントリ
inventory               = hosts
# ansible-vault 関連
vault_identity          = sample
vault_encrypt_identity  = sample
vault_identity_list     = sample@~/.ansible_rings/.vault_pass_sample.txt,sample1@~/.ansible_rings/.vault_pass_sample1.txt,sample2@~/.ansible_rings/.vault_pass_sample2.txt,sample3@~/.ansible_rings/.vault_pass_sample3.txt,sample4@~/.ansible_rings/.vault_pass_sample4.txt,@~/.ansible_rings/.vault_pass_sample_default.txt

#[privilege_escalation]
## become (sudo)
#become                 = True

完成ansible.cfg配置后,将进行密码/密码短语的加密。

(ansible) $ ( set -x; ( while read n p s; do ansible-vault encrypt_string -v --encrypt-vault-id $s -n $n $p; done ) << EOT
ansible_ssh_pass privkey_passphrase sample1
ansible_sudo_pass pubkeyuser_password sample2
ansible_ssh_pass pwduser_password sample3
ansible_sudo_pass pwduser_password sample4
EOT
)
+ cat
+ read n p s
+ ansible-vault encrypt_string -v --encrypt-vault-id sample1 -n ansible_ssh_pass privkey_passphrase
Using /home/luser/work/Ansible.d/passwordtest.withVault/ansible.cfg as config file
ansible_ssh_pass: !vault |
          $ANSIBLE_VAULT;1.2;AES256;sample1
          31386662393263333631396165646631616139323064346631633931363563323330643035393366
          3132633136633734383665373135343833353835396461640a633132663862633130653735633436
          61613535333964383162373135383966643438303661326333303337656263626262303232333961
          3436656633316232310a636336323737323761346535613761623038623362636565633934656437
          30633462363565383035626165393832626465636161313932333866306266666638
Encryption successful
+ read n p s
+ ansible-vault encrypt_string -v --encrypt-vault-id sample2 -n ansible_sudo_pass pubkeyuser_password
Using /home/luser/work/Ansible.d/passwordtest.withVault/ansible.cfg as config file
ansible_sudo_pass: !vault |
          $ANSIBLE_VAULT;1.2;AES256;sample2
          34646236623634393565333836346238333662313466323762316462636637633735326330393261
          6335373233666334386362626661653363373563393763360a633161336663303737376535393638
          65333033333330326534643233336466363931336633643464373862653663316665373331616566
          3333343232306266350a656464363232376661626135613063333032353037376333323830363538
          35333362353534376664613736343765373862333631346338656634383262373935
Encryption successful
+ read n p s
+ ansible-vault encrypt_string -v --encrypt-vault-id sample3 -n ansible_ssh_pass pwduser_password
Using /home/luser/work/Ansible.d/passwordtest.withVault/ansible.cfg as config file
ansible_ssh_pass: !vault |
          $ANSIBLE_VAULT;1.2;AES256;sample3
          39623031313762626535383264623838613435306233323863363466363231663265363230653666
          3739666333396133313332613563626238323665636638300a653433303139373734326562633735
          36303536366533323665623436633939393138393064633435383063366531373662343339643631
          6263386465663838630a623365383336373536343039343663393662396162613433646132373438
          61326165326566373761613831663961363237376563653863666330336330396139
Encryption successful
+ read n p s
+ ansible-vault encrypt_string -v --encrypt-vault-id sample4 -n ansible_sudo_pass pwduser_password
Using /home/luser/work/Ansible.d/passwordtest.withVault/ansible.cfg as config file
ansible_sudo_pass: !vault |
          $ANSIBLE_VAULT;1.2;AES256;sample4
          62346235306363343334653464653235373632386165383735343038313765633133376462663737
          3532323962316536663333363366666432383832323531340a336132376130326430633765333566
          66336238653038366233323834383862303262336435623039316135613139303862306133646562
          3162393332343931370a366365666564326462396365376434353234353661353763626465383734
          65383938383535356137313531613631646366363231393737656266383134353239
Encryption successful
+ read n p s
(ansible) $

如果要将其写入文件,可以使用 –output 选项;在上面已经将其显示在标准输出中了。

将每个输出设置为一个变量。

---
# Remote User
ansible_ssh_user: pubkeyuser
# 秘密鍵
ansible_private_key_file: ./pubkeyuser_id_rsa_assword
# SSH 共通引数
ansible_ssh_common_args: "-o PubkeyAuthentication=yes -o PasswordAuthentication=no -o StrictHostKeyChecking=no"
# SSH 秘密鍵パスフレーズ
#ansible_ssh_pass: 'privkey_passphrase'
ansible_ssh_pass: !vault |
                  $ANSIBLE_VAULT;1.2;AES256;sample1
                  31386662393263333631396165646631616139323064346631633931363563323330643035393366
                  3132633136633734383665373135343833353835396461640a633132663862633130653735633436
                  61613535333964383162373135383966643438303661326333303337656263626262303232333961
                  3436656633316232310a636336323737323761346535613761623038623362636565633934656437
                  30633462363565383035626165393832626465636161313932333866306266666638

# become (sudo) パスワード
#ansible_sudo_pass: 'pubkeyuser_password'
ansible_sudo_pass: !vault |
                   $ANSIBLE_VAULT;1.2;AES256;sample2
                   34646236623634393565333836346238333662313466323762316462636637633735326330393261
                   6335373233666334386362626661653363373563393763360a633161336663303737376535393638
                   65333033333330326534643233336466363931336633643464373862653663316665373331616566
                   3333343232306266350a656464363232376661626135613063333032353037376333323830363538
                   35333362353534376664613736343765373862333631346338656634383262373935
---
# Remote User
ansible_ssh_user: pwduser
# パスワード認証の指定
ansible_ssh_common_args: '-o PreferredAuthentications=password -o PubkeyAuthentication=no -o PasswordAuthentication=yes -o StrictHostKeyChecking=no'
# 認証パスワード
#ansible_ssh_pass: 'pwduser_password'
ansible_ssh_pass: !vault |
                  $ANSIBLE_VAULT;1.2;AES256;sample3
                  39623031313762626535383264623838613435306233323863363466363231663265363230653666
                  3739666333396133313332613563626238323665636638300a653433303139373734326562633735
                  36303536366533323665623436633939393138393064633435383063366531373662343339643631
                  6263386465663838630a623365383336373536343039343663393662396162613433646132373438
                  61326165326566373761613831663961363237376563653863666330336330396139

# become (sudo) パスワード
#ansible_sudo_pass: 'pwduser_password'
ansible_sudo_pass: !vault |
                   $ANSIBLE_VAULT;1.2;AES256;sample4
                   62346235306363343334653464653235373632386165383735343038313765633133376462663737
                   3532323962316536663333363366666432383832323531340a336132376130326430633765333566
                   66336238653038366233323834383862303262336435623039316135613139303862306133646562
                   3162393332343931370a366365666564326462396365376434353234353661353763626465383734
                   65383938383535356137313531613631646366363231393737656266383134353239
(ansible) $ ( set -x; for h in 172.17.0.2 172.17.0.3 hostgroup; do ansible $h -m command -a 'id -a'; ansible $h -m command -a 'id -a' -b; done )
+ for h in 172.17.0.2 172.17.0.3 hostgroup
+ ansible 172.17.0.2 -m command -a 'id -a'
172.17.0.2 | CHANGED | rc=0 >>
uid=1001(pubkeyuser) gid=1001(pubkeyuser) groups=1001(pubkeyuser),27(sudo)

+ ansible 172.17.0.2 -m command -a 'id -a' -b
172.17.0.2 | CHANGED | rc=0 >>
uid=0(root) gid=0(root) groups=0(root)

+ for h in 172.17.0.2 172.17.0.3 hostgroup
+ ansible 172.17.0.3 -m command -a 'id -a'
172.17.0.3 | CHANGED | rc=0 >>
uid=1001(pwduser) gid=1001(pwduser) groups=1001(pwduser),27(sudo)

+ ansible 172.17.0.3 -m command -a 'id -a' -b
172.17.0.3 | CHANGED | rc=0 >>
uid=0(root) gid=0(root) groups=0(root)

+ for h in 172.17.0.2 172.17.0.3 hostgroup
+ ansible hostgroup -m command -a 'id -a'
172.17.0.2 | CHANGED | rc=0 >>
uid=1001(pubkeyuser) gid=1001(pubkeyuser) groups=1001(pubkeyuser),27(sudo)

172.17.0.3 | CHANGED | rc=0 >>
uid=1001(pwduser) gid=1001(pwduser) groups=1001(pwduser),27(sudo)

+ ansible hostgroup -m command -a 'id -a' -b
172.17.0.2 | CHANGED | rc=0 >>
uid=0(root) gid=0(root) groups=0(root)

172.17.0.3 | CHANGED | rc=0 >>
uid=0(root) gid=0(root) groups=0(root)

(ansible) $

推荐使用ssh-agent/ssh-add来管理ssh的密码,并且建议使用ansible-vault对become(sudo)密码进行加密,并且严格保管包含解密密码的文件。

SSH密码设置的提示

(Note: This translation is in Simplified Chinese)

ssh – connect via ssh client binary — Ansible Documentation の password の説明では、変数名として ansible_ssh_password が使えるように記載されているが、ansible_ssh_pass と ansible_password のみが実装されており、ansible_ssh_password は実装されていない。

变量:ansible密码
变量:ansible SSH密码
变量:ansible SSH密码

    以下の修正を加えれば使用できるようになるが、回避策(ansible_ssh_pass か ansible_password を使用する)があるのと、まとめようという issue もあるで、修正されるかどうかは不明。
*** constants.py.orig   2019-12-04 23:10:58.000000000 +0000
--- constants.py        2020-01-10 05:16:07.520928899 +0000
***************
*** 140,146 ****
      # connection common
      remote_addr=('ansible_ssh_host', 'ansible_host'),
      remote_user=('ansible_ssh_user', 'ansible_user'),
!     password=('ansible_ssh_pass', 'ansible_password'),
      port=('ansible_ssh_port', 'ansible_port'),
      pipelining=('ansible_ssh_pipelining', 'ansible_pipelining'),
      timeout=('ansible_ssh_timeout', 'ansible_timeout'),
--- 140,146 ----
      # connection common
      remote_addr=('ansible_ssh_host', 'ansible_host'),
      remote_user=('ansible_ssh_user', 'ansible_user'),
!     password=('ansible_ssh_password', 'ansible_ssh_pass', 'ansible_password'),
      port=('ansible_ssh_port', 'ansible_port'),
      pipelining=('ansible_ssh_pipelining', 'ansible_pipelining'),
      timeout=('ansible_ssh_timeout', 'ansible_timeout'),
一般来说,通过使用登录密码进行连接输入的密码和通过sudo提升至管理权限的密码是相同的,因此如果登录密码泄露,目标服务器上的管理员权限就会受到攻击的风险增加。我们建议将用于登录的密码/密码短语和用于权限提升的sudo密码分开(即尽量不要使用登录密码进行登录)。
广告
将在 10 秒后关闭
bannerAds