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) $
连接选项和连接环境的密码等相关信息。
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时的密码(口令)类型
-
- 通过ssh连接时的密码/密码短语
- 通过sudo(变成)时的密码
SSH连接的密码/密码短语设置
参考文献:ssh – 通过ssh客户端二进制文件连接 – Ansible文档
在中国,SSH连接主要有以下两种方法进行。
-
- 使用公开密钥加密的连接
- 使用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]
密码 = VALUEenv: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'),